Я пытаюсь написать очень простой дизайнер макета графического интерфейса, как и в самой популярной IDE, что-то вроде:
Как реализовать эти 8 точек вокруг виджета?
Моя идея состоит в том, чтобы создать прозрачный статический элемент управления (называемый призрак), с 8 точками вокруг него, изменить его размер до размера виджета, покрыть виджет. Вопрос в том, как сделать привидение перед другим контролем?
Я пишу небольшой тест, кнопка и статический контроль, я хочу статический всегда на вершине z-порядка
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main() {
static char szAppName[] = "winhello";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = GetModuleHandle(0);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
RegisterClassEx(&wndclass);
hwnd = CreateWindow(szAppName, "Hello, world!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, GetModuleHandle(0), NULL);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
while ( GetMessage(&msg, NULL, 0, 0) ) {
TranslateMessage(&msg); /* for certain keyboard messages */
DispatchMessage(&msg); /* send message to WndProc */
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
HWND hStatic;
HWND hButton;
switch ( iMsg ) {
case WM_CREATE:
{
hButton = CreateWindow("button", "btn", WS_CHILD|WS_VISIBLE,
10, 10, 100, 100, hwnd, 0, 0, 0);
hStatic = CreateWindow("static", "edt", WS_CHILD|WS_VISIBLE,
40, 40, 50, 200, hwnd, 0, 0, 0);
// WS_EX_TOPMOST doesn't work
// HWND_TOP doesn't work
// SetWindowPos(hStatic, HWND_TOP, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
запустите программу, нажмите кнопку, кнопка переходит на передний план
Я старался SetWindowPos (hStatic, HWND_TOP) а также WS_EX_TOPMOST, не работал
Задача ещё не решена.