How to get multi monitor orientations
delphi(Delphi)6。
Windows 10
默认InputQuery在主窗体的中心打开。
我正在创建自己的InputQuery,它将在调用表单的中心打开。
几乎可以使用。
问题是在旋转90度以获取人像模式的显示器上,
返回屏幕的高度和宽度,就好像监视器仍处于横向模式一样。
我尝试过:
-将Position设置为poOwnerFormCenter,可以使用,但始终在主监视器上显示。
-在正确的监视器上计算Form.Left和Form.Right可以正常工作,但是X和Y被交换了。
当屏幕高度和宽度属性始终被交换时,此操作将失败。
无法弄清楚该如何解决,
我决定在纵向模式下交换高度和宽度。
在一个论坛上,我找到并修改了读取监视器数据的功能
希望能够确定监视器处于哪种模式。
我也做不到
我也无法识别调用我的功能的显示器(我在纵向模式下有4、3)。
EnumDisplaySettings返回的数据始终为
不论显示器如何:
-身高= 640
-宽度= 480
-方向= 0
有人可以看到我做错了吗?
AddToLog过程将在备注中显示字符串。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | procedure TXIO_Configurator_form.Button1Click(Sender: TObject); var lpDisplayDevice: TDisplayDevice; dwFlags : DWORD; cc : DWORD; DevMode : TDeviceMode; S : string; begin lpdisplaydevice.cb := sizeof(lpdisplaydevice); dwflags := 0; cc:= 0; while EnumDisplayDevices(nil, cc, lpDisplayDevice , dwFlags) do begin EnumDisplaySettings(lpDisplayDevice.DeviceName, 0, DevMode); S := 'Height = ' + IntToStr(DevMode.dmPelsHeight); // Always 640 MainForm.AddToActivityLog(S, False); S := 'Width = ' + IntToStr(DevMode.dmPelsWidth); // Always 480 MainForm.AddToActivityLog(S, False); S := 'Orient = ' + IntToStr(DevMode.dmOrientation); // Always 0 MainForm.AddToActivityLog(S, False); inc(cc); end; |
让我为您的实际问题提供解决方案。
I tried:
- Setting Position to poOwnerFormCenter, worked but always ended up on the primary monitor.
好吧,
例如,
1 2 3 4 5 6 7 8 9 10 11 | procedure TForm1.Button1Click(Sender: TObject); var dlg: TMyDialog; begin dlg := TMyDialog.Create(Self); try dlg.ShowModal; finally dlg.Free; end; end; |
将所有者作为构造函数的参数传递,在本例中为