delphi – 你能在Windows中创建一个没有WS_POPUP样式的无边界应
我想创建一个窗口,它将成为主窗口,Windows本身将其识别为主应用程序窗口.但是,当我使窗口无边框,并且根本没有任何非客户区域时,Windows不再认识到该窗口是应用程序主窗口.这有几个副作用:
> WindowsKey M最小化除应用程序主窗口之外的所有窗口. 在简单的Win32编程术语中,我在询问dwStyle的参数值,如调用CreateWindow(WS _…常量)或CreateWindowEx(WS_EX _…常量).对于delphi用户,这些值将在您将覆盖的CreateParams方法中设置,然后设置Params.Style:= WS_xxx;对于MFC/C++用户和C用户,框架中的某些内容最终将使用此dwStyle值调用CreateWindow. 在delphi术语中,设置form.BorderStyle = bsNone,得到dwStyle = WS_POPUP.但是我想要一个不使用dwStyle = WS_POPUP的无边框窗口. 注意:下面的所有答案都很好,但是在生产场景中使用每个答案都是有问题的,而且我尝试这样做会导致遇??到许多故障,对于专业质量的应用程序,我仍然觉得我无法解决.戴维斯的回答虽然是一个很好的纯Win32 API答案,但符合要求.似乎工业强度解决方案应该结合多种品质,包括我在上面的问题中所拥有的所有品质.简而言之,使用BorderStyle = bsNone(dwStyle = WS_POPUP)的无边框表单会阻止通常应用于应用程序主窗口的所有Windows功能,下面的所有解决方案都可以解决部分问题. 根据大卫的建议,我写了以下内容,但不起作用: 事实证明,我在编码中犯了一个简单的错误(因此上面的两段),实际上下面的代码现在按照我的意愿工作.这个是pascal,但它应该很容易转换为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,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,340,220,hInstance,nil); SetWindowLong(win,GWL_STYLE,WS_POPUP or WS_MINIMIZEBOX); SetWindowLong(win,GWL_EXSTYLE,0 ); ShowWindow(win,SW_SHOW); while GetMessage(Msg,0) do DispatchMessage(Msg); end. 解决方法
以下完成工作:
hWnd = CreateWindow(...); SetWindowLong(hWnd,WS_POPUP | WS_MINIMIZEBOX); SetWindowLong(hWnd,0); ShowWindow(hWnd,...); 您可能缺少WS_MINIMIZEBOX. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |