У меня есть окно со сплошной границей вокруг этого. Как я могу удалить границу (вся неклиентская область) при помощи SetWindowLong и GetWindowLong?
В 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);
Это делают следующие коды 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 выглядят одинаково на всех языках.