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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений от нескольких дочерних окон 
:(
    Опции темы
Ann1717
Дата 29.9.2015, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Имеется программа, в главном окне 3 кнопки, по нажатию открывается одно из 3х дочерних окон. Нужно, чтобы каждое окно выполняло разные функции, в моем случае, рисовались 3 разные геометрические фигуры. Не могу понять, как обращаться к нужному окну, может выполнять проверку на активное окно или как? Помогите, пожалуйста разобраться

Код


// Win32Project10.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "Win32Project10.h"
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
#define CIRCLE_CX 150.0
#define CIRCLE_CY 150.0
#define CIRCLE_BIG_RADIUS 100.0
#define CIRCLE_SMALL_RADIUS 40.0
#define ANGLE_COUNT 5
#define ID_BUTTON1 100
#define ID_BUTTON2 200
#define ID_BUTTON3 300
using namespace std;

// --- Описание функции главного окна
LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)
LRESULT CALLBACK popup_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)
LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)
HINSTANCE hInst;
// --- Глобальные переменные


TCHAR main_ClassName[] = L"MainWindows"; // Название класса окна
TCHAR child_ClassName[] = L"ChildWindows";

TCHAR main_app_name[] = L"OVERLAPPEDWINDOW"; // Название класса окна
TCHAR popup_app_name[] = L"POPUPWINDOW";
TCHAR child_app_name[] = L"CHILDWINDOW";

// --- Функция WinMain
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS main_wc, popup_wc, child_wc;

HWND main_hWnd;
MSG msg;
memset(&main_wc, 0, sizeof(main_wc));
memset(&popup_wc, 0, sizeof(popup_wc));
memset(&child_wc, 0, sizeof(child_wc));

main_wc.lpszClassName = main_ClassName;
main_wc.lpfnWndProc = (WNDPROC)main_WndProc;
main_wc.style = CS_HREDRAW | CS_VREDRAW;//стили класса окна Перерисовывает все окно , если регулятор движения или размер изменения высоты клиентской области.
main_wc.hInstance = hInstance;
main_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
main_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
main_wc.hbrBackground = CreateSolidBrush(RGB(20, 150, 1000));
main_wc.lpszMenuName = NULL;
main_wc.cbClsExtra = 0;
main_wc.cbWndExtra = 0;
RegisterClass(&main_wc);

child_wc.lpszClassName = child_ClassName;
child_wc.lpfnWndProc = (WNDPROC)child_WndProc;
child_wc.style = CS_HREDRAW | CS_VREDRAW;
child_wc.hInstance = hInstance;
child_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
child_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
child_wc.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));
child_wc.lpszMenuName = NULL;
child_wc.cbClsExtra = 0;
child_wc.cbWndExtra = 0;
RegisterClass(&child_wc);
//WS_OVERLAPPEDWINDOW^WS_MINIMIZEBOX^WS_MAXIMIZEBOX
main_hWnd = CreateWindow(
main_ClassName, // Имя класса окон
main_app_name, // Заголовок окна 
WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN, // Стиль окна 
CW_USEDEFAULT, // X-координаты 
CW_USEDEFAULT, // Y-координаты 
CW_USEDEFAULT, // Ширина окна
CW_USEDEFAULT, // Высота окна
NULL, // Дескриптор окна-родителя
NULL, // Дескриптор меню окна
hInstance, // Дескриптор экземпляра приложения
NULL); // Дополнительная информация
if (main_hWnd == 0)
{
return FALSE;
}
ShowWindow(main_hWnd, nCmdShow);
UpdateWindow(main_hWnd);


while (GetMessage(&msg, NULL, 0, 0)) //(NULL - дикриптор окна из которого принимать сообщения) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam; // возвращает значение последнего обработанного сообщения
}

// --- Функция окна
LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;    

HWND hButton, hButton1, hButton2;
switch (msg)
{
case WM_CREATE:
hButton = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_PUSHBUTTON, 400, 12, 200, 150, hWnd, (HMENU)ID_BUTTON1, hInst, NULL);
hButton1 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 162, 200, 150, hWnd, (HMENU)ID_BUTTON2, hInst, NULL);
hButton2 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 312, 200, 150, hWnd, (HMENU)ID_BUTTON3, hInst, NULL);

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
if (LOWORD(wParam) == ID_BUTTON1)
{
HWND child_hWnd = CreateWindow(child_ClassName, _T("Child1"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS, 20, 30, 300, 300, hWnd, NULL, hInst, NULL);
ShowWindow(child_hWnd, SW_NORMAL);
UpdateWindow(child_hWnd);
break;
}
if (LOWORD(wParam) == ID_BUTTON2)
{
HWND child_hWnd2 = CreateWindow(child_ClassName, _T("Child2"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 700, 200, 400, 400, hWnd, NULL, hInst, NULL);
ShowWindow(child_hWnd2, SW_NORMAL);
UpdateWindow(child_hWnd2);
break;
}
if (LOWORD(wParam) == ID_BUTTON3)
{
HWND child_hWnd3 = CreateWindow(child_ClassName, _T("Child3"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 400, 300, 400, 400, hWnd, NULL, hInst, NULL);
ShowWindow(child_hWnd3, SW_NORMAL);
UpdateWindow(child_hWnd3);
break;
}
switch (wParam)
{


}


case WM_PAINT:
{


}; break;


case WM_DESTROY:
{
PostQuitMessage(0);
}; break;



return 0l;
}

LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{




case WM_DESTROY:
{
PostQuitMessage(0);
}; break;

case WM_MOVE:
{
InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd);
}break;

default: return DefWindowProc(hWnd, msg, wParam, lParam); //реализует поведение по умолчанию типичного окна верхнего уровня. 
}
return 0l;
}


