Ce programme crée le contrôle WC_EDIT
à l'intérieur de la fenêtre principale. La fenêtre principale redimensionne le contrôle d'édition chaque fois que la fenêtre elle-même est redimensionnée. J'essaie de définir les marges du contenu du contrôle d'édition en mettant à jour le rectangle de mise en forme du contrôle WC_EDIT
à chaque redimensionnement.
La fenêtre principale répond au message WM_SIZE
et redimensionne le contrôle d'édition, puis le contrôle d'édition répond à son propre message WM_SIZE
et tente de mettre à jour le rectangle de mise en forme en utilisant EM_SETRECT
, mais rien ne se passe.
#include
#include
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND hwnd;
HWND editHwnd;
WNDPROC origEditProc;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
{
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = "Window Class";
RegisterClass(&wc);
hwnd = CreateWindow(
wc.lpszClassName,
"",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
editHwnd = CreateWindow(
WC_EDIT,
"Lorem ipsum",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
0,
0,
100,
100,
hwnd,
NULL,
hInstance,
NULL
);
origEditProc = (WNDPROC) GetWindowLongPtr(editHwnd, GWLP_WNDPROC);
SetWindowLongPtr(editHwnd, GWLP_WNDPROC, (LONG_PTR)EditWindowProc);
ShowWindow(hwnd, nCmdShow);
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
return 0;
case WM_SIZE:
RECT clientRect;
GetClientRect(hwnd, &clientRect);
SetWindowPos(editHwnd, NULL, 0, 0, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK EditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SIZE:
RECT rect;
GetClientRect(editHwnd, &rect);
rect.left += 50;
rect.top += 50;
rect.right -= 50;
rect.bottom -= 50;
SendMessage(editHwnd, EM_SETRECT, NULL, (LPARAM)&rect);
}
return CallWindowProc(origEditProc, hwnd, uMsg, wParam, lParam);
}