Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В C/С++

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

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

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

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);

Ответ 2

Следующие коды 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 выглядят одинаково на всех языках.

Ответ 3

Эта строка кода ниже удаляет границу любого данного окна и остается только ее клиентом:

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- бит. 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

Надеюсь, что все это ответит на ваш вопрос.