winapi — как сделать дочернее окно самым верхним (c ++ win32 SDK)

Я пытаюсь написать очень простой дизайнер макета графического интерфейса, как и в самой популярной 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, не работал

3

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]