#c #winapi
#c #winapi
Вопрос:
При использовании любой программы изменение размера окна приводит к изменению расположения элементов управления, чтобы они помещались в окне. Как вы это делаете с помощью C ? Я видел много примеров C #, но C нигде не было.
Комментарии:
1. Если вы используете фреймворк GUI, ищите встроенную поддержку. Если вы записываете в необработанный winapi, то обрабатывайте события размера и настраивайте дочерние элементы управления вручную.
2. Я надеялся сделать это только с помощью winapi. Я думал о том, как сделать это вручную, но решил, что должен быть какой-то встроенный способ. Я полагаю, что нет: (
Ответ №1:
Вы можете использовать SetWindowPos
API в WM_SIZE
сообщении:
Я создаю образец и использую следующий код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hButton;
switch (message)
{
case WM_CREATE:
hButton = CreateWindow(TEXT("Button"), TEXT("OK"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 50, 50, 50, 50, hwnd, NULL, NULL, NULL);
return 0;
case WM_SIZE:
{
int cxClient = LOWORD(lParam);
int cyClient = HIWORD(lParam);
SetWindowPos(hButton, NULL, cxClient / 3, cyClient / 4, cxClient / 5, cyClient / 2, SWP_SHOWWINDOW);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
Размер созданной кнопки будет изменен в соответствии с моим окном изменения размера:
Комментарии:
1. обычно требуется переместить несколько (n) элементов управления в окне, в этом случае лучше использовать
BeginDeferWindowPos
DeferWindowPos
(n )EndDeferWindowPos
. также обычно для каждого элемента управления необходимо выбрать 2 точки (слева, сверху) и (справа, снизу), а расстояние между точкой и точкой на родительской границе является постоянным2. @RbMm Спасибо за ваше дополнение, я просто предлагаю несколько возможных методов, возможно, вы сможете опубликовать свой ответ.