Дочерние окна предопределённых классов
Создаю без использования ресурсов, динамически, с использованием функции CreateWindow.
Вопрос: как мне обрабатывать сообщения от этого дочернего окна?
Ведь в оконную функцию родительского окна не попадают сообщения от дочернего окна,
а оконную функцию дочернего окна я явным образом не объявляю - окно-то предопределённого класа.
Где обрабатывать сообщения?
ну сделай сначала родительское окно и её оконную процедуру, создавая свои дочерние окна, указывай им своё род.окно.
Цитата: Kuzya
ну сделай сначала родительское окно и её оконную процедуру, создавая свои дочерние окна, указывай им своё род.окно.
Ты не понял, Кузя.
Создать создать родительское окно - не проблема:
Код:
MainWindow=CreateWindow (WndClass.lpszClassName,"",
WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
NULL,NULL,Instance,NULL);
WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
NULL,NULL,Instance,NULL);
Код:
ChildWindow=CreateWindow ("COMBOBOX","",
WS_CHILD | WS_VISIBLE,
0,0,50,100,
MainWindow,NULL,Instance,NULL);
WS_CHILD | WS_VISIBLE,
0,0,50,100,
MainWindow,NULL,Instance,NULL);
В оконной функции главного окно не получится - туда не попадают сообщения от дочернего окна.
Оконной функции дочернего окна у меня в коде нет, она где-то в системе, потому что окно предопределённого класса.
В оконной процедуре главного окна добавляем:
Код:
case WM_COMMAND:
{
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
HWND h = (HWND)lParam;
switch (wmId)
{
//...
// обрабатываем другие команды
//...
case 0:
switch(wmEvent)
{
case CBN_SELCHANGE :
{
int cbindex=ComboBox_GetCurSel((HWND)lParam);
char buf[128];
// Выводим индекс:
itoa(cbindex, buf, 16);
MessageBoxA(NULL, buf, "Combo index", MB_OK);
// Выводим текст:
ComboBox_GetLBText((HWND)lParam,cbindex,buf);
MessageBoxW(NULL,(LPCWSTR)buf, L"Combo text", MB_OK);
break;
}
default:
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
{
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
HWND h = (HWND)lParam;
switch (wmId)
{
//...
// обрабатываем другие команды
//...
case 0:
switch(wmEvent)
{
case CBN_SELCHANGE :
{
int cbindex=ComboBox_GetCurSel((HWND)lParam);
char buf[128];
// Выводим индекс:
itoa(cbindex, buf, 16);
MessageBoxA(NULL, buf, "Combo index", MB_OK);
// Выводим текст:
ComboBox_GetLBText((HWND)lParam,cbindex,buf);
MessageBoxW(NULL,(LPCWSTR)buf, L"Combo text", MB_OK);
break;
}
default:
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
Но думаю, идея понятна.
Для диалоговых окон работает WM_COMMAND. А для обычных окон, по-моему, нет. Проверю.
создавать динамические окна при этом не понимать "зачем" они, мне кажется нонсенсом, даже когда окна создаются динамически, нужно для них "запасти" - идентификаторы, код для обработки их сообщений, в общем, мы должны понять что тебе надо и чего ты хочешь, тогда и поможем.
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.
Код:
switch (Message)
{...
case WM_COMMAND:
switch (LOWORD (WP))
{case COMMAND1:
...
break;
case COMMAND2:
..
break;
case 0:
switch HIWORD (WP)
{case CBN_SELCHANGE:
...
break;
case CBN_DBLCLK:
...}}
break;
...}
{...
case WM_COMMAND:
switch (LOWORD (WP))
{case COMMAND1:
...
break;
case COMMAND2:
..
break;
case 0:
switch HIWORD (WP)
{case CBN_SELCHANGE:
...
break;
case CBN_DBLCLK:
...}}
break;
...}
Цитата: brodotsky
Чего-то я напутал, что что-то не работает.
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.
О чем я и говорю.
Цитата: brodotsky
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.
Естественно, оно так и должно работать. Тип окна неважен же.