Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinAPI основы основ, и на 100 шагов вперед 
:(
    Опции темы
cupper
Дата 30.3.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



немогу понять принцып разработки на WinAPI. Изучение начал с книжки Эффективное программирование на WinAPI, но щас нахожусь в замешательстве. Про основы основ понятно, непонятно про то как с ними дальше работать. 
К примеру функция обратного вызова callback, мы создаем и привязываем одну для главного окна, и работаем в ней, но если в этом окне у нас есть еще окна, то для них нужны свои функции или таже самая ?

С чего все начилось:
нужно элементарный интерфейс для программы написать: Главное окно, в нем поле 28на28 пикселей в котором можно рисовать, под ним кнопка, под ней текстовое поле вывода. И вот непонимаю как мне связать все это воедино, чтобы все работало по такому процессу: Запускаем программу, рисуем в окне 28на28 чтолибо, потом нажимаем на кнопку, то что было нарисовано в окне считывает куданибуть, мы с ним проводим ряд действий и в текстовое поле выводим какойто результат. 

Если кому нелень набросайте варианьты как это реализуеться чтоб я мог понять от чего отталкивать и искать то что нужно, а то я незнаю с какой стороны подойти :(
Может кто знает хорошие ресурсы где про вин апи написано вроде как для начинающих но с точки зрения реальных задач.
PM MAIL   Вверх
GoldFinch
Дата 30.3.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



1 класс окна -  1 функция
ловишь wm_mousemove для рисования, и wm_command для нажатия кнопки
все есть в мсдн, примеры тоже
PM MAIL ICQ   Вверх
cupper
Дата 1.4.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(GoldFinch @ 30.3.2009,  13:15)
1 класс окна -  1 функция
ловишь wm_mousemove для рисования, и wm_command для нажатия кнопки
все есть в мсдн, примеры тоже

наверно я непроально описал проблему.

Как создать в главном окне еще одно окно чтобы в том можно было рисовать
Вот что есть
Код

#include <windows.h>

#define ID_BUTTON_1 200
#define ID_PAINT_1 300

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "NeuroBP";
char szClassNamePaint[] = "Paint";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd, hBut, hPaint;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_HREDRAW | CS_VREDRAW/*CS_DBLCLKS*/;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_ERROR);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = CreateSolidBrush (RGB(235, 235, 235));

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
            0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "ANN: Recognition of numbers",       /* Title Text */
           WS_OVERLAPPED|WS_CAPTION
           |WS_MINIMIZEBOX|WS_SYSMENU, /* без возможности изменения размера окна */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    if (hwnd==NULL){
       MessageBox(NULL,"Не могу создать главное окно","Ошибка",MB_OK | MB_ICONSTOP);
       return -1;
        }
    hPaint = CreateWindowEx(
           0,
           szClassName,
           "",
           WS_BORDER | WS_CHILD | WS_VISIBLE,
           10, 10, 38, 38,
           hwnd,
           HMENU(ID_PAINT_1),
           hThisInstance, 
           NULL);
    if (hPaint==NULL){
       MessageBox(NULL,"Не могу создать окно для рисования","Ошибка",MB_OK | MB_ICONSTOP);
       return -1;
    }
    hBut = CreateWindowEx(
           0,
           "button", 
           "Распознать", 
           WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
           100, 100, 100, 30, // Ширина и высота окна
           hwnd, // Хендл родительского окна
           HMENU(ID_BUTTON_1), 
           hThisInstance, 
           NULL);
    if (hBut==NULL){
       MessageBox(NULL,"Не могу создать новую кнопку","Ошибка",MB_OK | MB_ICONSTOP);
       return -1;
}
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_CLOSE:
             int userReply;
             userReply = MessageBox(hwnd, "Закрыть приложение?","", MB_YESNO | MB_ICONQUESTION);
             if (IDYES == userReply)
             DestroyWindow(hwnd);
             break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

я уверен что сделал неправельно, поправьте.
Немогу понять почему окно hPaint таковаже цвета как и главное окно, хотя задаю другой. И можно канибуть равку вокруг него сделать не проста черной полосой а чтонибуть поярковыраженней, впуклось чтоли какуюниьуть
А вот значит примерный код для рисования 
Код

case WM_CREATE:
        hDC = GetDC(hWnd);
        break;

    case WM_LBUTTONDOWN: 
        bTracking = TRUE;
        // начальная позиция
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        MoveToEx(hDC, x, y, NULL);
        curve.push_back(Point(x, y));
        break; 
 
    case WM_LBUTTONUP:
        if (bTracking) {
            bTracking = FALSE; 
            curves.push_back(curve);
            curve.clear();
        }
        break; 
 
    case WM_MOUSEMOVE: 
        if (bTracking) {
            // новая позиция
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            LineTo(hDC, x, y);
            curve.push_back(Point(x, y));
        } 
        break;
.....

Его нужно реализовать в функции каллбак для дочернего окна  hPaint или достаточно изменить в главной функции код
Код

case WM_CREATE:
        hDC = GetDC(hWnd);
        break;

на 
Код

case WM_CREATE:
        hDC = GetDC(hPaint);
        break;

?

Это сообщение отредактировал(а) cupper - 1.4.2009, 21:23
PM MAIL   Вверх
jonie
Дата 1.4.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

 И можно канибуть равку вокруг него сделать не проста черной полосой а чтонибуть поярковыраженней, впуклось чтоли какуюниьуть
нарисовать два прямоугольника, один шире и уже на 2px будет (т.е. с каждой стороны -1px отличие от основного прямоугольника).

у тебя два окна, но одна процедура обработки сообщений для него. а в ней ты никак не идентифируешь само окно и его цвет не меняешь. Где ты его меняешь-то?


есть вообще говоря такая штука как субклассинг и суперклассинг....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GoldFinch
Дата 2.4.2009, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



а зачем 2 окна? рисуй на поверхности главного %)
PM MAIL ICQ   Вверх
cupper
Дата 2.4.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



