微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使hover最小化,最大化和closuresbutton的行为?

在Delphi应用程序中,当您将鼠标hover在边框图标上时,例如:

最小化

最大化

恢复

它行为不正确:

与具有正确行为的应用程序进行比较:

C到delphi转换

RAD工作室需要很长时间才能打开

向表单添加一个边框图标

如何使用Delphi从文件扩展名中获取图标和描述?

如何从TDirect2DCanvas(Direct2D rendertarget)复制数据?

重现步骤

单击FileNewVCL Forms Application – Delphi

点击运行(F9)

将鼠标hover在“最小化”,“最大化”或“closures”button上。

怎么修?

Windows 10,64位(在桌面PC上本机运行)

delphiXE6

编辑 – 它也与Delphi 7失败:

和Delphi 5中:

和Delphi 4中:

我认为(即害怕)它是由ThemeServices引擎引起的; 在那里他们可能认为不尊重用户的偏好是很酷的。 但看起来这是更基本的东西。

兼容模式

:失败

Windows 8 :失败

Windows 7 :失败

Windows Vista(Service Pack 2) :失败

Windows Vista(Service Pack 2) :失败

Windows Vista :失败

Windows XP(Service Pack 3) (禁用非客户端区域主题):有效

Windows XP(Service Pack 2) (禁用非客户端区域主题):有效

Windows 98 / Windows Me (非客户区域主题禁用):工作

Windows 95 (非客户区域主题禁用):工作

Skype的

在Skype中也失败了; 也写在delphi:

高DPI是触发器

我终于明白为什么它在我用过的每台Windows 10机器上都失败了。 但不适合每个人。 高dpi。

将您的dpi设置为97(101%)或更高。

足够近

dalija的解决scheme的作品:

我们将忽略提示的问题,并活着打另一天。

还应该注意的是,Windows 10会build议您在更改DPI之后可能必须注销并重新login才能正常使用某些应用程序。 delphi确实如此。

还应该指出,delphi不能容忍DPI背后的变化。 这包括调整缩放滑块。 这还包括将应用程序放置在除主显示器以外的任何显示器上。

我们从来没有弄清楚问题是什么。 只有在运行多个显示器的用户的路上才能完成。

质量控制错误报告

因为Bor … Impr … CodeG … Embarca … Idera的QC站点在付费墙后面,这里是错误报告的副本:

http://archive.is/v77rz

正如你所看到的:没有人在乎。

在Delphi中使其他应用程序窗口变得透明

为什么TFontDialog比Screen.Fonts提供更less的字体?

如何用Delphi来播放单音或自定义波形?

获取当前在Windows图片和传真查看器中打开的文件的path

如何以编程方式设置文件标签

高DPI是触发器,并导致解决方案。

显示此问题的应用程序不支持高DPI。 悬停问题的解决方案是通过使用1,2或3下的解决方案之一,使他们意识到或打开相关的兼容模式。

注意:启用高DPI识别时,应用程序的其余部分是否会正常工作是另一个问题,并且会因应用程序而异。

在兼容模式下,选中“在高DPI设置下禁用显示比例缩放”

调用SetProcessDPIAware作为在.dpr文件中的第一个调用 – 正如Ian Boyd所指出的,调用这个函数可以竞争条件,首选的方式是使用manifest。 SetProcessDPIAware

使用具有true或true/PM设置的自定义清单(包含在“启用运行时主题”中的认Delphi清单不是DPI可识别的)

Delphi VCL和FMX框架的当前版本不支持每个监视器DPI感知,所以只有在您自己处理每个监视器DPI时才使用true/PM清单。 向QP报告为VCL和FireMonkey缺乏对Windows 8.1(和Windows 10)的Per-Monitor DPI支持

<asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application>

要么

<asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true/PM</dpiAware> </asmv3:windowsSettings> </asmv3:application>

更新:

德尔福VCL是马车行为的来源,具体问题是在TForm类或其祖先的某处。 当使用直接Windows API时,结果窗口正常运行。

Windows API代码的行为正确:

MessageBox(0,'Correct','Caption',MB_OK); ShowMessage('Correct'); // if themes are enabled -> Windows Task dialog is used

完整的Delphi示例应用程序,创建主窗口,而不使用VCL – 行为正常

program win; {$R *.res} uses Windows,Messages,SysUtils; var Msg: TMSG; LWndClass: TWndClass; hMainHandle: HWND; function WindowProc(HWND,Msg: Longint; wParam: wParam; lParam: lParam): Longint; stdcall; begin if Msg = WM_DESTROY then PostQuitMessage(0); Result := DefWindowProc(HWND,Msg,wParam,lParam); end; begin LWndClass.hInstance := hInstance; with LWndClass do begin lpszClassName := 'WinApiWnd'; Style := CS_PARENTDC or CS_BYtealIGNCLIENT; hIcon := LoadIcon(hInstance,'MAINICON'); lpfnWndProc := @WindowProc; hbrBackground := COLOR_BTNFACE + 1; hCursor := LoadCursor(0,IDC_ARROW); end; RegisterClass(LWndClass); hMainHandle := CreateWindow(LWndClass.lpszClassName,'Window Title',WS_CAPTION or WS_MINIMIZEBox or WS_SYSMENU or WS_VISIBLE,360,200,hInstance,nil); while GetMessage(Msg,0) do begin TranslateMessage(Msg); dispatchMessage(Msg); end; end.

行为不端的VCL表格:

var f: TForm; f := CreateMessageDialog('broken',mtWarning,mbOKCancel,mbOk); f.ShowModal; f.Free; f := TForm.Create(nil); f.ShowModal; f.Free;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