Di seguito è tratto dalla sezione Osservazioni della documentazione MoveWindow()
:Calling MoveWindow() con bRepaint impostata su true
Se il parametro bRepaint è TRUE, il sistema invia il messaggio WM_PAINT alla routine di finestra immediatamente dopo aver spostato la finestra (ovvero, la funzione MoveWindow chiama la funzione UpdateWindow).
così ho pensato che quando chiamo MoveWindow()
con bRepaint
insieme al TRUE
, la procedura di finestra sarà chiamato immediatamente e superato un messaggio WM_PAINT
, ma questo è ciò che il mio test mostra:
- Quando
MoveWindow()
è chiamato, la procedura della finestra si chiama immediatamente, ma viene inviato un messaggioWM_ERASEBKGND
e non un messaggioWM_PAINT
. - L'area non è ancora valida e quindi quando torno al ciclo dei messaggi e nessun messaggio si trova nella coda messaggi, viene inviato un messaggio
WM_PAINT
.
Ho interpretato la documentazione errata?
Nota: Sto parlando di chiamare il metodo MoveWindow()
sull'oggetto finestra padre.
Edit:
Questo è il mio codice di prova:
/* Left mouse click on the window to call MoveWindow() */
#include <Windows.h>
HWND hEdit;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
MoveWindow(hWnd, 200, 200, 700, 700, TRUE);
// Do not go back to message loop immediately
Sleep(3000);
break;
case WM_ERASEBKGND:
{
SendMessage(hEdit, WM_CHAR, (WPARAM)'e', 0);
}
break;
case WM_PAINT:
{
SendMessage(hEdit, WM_CHAR, (WPARAM)'p', 0);
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "WinClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wc);
HWND hWnd = CreateWindowEx(0, "WinClass", "", WS_OVERLAPPEDWINDOW, 261, 172, 594, 384, NULL, NULL, hInstance, NULL);
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 0, 0, 400, 21, hWnd, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
Possiamo vedere un semplice codice di esempio che funziona come hai descritto? – cdonts
È normale che 'WM_ERASEBKGND' preceda' WM_PAINT' come parte di un ciclo di ripetizione standard, i documenti non sono abbastanza dettagliati. –
@Jonathan Potter Sto parlando del fatto che la procedura della finestra è chiamata direttamente per 'WM_ERASEBKGND', ma non è chiamata direttamente per' WM_PAINT'. La documentazione dice: * "la funzione MoveWindow chiama la funzione UpdateWindow" *, quindi questo significa che la procedura della finestra deve essere chiamata direttamente per 'WM_PAINT', ma questo non sta succedendo! –