Как обновить поля элемента управления WC_EDIT при изменении размераC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как обновить поля элемента управления WC_EDIT при изменении размера

Сообщение Anonymous »

Эта программа создает элемент управления WC_EDIT внутри главного окна. Главное окно изменяет размер элемента управления редактированием всякий раз, когда изменяется размер самого окна. Я пытаюсь установить поля содержимого элемента управления редактированием, обновляя прямоугольник форматирования элемента управления WC_EDIT при каждом изменении его размера.

Главное окно реагирует на сообщение WM_SIZE и изменяет размер элемента управления редактированием, затем элемент управления редактированием отвечает на свое собственное сообщение WM_SIZE и пытается обновить прямоугольник форматирования с помощью EM_SETRECT, но ничего не происходит.

#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);
}


Подробнее здесь: https://stackoverflow.com/questions/482 ... en-resized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»