Можете ли вы создать главное окно приложения без полей в Windows, без стиля WS_POPUP?

, я хочу создать окно, которое будет главным окном и которое сама Windows распознает как главное окно приложения. Однако, когда я делаю свое окно без полей и вообще без какой-либо неклиентской области, Windows больше не распознает, что это окно является главным окном приложения. Это имеет несколько побочных эффектов:

  1. WindowsKey + M минимизирует все окна, кроме главного окна моего приложения.

  2. Щелчок один раз на панели задач (в 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. 

8
задан David Heffernan 5 February 2011 в 22:15
поделиться