プロが教えるわが家の防犯対策術!

ダイアログボックスで指定したサイズがメイン上では約2倍の大きさになって表示されてしまい、困っています。

メニューリソースは以下のとおりです。
MYDLG DIALOG DISCARDABLE 25, 50, 100, 150
STYLE WS_VISIBLE | WS_CHILD | DS_CONTROL
CAPTION "Dialog"
FONT 9, "MS Pゴシック"
BEGIN
END

WndProc内にダイアログを貼り付けています。
if(hDlgWnd) break;
hDlgWnd = CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),"MYDLG",hWnd,DialogProc);

それが実際にウィンドウを開くとダイアログがだいたいですが(50,115,200,340)のように表示されてしまいます。

VC++ Ver.6.0です。コンパイラ等の問題でしょうか。
ご存知の方、宜しくお願いします。

A 回答 (2件)

★コンパイラ等の問題ではありません。


・もともとダイアログのサイズはピクセル数での指定ではないのです。
 この基本を知らないと今回の質問が出てくるようですね。
 ダイアログは『ダイアログ・ベース単位』でサイズが決まります。
 これはダイアログに設定されているフォントの高さなどから変化するのです。
 次のリンクを読んで下さい。
 http://wisdom.sakura.ne.jp/system/winapi/win32/w …→『ダイアログ』
 かなり最初の方に
>ただし、ダイアログで指定する座標、サイズはピクセルではないので注意してください
>ダイアログの場合、座標系は文字サイズを基準としているのです
 という事が書かれています。

解決策:
・CreateDialog() でダイアログを作成したときにダイアログの WM_INITDIALOG で
 ウインドウのサイズをピクセル値で設定しなおす処理を行います。
 つまりは
 case WM_INITDIALOG:
  SetWindowPos( hDlg, NULL, 25, 50, 100, 150, (SWP_NOZORDER|SWP_NOOWNERZORDER) );
  return TRUE;
 という記述を追加します。
 重要なのは SetWindowPos() 関数でウインドウの位置とサイズをピクセル値で
 設定することです。
・以上。『ダイアログ・ベース単位』と『ピクセル値』は違います。注意。

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/w …
    • good
    • 0
この回答へのお礼

ありがとうございます。解決いたしました。
サイトはAPIを書くうえで参考にしていましたが、ダイアログに関する記述は見落としていたようです。
大変勉強になりました。

お礼日時:2007/09/10 12:29

リソースファイル内のダイアログの座標は画素単位じゃなくて,


「ダイアログテンプレート単位」だということはご存知ですか?

http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
→ ダイアログの座標系 (ダイアログテンプレート単位とダイアログベース単位)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
大変参考になりました。

お礼日時:2007/09/10 12:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A