質問

ボタン コントロールを作成するにはどうすればよいですか ( CreateWindowBUTTON 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 そして tmAveCharWidthTEXTMETRIC それぞれ構造体)を作成し、自分で MulDiv で翻訳し、 ない限り ダイアログが表示されている場合、 MapDialogRect() あなたの代わりにすべての仕事をします。

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

見る:


よりシンプルな代替案

サイズを自動的に変更したいコントロールがボタンだけである場合は、次のコマンドを使用することもできます。 BCM_GETIDEALSIZE メッセージ Button_GetIdealSize() マクロ (Windows XP 以降のみ) を使用して、ボタンに含まれるものすべてに適合する最適な幅と高さを取得します。ただし、ボタンのテキストの周囲に余白が適用されていないと非常に見苦しくなります。

他のヒント

MSDN は次のように述べています。 設計仕様とガイドライン - ビジュアル デザイン:レイアウト.

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

マップダイアログ四角形 関数が代わりに計算を行ってくれるようです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top