Удаление границы окна?
У меня есть окно с твердой границей вокруг него. Как я могу удалить границу (всю область, не относящуюся к клиенту), используя SetWindowLong и GetWindowLong?
4 ответа
В 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 выглядят одинаково на всех языках.
Эта строка кода ниже удаляет границу любого данного окна и остается только его клиентом:
SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);
Ты можешь использовать WS_POPUPWINDOW
вместо этого в третьем параметре SetWindowLong
функция. Он также удаляет границы данного окна и работает, но отличие состоит в том, что он также рисует контурный черный прямоугольник на всем протяжении оставшегося клиента окна. Толщина этого обведенного прямоугольника составляет 1 пиксель. WS_POPUP
не рисует этот прямоугольник, на самом деле он ничего не рисует, просто удаляет границы окна.
Если вы собираетесь вернуть границы окна, прежде чем использовать строку кода, которую я разместил выше, сначала вызовите строку кода ниже:
GetWindowLong(hWnd /*The handle of the window that you want to remove its borders and later return them back to it*/, GWL_STYLE);
но, конечно, эта функция переустанавливает стили окна, поэтому создайте новую переменную, которая сохранит эти стили, т.е. установите для этой переменной возвращаемое значение этой функции.
Тогда вы используете SetWindowLong
как я показал выше, чтобы удалить его границы, и когда вы захотите позже восстановить его границы, просто вспомните еще раз SetWindowLong
первые два параметра одинаковы (hWnd и GWL_STYLE), но третий параметр - это стили окна, которое возвращается из GetWindowLong
, Если вы не хотите звонить GetWindowLong
, но все равно верните границы окна, тогда вы можете использовать SetWindowLong
с теми же первыми двумя параметрами, а в третьем параметре вы можете использовать один из следующих: WS_OVERLAPPED
и / или WS_OVERLAPPEDWINDOW
и / или WS_SIZEFRAME
,
ПРИМЕЧАНИЕ. Если вы попробуете мой ответ, но у вас это не сработает, это может произойти из-за того, что обе функции SetWindowLong
а также GetWindowLong
были заменены и не работают для вас, и это потому, что они совместимы только с 32-разрядной версией Windows. Возможно, вы используете 64-разрядную версию Windows, а затем используйте SetWindowLongPtr
а также GetWindowLongPtr
вместо этого, которые совместимы как с 32-разрядной, так и с 64-разрядной версиями Windows. MSDN сообщает об этих функциях в разделе " Примечание ". Просто найдите их на этом сайте. Вот ссылки на них:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms633584(v=vs.85).aspx
Надеюсь, что все это отвечает на ваш вопрос.
Это удаляет строку заголовка и вертикальные полосы прокрутки...
int main()
{
HWND hwnd = GetConsoleWindow();
// remove title bar
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
//remove vertical scrollbar
ShowScrollBar(hwnd, SB_VERT, FALSE);
cout << "Hello World! \n";
system("pause");
return 0;
}