9

残りの Windows アプリケーションと一貫性のあるシステム全体の標準サイズ (特に高さ) を持つボタン コントロール (ウィンドウ クラスCreateWindowを使用)を作成するにはどうすればよいですか? BUTTONもちろん、DPI とおそらく他の設定を考慮に入れる必要があります。

注意:幅と高さに使用USE_CW_DEFAULTすると、サイズが 0, 0 のボタンになるため、これは解決策ではありません。

4

3 に答える 3

9

完璧で手間のかからない世界で...

標準サイズのボタンを作成するには、次のようにする必要があります。

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);

ここで、5014はそれぞれDLUの寸法であり、48はそれぞれ、GetDialogBaseUnits()関数のドキュメントの注釈に基づいた水平および垂直のダイアログテンプレートユニットです。


完璧なものはありません

しかし、アンダースが指摘したように、これらのメトリックはシステムフォントに基づいています。ウィンドウがシェルダイアログフォントを使用している場合、または単に目を出血させないものを使用している場合は、ほとんど自分で判断できます。

独自の「ダイアログ」基本単位を取得するには、現在のテキストメトリックを取得しGetTextMetrics()、文字の高さと平均幅(tmHeightおよび構造体tmAveCharWidthのそれぞれ)を使用して、ダイアログを表示していない限りTEXTMETRIC、MulDivを使用して変換する必要があります。あなたのためにすべての仕事をしてください。MapDialogRect()

tmAveCharWidth実際の平均文字幅を概算するだけなので、GetTextExtentPoint32()代わりにアルファベット文字セットで関数を使用することをお勧めします。

見る:


より単純な代替

ボタンが自動的にサイズ変更する唯一のコントロールである場合は、BCM_GETIDEALSIZEメッセージButton_GetIdealSize()マクロ(Windows XP以降のみ)を使用して、ボタンの周囲に余白を適用せずにかなり見苦しく見えますが、ボタンに含まれるものすべてに適合する最適な幅と高さを取得することもできます。文章。

于 2008-09-12T11:03:03.470 に答える
9

これは、MSDN が言わなければならないことです: Design Specifications and Guidelines - Visual Design: Layout

ボタンのデフォルト サイズは 50x14 DLU で、GetDialogBaseUnitsの例を使用してピクセルに計算できます。

MapDialogRect関数が計算を行っているようです。

于 2008-09-12T10:36:16.173 に答える
1

@macbirdie: GetDialogBaseUnits() は使用しないでください。デフォルトのシステム フォント (醜いビットマップ フォント) に基づいています。MapDialogRect() を使用する必要があります

于 2008-09-12T15:55:42.613 に答える