Удаление границы окна?

У меня есть окно со сплошной границей вокруг этого. Как я могу удалить границу (вся неклиентская область) при помощи SetWindowLong и GetWindowLong?

28
задан Andreas Rejbrand 2 December 2015 в 14:13
поделиться

2 ответа

В C/C++

LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);

WS_CAPTION определяется как (WS_BORDER | WS_DLGFRAME). Вы можете обойтись удалением только этих двух стилей, так как при исчезновении надписи исчезнут минимизация максимизация и системное меню, но лучше удалить и их.

Также лучше удалить стили расширенных границ.

LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);

И наконец, чтобы заставить окно перерисовываться с измененными стилями, можно использовать SetWindowPos.

SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
49
ответ дан 28 November 2019 в 02:52
поделиться

Это делают следующие коды Delphi:

  SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_BORDER and not WS_SIZEBOX and not WS_DLGFRAME );
  SetWindowPos(Handle, HWND_TOP, Left, Top, Width, Height, SWP_FRAMECHANGED);

Конечно, эти вызовы API выглядят одинаково на всех языках.

8
ответ дан 28 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: