2016-05-16 39 views
0

下面是一个非常古老的功能,曾在众多的计算机上工作,从未见过错误,但现在这款笔记本电脑遇到了问题。据测试人员说,“似乎没事,直到我重新启动,没有插入另一台监视器。”看起来Windows 10在某些情况下会缩放对话内容,使实际尺寸与设计尺寸不同。在笔记本电脑上放大对话框的SetWindowPos

void ResizeComponent::SetWidth(int width /*= DEF_WIDTH*/) 
{ 
    CRect rect; 
    this->GetWindowRect(rect); 
    this->SetWindowPos(NULL, 0,0, width, rect.Height(), /*resize only*/SWP_NOZORDER|SWP_NOMOVE); 
} 

好,使用信息:

const static int WIDTH_PANEL4 = 585; 
SetWidth(WIDTH_PANEL4); 

据该笔记本电脑的屏幕截图,在一个示例中,窗口581宽,当我在开发计算机上运行它,它也是581宽。但是:笔记本电脑对话框放大了,所以581不再是正确的大小。

我不知道如何正确处理这种情况。

+0

当你说*“581不再是正确的尺寸”时,我不太明白问题(对不起)*,预期的尺寸是多少? –

+0

正确的大小应该是585(或581;不知何故4个像素得到咀嚼),这是我的电脑上的坐标。但是,因为Windows以某种方式扩展对话框,所以显然需要在另一台计算机上更宽。设置为585时,某些对话框控件会被切断。 –

+0

因此,在笔记本电脑中,您获得的尺寸不是585(或581),但您希望它是585? –

回答

1

由于对话框是以“对话框单位”的形式进行布置的,因此我不会在我的源代码中使用硬像素数。我基于对话框和/或其控件的渲染大小来进行动态大小/位置计算。如果您的客户更改系统文字大小(控制面板/显示设置为100%125%150%等),那么如果编码“硬性100%渲染”像素值,您肯定会看到问题。

我猜测你的笔记本电脑在使用与内置笔记本电脑显示器的“原始分辨率”不匹配的显示器进行渲染时,可能会进行这种“翻译”。

这里是我重新确定一个例子/取消基于所再现的位置(回链调用CDialog的:OnInitDialog中后,即)按钮

BOOL CSetupDlg::OnInitDialog() 
{ 
CDialog::OnInitDialog(); 

if (m_bShowCancel) 
    { 
    // show/enable Cancel button and re-position the OK/CANCEL buttons (default is OK button is centered and cancel is hidden/disabled) 
    CWnd *pWndOK = GetDlgItem(IDOK); 
    CWnd *pWndCancel = GetDlgItem(IDCANCEL); 
    if (pWndOK->GetSafeHwnd() && pWndCancel->GetSafeHwnd()) 
     { 
     CRect rOKOriginal; 
     pWndOK->GetWindowRect(&rOKOriginal); 
     this->ScreenToClient(rOKOriginal); 

     // move Cancel button to the immediate right of the centered OK button 
     pWndCancel->SetWindowPos(NULL, rOKOriginal.right, rOKOriginal.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); 
     pWndCancel->EnableWindow(true); 
     // pWndCancel->ShowWindow(SW_SHOW); 

     // move OK button to the immediate left of its original/centered position 
     pWndOK->SetWindowPos(NULL, rOKOriginal.left - rOKOriginal.Width(), rOKOriginal.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER); 
     } 
    } 

return TRUE; // return TRUE unless you set the focus to a control 
// EXCEPTION: OCX Property Pages should return FALSE 
} 
1

有几种可能性:

  1. 该对话框在“对话框单位”中指定的字体与代码实际使用的字体不同。

  2. Windows版本之间的边框样式更改未在对话框的设计中考虑,因此您将失去几个像素。

  3. 屏幕是高DPI,程序没有正确解释高DPI,或者它没有告诉操作系统它知道如何(通过manifest或SetProcessDPIAware或SetProcessDPIAwareness)。

问题中没有足够的信息来确切知道确切的问题。我怀疑#3是基于这样一个事实,即行为改变取决于是否连接了外部显示器,以及Windows 10引入了更多细微差别的DPI认知概念,如PROCESS_PER_MONITOR_DPI_AWARE

+0

我怀疑Windows 10! – Ajay