, я хочу создать окно, которое будет главным окном и которое сама Windows распознает как главное окно приложения. Однако, когда я делаю свое окно без полей и вообще без какой-либо неклиентской области, Windows больше не распознает, что это окно является главным окном приложения. Это имеет несколько побочных эффектов:
WindowsKey + M минимизирует все окна, кроме главного окна моего приложения.
Щелчок один раз на панели задач (в win7), а затем еще раз, должен переключать состояние / видимость главного окна приложения между нормальным и минимизированным государство. Это не работает для такого окна.
В терминах программирования Win32 я спрашиваю о значениях параметров для dwStyle , как при вызове CreateWindow (константы WS _...) или CreateWindowEx (константы WS_EX _... ). Для пользователей delphi эти значения будут установлены в методе CreateParams, который вы должны переопределить, а затем установить Params.Style: = WS_xxx; Для пользователей MFC / C ++ и пользователей C что-то в вашей структуре в конечном итоге будет вызывать CreateWindow с этим значением dwStyle.
В терминах delphi установка вашей формы.BorderStyle = bsNone приводит к dwStyle = WS_POPUP. Однако мне нужно окно без полей без использования dwStyle = WS_POPUP.
Примечание. Все приведенные ниже ответы хороши, но использование каждого из них в производственных сценариях проблематично, и мои попытки сделать это привели к возникновению множества сбоев, которые для приложение профессионального качества, Я все еще считаю, что не могу обойтись. Ответ Дэвидса - отличный чистый ответ Win32 API, который отвечает всем требованиям. Кажется, что промышленное решение для повышения прочности должно сочетать в себе несколько качеств, включая все те, которые я указал в моем вопросе выше. Короче говоря, формы без полей с использованием BorderStyle = bsNone (dwStyle = WS_POPUP) блокируют все функции Windows, которые обычно применяются к основным окнам приложений, и все решения ниже решают часть этого.
Основываясь на предложениях Дэвида, я написал следующее, что не работает: Формы без полей, использующие BorderStyle = bsNone (dwStyle = WS_POPUP), блокируют все функции Windows, которые обычно применяются к основным окнам приложений, и все решения ниже решают часть этого.
Основываясь на предложениях Дэвида, я написал следующее, что не работает: Формы без полей, использующие BorderStyle = bsNone (dwStyle = WS_POPUP), блокируют все функции Windows, которые обычно применяются к основным окнам приложений, и все решения ниже решают часть этого.
Основываясь на предложениях Дэвида, я написал следующее, что не работает: Мне нужно окно без рамки, которое ведет себя по-разному, как окно приложения Windows, для системы, то есть его можно свернуть / восстановить, щелкнув окно на панели задач, и свернуть его с помощью WindowsKey + M . Я начинаю думать, что единственный способ сделать это - добавить неклиентский код рисования и изменить размер верхней границы неклиентской области до нуля. Это, конечно, нетривиальная идея.
Оказывается, я допустил простую ошибку в коде (отсюда два абзаца выше), и на самом деле приведенный ниже код теперь работает так, как я хочу. Он написан на паскале, но его должно быть легко преобразовать в C ++ или что-нибудь еще.
program NoBorderProject;
uses
Windows, Messages;
{the Messages unit contains the windows
Message constants like WM_COMMAND}
{$R *.RES}
var
wClass: TWndClass;
Msg: TMsg;
win:HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
if Msg = WM_DESTROY then PostQuitMessage(0);
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
begin
wClass.lpszClassName:= 'CN';
wClass.lpfnWndProc := @WindowProc;
wClass.hInstance := hInstance;
wClass.hbrBackground:= 1;
RegisterClass(wClass);
win := CreateWindow(wClass.lpszClassName,'Title Bar',
WS_POPUP,//WS_OVERLAPPEDWINDOW or WS_VISIBLE,
10,10,340,220,0,0,hInstance,nil);
SetWindowLong(win, GWL_STYLE, WS_POPUP or WS_MINIMIZEBOX);
SetWindowLong(win, GWL_EXSTYLE, 0 );
ShowWindow(win,SW_SHOW);
while GetMessage(Msg,0,0,0) do
DispatchMessage(Msg);
end.