2016-05-16 5 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); 

そのノートPCからのスクリーンショットによると、一つの例では、ウィンドウは581広く、私は開発コンピュータ上でそれを実行すると、それはまた、581広いです。しかし、ラップトップのダイアログは拡大されているので、581はもはや正しいサイズではありません。

この状況を正しく処理する方法がわかりません。

+0

「581はもはや正しいサイズではありません」と言われたとき、私はかなり質問しませんでした*、どのサイズが期待されましたか? –

+0

正しいサイズは585(または581;何とか4ピクセルが粗雑になります)、つまりコンピュータ上の座標です。しかし、Windowsは何らかの形でダイアログを拡大しているので、明らかに他のコンピュータではより広い必要があります。 585に設定すると、ダイアログコントロールの一部が途切れることがあります。 –

+0

したがって、ラップトップでは585(または581)以外のサイズを取得していますが、585にしたがっていますか? –

答えて

1

ダイアログは「ダイアログユニット」でレイアウトされているため、ソースでハードピクセル数は使用しません。私は、ダイアログやコントロールのレンダリングされたサイズに基づいて、私の動的なサイズ/位置の計算に基づいています。顧客がシステムのテキストサイズ(コントロールパネル/ディスプレイ設定100%125%150%など)を変更した場合、「ハード100%レンダリング」ピクセル値をコードすると、間違いなく問題が表示されます。

内蔵ラップトップモニターの「ネイティブ解像度」と一致しないモニターでレンダリングする場合、ラップトップがこの種の「翻訳」を行っている可能性があります。ここで

は、私はOK再配置の例である/(つまりはCDialog :: OnInitDialogをへchainback呼び出し後に)レンダリングされた位置に基づいて、ボタンをキャンセル

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を正しく考慮していないか、またはOSに(マニフェストまたはSetProcessDPIAwareまたはSetProcessDPIAwareness経由で)方法を知らせていません。

正確な問題を確認するための十分な情報はありません。私は、外部モニタが接続されているかどうか、そしてWindows 10がPROCESS_PER_MONITOR_DPI_AWAREのような微妙なDPI認識の概念を導入したという事実によって、動作が変わるという事実に基づいて#3を疑う。

+0

私はWindows 10を疑う! – Ajay

関連する問題