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

У меня есть окно с твердой границей вокруг него. Как я могу удалить границу (всю область, не относящуюся к клиенту), используя 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;
}
Другие вопросы по тегам