ну я думал 2 окна логичсески правильно если рисовать нужно не проста на территории главного, а в какойто его ограниченной плоскости. 
Кстати я чета совсем неподумал о том чтобы вместо второго испольщовать проста нарисованый квадрат и сохранять координаты рисунка относительно этого квадрата, чтобы получилось какбытто это окно внутри окна, над попробывать сделать так. 
А как сделать впукорст (утопленность) прямоугольника ?
PM MAIL   Вверх
GoldFinch
Дата 2.4.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



cupper, выпуклость и т.п. рисуется темными и светлыми уголками
но вообще для этого есть STATIC
PM MAIL ICQ   Вверх
cupper
Дата 2.4.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



а почему ето 
Код

    case WM_COMMAND:
         temp.x = LOWORD(wParam); 
         temp.y = HIWORD(wParam); 
         // Parse the menu selections:
         if ((temp.x == ID_BUTTON_CLEAR)&&(temp.y == BN_CLICKED)){
            curves.clear();
            UpdateWindow(hwnd);
         }

не вызывает немедленно обновление содердимого окна, т.е. UpdateWindow(hwnd) неработает О_о

---------------
проблема была решена написанием вместо UpdateWindows () InvalidateRect(hwnd, &PS, true), но вопрос в силе, почему первое неработает ?

Это сообщение отредактировал(а) cupper - 2.4.2009, 23:20
PM MAIL   Вверх
Earnest
Дата 3.4.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Потому что UpdateWindow просто посылает WM_PAINT невалидным регионам. Для этого нужно, что бы они были!
Именно Invalidate помечает регионы как нуждающиеся в перерисовке. Invalidate, кстати, вызывает вовсе не немедленное обновление. Немедленное будет, если после Invalidate вызвать Update. Но это редко когда действительно нужно.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.