Это сообщение отредактировал(а) xvr - 29.9.2015, 11:14
PM MAIL   Вверх
xvr
Дата 29.9.2015, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Для начала - оформляйте код как код, а не как простыню текста. Уважайте тех, кто это будет читать (и возможно помогать вам).

По сути вопроса - есть как минимум 2 варианта:
  •  Сделать разные окна (разные классы и разные оконные процедуры)
  •  Передать окну при создании дополнительный параметр, по которому оконная процедура будет разбираться, что нужно рисовать. См. SetWindowLongPtr с параметром GWLP_USERDATA

PM MAIL   Вверх
Ann1717
Дата 29.9.2015, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @ 29.9.2015,  11:19)
Для начала - оформляйте код как код, а не как простыню текста. Уважайте тех, кто это будет читать (и возможно помогать вам).

По сути вопроса - есть как минимум 2 варианта:




  •  Сделать разные окна (разные классы и разные оконные процедуры)



  •  Передать окну при создании дополнительный параметр, по которому оконная процедура будет разбираться, что нужно рисовать. См. SetWindowLongPtr с параметром GWLP_USERDATA




спасибо, код почистила, извините))
все работает
Код

#include "stdafx.h"
#include "Win32Project10.h"
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
#define CIRCLE_CX 150.0
#define CIRCLE_CY 150.0
#define CIRCLE_BIG_RADIUS 100.0
#define CIRCLE_SMALL_RADIUS 40.0
#define ANGLE_COUNT 5
#define ID_BUTTON1 100
#define ID_BUTTON2 200
#define ID_BUTTON3 300
#define ID_CHILD1 1500
#define ID_CHILD2 1501

// --- Описание функции главного окна
LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)
LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)

HINSTANCE  hInst;
// --- Глобальные переменные


TCHAR main_ClassName[] = L"MainWindows";      // Название класса окна
TCHAR child_ClassName[] = L"ChildWindows";


TCHAR main_app_name[] = L"OVERLAPPEDWINDOW";      // Название класса окна
TCHAR popup_app_name[] = L"POPUPWINDOW";
TCHAR child_app_name[] = L"CHILDWINDOW";

// --- Функция WinMain
int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
{
    WNDCLASS main_wc, popup_wc, child_wc, child_wc1;

    HWND main_hWnd;
    MSG msg;
    memset(&main_wc, 0, sizeof(main_wc));
    memset(&popup_wc, 0, sizeof(popup_wc));
    memset(&child_wc, 0, sizeof(child_wc));
    

    main_wc.lpszClassName = main_ClassName;
    main_wc.lpfnWndProc = (WNDPROC)main_WndProc;
    main_wc.style = CS_HREDRAW | CS_VREDRAW;//стили класса окна Перерисовывает все окно , если регулятор движения или размер изменения высоты клиентской области.
    main_wc.hInstance = hInstance;
    main_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    main_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    main_wc.hbrBackground = CreateSolidBrush(RGB(20, 150, 1000));
    main_wc.lpszMenuName = NULL;
    main_wc.cbClsExtra = 0;
    main_wc.cbWndExtra = 0;
    RegisterClass(&main_wc);

    child_wc.lpszClassName = child_ClassName;
    child_wc.lpfnWndProc = (WNDPROC)child_WndProc;
    child_wc.style = CS_HREDRAW | CS_VREDRAW;
    child_wc.hInstance = hInstance;
    child_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    child_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    child_wc.hbrBackground = CreateSolidBrush(RGB(0, 255, 0));
    child_wc.lpszMenuName = NULL;
    child_wc.cbClsExtra = 0;
    child_wc.cbWndExtra = 0;
    RegisterClass(&child_wc);

    
    main_hWnd = CreateWindow(
        main_ClassName,             // Имя класса окон
        main_app_name,          // Заголовок окна 
        WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN,        // Стиль окна  
        CW_USEDEFAULT,          // X-координаты 
        CW_USEDEFAULT,          // Y-координаты 
        CW_USEDEFAULT,          // Ширина окна
        CW_USEDEFAULT,          // Высота окна
        NULL,           // Дескриптор окна-родителя
        NULL,           // Дескриптор меню окна
        hInstance,      // Дескриптор экземпляра приложения
        NULL);      // Дополнительная информация
    if (main_hWnd == 0)
    {
        return FALSE;
    }
    ShowWindow(main_hWnd, nCmdShow);
    UpdateWindow(main_hWnd);


    while (GetMessage(&msg, NULL, 0, 0)) //(NULL - дикриптор окна из которого принимать сообщения) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam; // возвращает значение последнего обработанного сообщения
}

