WM_CREATEメッセージを受けて
hChdWnd = CreateControlWindow(hwnd,20,10,100,100,0,BS_PUSHBUTTON,"終了","BUTTON",(HMENU)ID_STOP,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE));
のようにボタンを作成しようとしたのですが、ボタンの表示されるべき場所のウィンドウが透明になって下にあるウィンドウ(デスクトップ含む)が透けて見えている状態でボタンが表示されません。
ボタンを押したり、ウィンドウの位置を変えたりすると表示されるようになります。
どうすればはじめからボタンが表示されるようにできますでしょうか?
環境は Windows2000、VC++6.0(SP5)、SDKです。
この関数を呼び出してボタンを作成しています。
HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,int dwExStyle ,int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,HMENU ChildID,HINSTANCE hInstance)
{
return CreateWindowEx(dwExStyle,ClassName,Caption,WS_CHILD | WS_VISIBLE | dwFlag ,
Left, Top, Width, Height, hwndParent, ChildID, hInstance, NULL);
}
WM_CREATEではなくWM_INITDIALOGメッセージですれば問題ないと思います。
WM_CREATEメッセージを受けた時点では、まだウィンドウが作成されていないため
そのような結果になったんだと思います。
返信ありがとうございます。
扱っているのがダイアログでないので、「WM_INITDIALOG」を受けるのは無理みたいです。
起動時に設定をファイルから読み込んでそれにしたがって背景の表示とボタンの作成をしたいのですが、背景の表示はなんとかなりました。
後はとりあえずボタンが表示できるようになればいいのですが、Cを使い始めたばかりということもあって、検討がつきません。
引き続き助言お願いします。
ボタンの親にWS_CLIPCHILDRENスタイルを設定してますか?
http://www.kumei.jp/c_lang/sdk/sdk_28.htm
この辺がそのままの例かな?
返信ありがとうございます。
早速試してみました。
いぶさん>WS_CLIPCHILDRENスタイルはついています。実は初めはつけていなかったのですが、背景表示について質問させていただいた時に付けるようにと回答していただいたのでMSDNで意味を調べて付けました。
silver foxさん>紹介していただいたページととことん比較してみました。
ボタン作成のあたりではやはり問題はないようなので、まさかとは思いつつも他のところ(親ウィンドウ作成)も比較していくと
UpdateWindow(hWnd);
が抜けていました。これを入れるとこれまでうまくいかなかったのが嘘のようにボタンもウィンドウもちゃんと表示されました。
なぜ消してしまっていたのかわかりませんが、とりあえず解決しました。
ありがとうございました。
また質問させていただくことがあると思いますが、そのときはよろしくお願いします。
ツイート | ![]() |