none
OSのDPI値とMFCのコントロールのサイズの関係性について RRS feed

  • 質問

  • VS2013にてMFCのダイアログベースで開発を行っています。

    現在アプリケーションのDPI対応の作業を行っており、OSで設定されているDPIによってコントロールがどのように拡大しているのかを調査しています。

    検証アプリケーションにてDPI100%の状態で文字がギリギリに収まるCStaticを用意し、DPI200%にし表示させたところ文字がきれてしまいました。

    DPIが100%の時の横幅とDPIが200%の時の横幅は以下の通りでした。

    DPI100%   46

    DPI200%   85

    DPIを200%にした場合に、CStaticの横幅が100%の2倍にならない理由を教えて頂けないでしょうか。


    ●検証アプリケーションのrcファイル(抜粋)

    IDD_CSTATICSIZEBYDPI_DIALOG DIALOGEX 0, 0, 64, 139
    STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION
    EXSTYLE WS_EX_APPWINDOW
    CAPTION "CStaticSizebyDPI"
    FONT 9, "MS Shell Dlg", 0, 0, 0x1
    BEGIN
        DEFPUSHBUTTON   "OK",IDOK,7,95,50,14
        PUSHBUTTON      "キャンセル",IDCANCEL,7,118,50,14
        LTEXT           "aiueo",IDC_STATIC1,7,7,16,8
        LTEXT           "高さ",IDC_STATIC2,7,18,31,8
        LTEXT           "横幅",IDC_STATIC3,7,27,31,8
        LTEXT           "あいうえお",IDC_STATIC4,7,46,26,8
        LTEXT           "高さ",IDC_STATIC5,7,57,31,8
        LTEXT           "横幅",IDC_STATIC6,7,65,31,8
    END
    

    ●検証アプリケーションのCStaticサイズ取得処理(抜粋)

    void CCStaticSizebyDPIDlg::OnPaint()
    {
        //(中略)
    
    	CRect static1Rect;
    	static1.GetClientRect(&static1Rect);
    
    	CString static1Height;
    	static1Height.Format("高さ:%d", static1Rect.Height());
    	static2.SetWindowText(static1Height);
    	CString static1Width;
    	static1Width.Format("横幅:%d", static1Rect.Width());
    	static3.SetWindowText(static1Width);
    
    
    	CRect static4Rect;
    	static4.GetClientRect(&static4Rect);
    
    	CString static4Height;
    	static4Height.Format("高さ:%d", static4Rect.Height());
    	static5.SetWindowText(static4Height);
    	CString static4Width;
    	static4Width.Format("横幅:%d", static4Rect.Width());
    	static6.SetWindowText(static4Width);
    
    }

    よろしくお願い致します。

    2016年12月2日 6:10

回答

  • DialogUnit という値が基準になっています。GetDialogBaseUnit API で取得が可能です。

    倍率を変えた時にサイズの変化率が一致しない問題は、フォントの平均幅、高さに依存しているからです。

    変化率を減らしたい場合は、MS Shell Dlg にせず、必ず環境非依存で同じになるフォントを指定する、プロポーショナルではなく固定ピッチにするというくらいですが、それでもずれたと記憶しています。

    なので、本当にぴっちりのサイズにしたい場合は、実行時に表示に必要なサイズを算出するしかありません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2016年12月2日 8:28

すべての返信

  • DialogUnit という値が基準になっています。GetDialogBaseUnit API で取得が可能です。

    倍率を変えた時にサイズの変化率が一致しない問題は、フォントの平均幅、高さに依存しているからです。

    変化率を減らしたい場合は、MS Shell Dlg にせず、必ず環境非依存で同じになるフォントを指定する、プロポーショナルではなく固定ピッチにするというくらいですが、それでもずれたと記憶しています。

    なので、本当にぴっちりのサイズにしたい場合は、実行時に表示に必要なサイズを算出するしかありません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2016年12月2日 8:28
  • ご回答ありがとうございます。

    DLUの大きさによって、CStaticの幅と拡大率が一致しない場合があることを理解できました。

    フォントの平均幅、高さに依存しているからです

    ボヤキですが、平均値だと今回のようなCStaticの文字が切れてしまうケースがあるので、少なくともDPIの拡大率未満にはならないようにして欲しいかったと思います。

    ご教示して頂いた実行時にサイズ算出して、表示が切れないように対策しようと思います。

    ありがとうございました。

    2016年12月7日 1:06