// --- Функция окна
LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;    
    PAINTSTRUCT ps;
    HDC hdc;
    HWND hButton, hButton1, hButton2;
    switch (msg)
    {
    case WM_CREATE:
        hButton = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_PUSHBUTTON, 400, 12, 200, 150, hWnd, (HMENU)ID_BUTTON1, hInst, NULL);
        hButton1 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 162, 200, 150, hWnd, (HMENU)ID_BUTTON2, hInst, NULL);
        hButton2 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 312, 200, 150, hWnd, (HMENU)ID_BUTTON3, hInst, NULL);
    
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        if (LOWORD(wParam) == ID_BUTTON1)
        {
            HWND child_hWnd1 = CreateWindow(child_ClassName, _T("Child1"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 20, 30, 300, 300, hWnd, (HMENU)ID_CHILD1, hInst, NULL);
            ShowWindow(child_hWnd1, SW_NORMAL);
            UpdateWindow(child_hWnd1);
            SetWindowLongPtr(child_hWnd1, GWLP_USERDATA, (LONG)child_WndProc);
            break;
        }
        if (LOWORD(wParam) == ID_BUTTON2)
        {
            HWND child_hWnd2 = CreateWindow(child_ClassName1, _T("Child2"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 700, 200, 400, 400, hWnd, (HMENU)ID_CHILD2, hInst, NULL);
            ShowWindow(child_hWnd2, SW_NORMAL);
            UpdateWindow(child_hWnd2);
            break;
        }
        if (LOWORD(wParam) == ID_BUTTON3)
        {
            HWND child_hWnd3 = CreateWindow(child_ClassName, _T("Child3"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 400, 300, 400, 400, hWnd, NULL, hInst, NULL);
            ShowWindow(child_hWnd3, SW_NORMAL);
            UpdateWindow(child_hWnd3);
            break;
        }
        switch (wParam)
        {

    
        }
    

        case WM_PAINT:
        {

                        // PAINTSTRUCT ps;
                        // EndPaint(hWnd, &ps);
        }; break;


        case WM_DESTROY:
        {
                           PostQuitMessage(0);
        }; break;


        default: return DefWindowProc(hWnd, msg, wParam, lParam);
        }
        return 0l;
    }

LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    

    PAINTSTRUCT ps;
    HDC hdc;
    switch (msg)
    {

    case WM_PAINT:
    
    {   
                     LONG whatToDraw=GetWindowLongPtr(child_hWnd1, GWLP_USERDATA)
                
                    
                         hdc = BeginPaint(hWnd, &ps);
                     POINT oldpoint;
                     HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)), hOldPen;
                     HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)), hOldBrush;
                     hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
                     hOldPen = (HPEN)SelectObject(hdc, hPen);

                     double shift = 360.0 / ANGLE_COUNT;
                     double dbshift = shift / 2.0;
                     double x = -180.0;
                     MoveToEx(hdc, CIRCLE_CX + CIRCLE_BIG_RADIUS*sin(double(x*M_PI) / 180.0), CIRCLE_CY + CIRCLE_BIG_RADIUS*cos(double(x*M_PI) / 180.0), &oldpoint);
                     for (; x <= 180.0; x += shift){
                         LineTo(hdc, CIRCLE_CX + CIRCLE_BIG_RADIUS*sin(double(x*M_PI) / 180.0), CIRCLE_CY + CIRCLE_BIG_RADIUS*cos(double(x*M_PI) / 180.0));
                         LineTo(hdc, CIRCLE_CX + CIRCLE_SMALL_RADIUS*sin(double((x + dbshift)*M_PI) / 180.0), CIRCLE_CY + CIRCLE_SMALL_RADIUS*cos(double((x + dbshift)*M_PI) / 180.0));
                     }
                     ExtFloodFill(hdc, CIRCLE_CX, CIRCLE_CY, RGB(255, 0, 0), FLOODFILLBORDER);
                     MoveToEx(hdc, oldpoint.x, oldpoint.y, &oldpoint);
                     SelectObject(hdc, hOldPen);
                     DeleteObject(hPen);
                     SelectObject(hdc, hOldBrush);
                     DeleteObject(hBrush);
                     EndPaint(hWnd, &ps);
                     break;
    
                    
    }
    }
    
    switch (msg)
    {



    case WM_DESTROY:
    {
                       PostQuitMessage(0);
    }; break;

    case WM_MOVE:
    {
                    InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd);
    }break;

    default: return DefWindowProc(hWnd, msg, wParam, lParam); //реализует поведение по умолчанию типичного окна верхнего уровня. 
    }
    return 0l;
}


Это сообщение отредактировал(а) feodorv - 29.9.2015, 15:27
PM MAIL   Вверх
feodorv
Дата 29.9.2015, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Ann1717, я за Вас искренне рад, но всё-таки:
Цитата(xvr @  29.9.2015,  11:19 Найти цитируемый пост)
Для начала - оформляйте код как код, а не как простыню текста. Уважайте тех, кто это будет читать (и возможно помогать вам).




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.2650 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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