Окно пусто, когда подклассифицирует элемент управления EDIT в C ++ WINAPI

У меня есть элемент управления EDIT, который я пытаюсь разделить на подклассы, и когда я делаю это, все окно становится пустым:

// Global variables
HINSTANCE hInst;
WNDPROC oldEditWndProc;
INT_PTR CALLBACK EditWndProc(HWND, UINT, WPARAM, LPARAM);

// Messages handler of the parent window
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hDC;
HWND myedit;

switch (message)
{
case WM_CREATE:
// Create the EDIT control
myedit= CreateWindowEx(
WS_EX_CLIENTEDGE|WS_EX_CONTROLPARENT,
L"EDIT",
L"",
WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_LEFT,
20, 120,
160, 20,
hWnd,
NULL,
hInst,
NULL
);
oldEditWndProc = (WNDPROC)GetWindowLongPtr (myedit, GWLP_WNDPROC);
// This is the line where problems begin
SetWindowLongPtr (myedit, GWLP_WNDPROC, (LONG_PTR)EditWndProc);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// EDIT control own handler
INT_PTR CALLBACK EditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_GETDLGCODE:
return DLGC_WANTTAB;
break;
}
return (INT_PTR)FALSE;
}

Я просто не могу понять, почему все окно пусто при звонке SetWindowLongPtr

0

Решение

Под «пустым» вы подразумеваете, что он не отображается на экране?

Если да, это потому, что когда вы создаете подкласс Window, все его сообщения будут отправляться новому MessageProc, который не имеет всех функций, чтобы правильно отображать его в функции defaultProc (например, WM_PAINT или даже при нажатии кнопки).

Итак, вам нужно что-то вроде этого:

//store the old window proc somewhere
WNDPROC oldWindowProc = (WNDPROC)SetWindowLong(subWindowHandle, GWL_WNDPROC, long(NewMessageProc));

//and in the message proc
switch(uMsg)
{
//your "case"s here
default:
{
CallWindowProc(oldWindowProc, windowHandle, uMsg, wParam, lParam);
}
}

Это вызовет надлежащий WM_PAINT и другие сообщения для messageProc, который отвечает за рисование и щелчок, и другие функции (DefWindowProc () в подклассовом окне).

В качестве альтернативы вы также можете просто реализовать WM_PAINT в вашем NewMessageProc для всех ваших подклассовых окон, но без вызова их DefWindowProc вам нужно будет сделать для каждый событие, которое они могут получить (перемещение мыши, щелчки мышью, нажатия кнопок, все), поэтому использовать их оригинальный DefWindowProc проще.

3

Другие решения

в вашем окне редактирования вы должны вызвать соответствующую обработку сообщений по умолчанию.

такие как оригинальное окно проц.

Самый простой способ сделать это на уровне абстракции вашего кода — использовать вместо этого SetWindowSubclass сделать подкласс

1

По вопросам рекламы [email protected]