Delphi 6.
Windows 10
默认的InputQuery在主窗体的中心打开。
我正在创建自己的InputQuery,它将在调用表单的中心打开。
几乎可以使用。
问题是在旋转90度以获得纵向模式的显示器上,
返回屏幕的高度和宽度,就好像监视器仍处于横向模式一样。
我尝试过:
-将Position设置为poOwnerFormCenter,可以使用,但始终在主监视器上显示。
-在正确的监视器上计算Form.Left和Form.Right可以正常工作,但是X和Y被交换了。
当屏幕高度和宽度属性始终被交换时,此操作将失败。
无法弄清楚该如何解决,
我决定在纵向模式下交换高度和宽度。
在一个论坛上,我找到并修改了读取监视器数据的功能
希望能够确定监视器处于哪种模式。
我也做不到,
我也无法识别调用我的函数的监视器(我在纵向模式下有4、3)。
EnumDisplaySettings返回的数据始终为
不论显示器如何:
-高度= 640
-宽度= 480
-方向= 0
有人可以看到我在做什么吗?
AddToLog过程将在备注中显示字符串。
代码如下:
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;
答案 0 :(得分:3)
让我为您的实际问题提供解决方案。
我尝试过: -将Position设置为poOwnerFormCenter可以,但是总是在主监视器上结束。
嗯,poOwnerFormCenter
应该可以工作。但是您必须指定所有者。
例如,
procedure TForm1.Button1Click(Sender: TObject);
var
dlg: TMyDialog;
begin
dlg := TMyDialog.Create(Self);
try
dlg.ShowModal;
finally
dlg.Free;
end;
end;
将所有者作为构造函数的参数传递,在这种情况下为Self
。这是“所有者表单中心”中所指的“所有者”。