質問
ボタン コントロールを作成するにはどうすればよいですか ( CreateWindow
の BUTTON
window クラス) は、他の Windows アプリケーションと一致する標準のシステム全体のサイズ (特に高さ) を持っていますか?もちろん DPI とおそらく他の設定も考慮する必要があります。
述べる: 使用する
USE_CW_DEFAULT
幅と高さを指定すると、サイズ 0、0 のボタンが表示されるため、これは解決策ではありません。
解決 2
完璧で手間のかからない世界では...
標準サイズのボタンを作成するには、次のようにする必要があります。
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()
関数 ドキュメントのコメント。
完璧なものなんてない
しかし Anders 氏が指摘したように、これらのメトリクスはシステム フォントに基づいています。ウィンドウにシェル ダイアログ フォント、または目が血にならないようなフォントが使用されている場合は、ほぼ自分で大丈夫です。
独自の「ダイアログ」基本単位を取得するには、次のコマンドを使用して現在のテキスト メトリックを取得する必要があります。 GetTextMetrics()
文字の高さと平均的な幅を使用します (tmHeight
そして tmAveCharWidth
の TEXTMETRIC
それぞれ構造体)を作成し、自分で MulDiv で翻訳し、 ない限り ダイアログが表示されている場合、 MapDialogRect()
あなたの代わりにすべての仕事をします。
ご了承ください tmAveCharWidth
実際の平均文字幅を近似しているだけなので、使用することをお勧めします。 GetTextExtentPoint32()
代わりにアルファベット文字セットで関数を使用します。
見る:
よりシンプルな代替案
サイズを自動的に変更したいコントロールがボタンだけである場合は、次のコマンドを使用することもできます。 BCM_GETIDEALSIZE
メッセージ Button_GetIdealSize()
マクロ (Windows XP 以降のみ) を使用して、ボタンに含まれるものすべてに適合する最適な幅と高さを取得します。ただし、ボタンのテキストの周囲に余白が適用されていないと非常に見苦しくなります。
他のヒント
MSDN は次のように述べています。 設計仕様とガイドライン - ビジュアル デザイン:レイアウト.
ボタンのデフォルトのサイズは 50x14 DLU で、次の例を使用してピクセル単位で計算できます。 GetDialogBaseUnits.
の マップダイアログ四角形 関数が代わりに計算を行ってくれるようです。
@マクバーディ:GetDialogBaseUnits() は使用しないでください。これはデフォルトのシステム フォント (醜いビットマップ フォント) に基づいています。MapDialogRect() を使用する必要があります。