残りの Windows アプリケーションと一貫性のあるシステム全体の標準サイズ (特に高さ) を持つボタン コントロール (ウィンドウ クラスCreateWindow
を使用)を作成するにはどうすればよいですか? BUTTON
もちろん、DPI とおそらく他の設定を考慮に入れる必要があります。
注意:幅と高さに使用
USE_CW_DEFAULT
すると、サイズが 0, 0 のボタンになるため、これは解決策ではありません。
残りの Windows アプリケーションと一貫性のあるシステム全体の標準サイズ (特に高さ) を持つボタン コントロール (ウィンドウ クラスCreateWindow
を使用)を作成するにはどうすればよいですか? BUTTON
もちろん、DPI とおそらく他の設定を考慮に入れる必要があります。
注意:幅と高さに使用
USE_CW_DEFAULT
すると、サイズが 0, 0 のボタンになるため、これは解決策ではありません。
標準サイズのボタンを作成するには、次のようにする必要があります。
LONG units = GetDialogBaseUnits();
m_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Close"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
0, 0, MulDiv(LOWORD(units), 50, 4), MulDiv(HIWORD(units), 14, 8),
hwnd, NULL, hInst, NULL);
ここで、50と14はそれぞれDLUの寸法であり、4と8はそれぞれ、GetDialogBaseUnits()
関数のドキュメントの注釈に基づいた水平および垂直のダイアログテンプレートユニットです。
しかし、アンダースが指摘したように、これらのメトリックはシステムフォントに基づいています。ウィンドウがシェルダイアログフォントを使用している場合、または単に目を出血させないものを使用している場合は、ほとんど自分で判断できます。
独自の「ダイアログ」基本単位を取得するには、現在のテキストメトリックを取得しGetTextMetrics()
、文字の高さと平均幅(tmHeight
および構造体tmAveCharWidth
のそれぞれ)を使用して、ダイアログを表示していない限りTEXTMETRIC
、MulDivを使用して変換する必要があります。あなたのためにすべての仕事をしてください。MapDialogRect()
tmAveCharWidth
実際の平均文字幅を概算するだけなので、GetTextExtentPoint32()
代わりにアルファベット文字セットで関数を使用することをお勧めします。
見る:
ボタンが自動的にサイズ変更する唯一のコントロールである場合は、BCM_GETIDEALSIZE
メッセージButton_GetIdealSize()
マクロ(Windows XP以降のみ)を使用して、ボタンの周囲に余白を適用せずにかなり見苦しく見えますが、ボタンに含まれるものすべてに適合する最適な幅と高さを取得することもできます。文章。
これは、MSDN が言わなければならないことです: Design Specifications and Guidelines - Visual Design: Layout。
ボタンのデフォルト サイズは 50x14 DLU で、GetDialogBaseUnitsの例を使用してピクセルに計算できます。
MapDialogRect関数が計算を行っているようです。
@macbirdie: GetDialogBaseUnits() は使用しないでください。デフォルトのシステム フォント (醜いビットマップ フォント) に基づいています。MapDialogRect() を使用する必要があります