質問: Info->GetStyle(); if( dwStyle & WS_BORDER ){ MsgBox.Show( "Found" ); // WS_BORDER があれば "Found" というメッセージボックスを表示 }else{ MsgBox.Show( "Not Found" ); } // 試しに Edit1 を非表示にしてみる。 ShowWindow( hEdit, SW_HIDE ); delete Info; break; case WM_DESTROY: delete Edit1; PostQuitMessage( 0 ); break; } return DefWindowProc( hWnd, msg, wp, lp ); } ``` みたいにしました。 すると、 "Not Found" というMessageBox表示後、 Edit1 に相当する部分が非表示になりました。 非表示になるということは、hEdit は ウィンドウハンドルで、ちゃんと格納されているってことですよね。 なので 1 & 3 は違うと思います。 "2. そもそも WS_BORDERが設定されていない" ... (パターンからすると)ありえそうですが、 コードを見ると設定されていると思います。 ( 実際、実行時も 黒のボーダーが Edit1 に相当する部分に出ていますから。 ) よって、2もあり得ないと思います。 --- Chironianさん。 どうしてもパターンが思いつかない ( 一応、思いついたものはすべてやりました。 ) のでネットで検索したところ、 エディットコントロール [VC++の使い方] - トップ [nitoyon . com] がヒットしました。 これによると ``` リソースエディタで作成するような枠をつけたい場合は、 WS_EX_CLIENTEDGE スタイルを有効にするのがよいでしょう。 CreateWindowEx(WS_EX_CLIENTEDGE, ...); とします。 (省略した残りの引数は、CreateWindow 関数と同じものを書く。 ただし、WS_BORDER ははずしておいたほうがよいでしょう) ``` とありました。 なので ``` 1. ( Createメンバ関数内 ) CreateWindowEx の第一引数としてWS_EX_CLIENTEDGE を渡し、 通常のウィンドウスタイルから WS_BORDER をはずしておく 2. ( SetBorderメンバ関数が呼ばれたら ) WS_EX_CLIENTEDGE を外す ``` みたいにしようかと思っています。 ありがとうございます!!
回答: こんにちは。 単にWindows APIの使い方の問題ではないかと思います。 VBなども、結局Windows APIを使って実装していますから。 現象から、少なくともWM_BORDERがhEditが示すウィンドウに設定されていないのは間違いないように思います。(何か見落としがあったらごめんなさい。) hEditにWM_BORDERが設定されていない原因として考えられることは多数あります。 1. そもそもウィンドウ・ハンドルではない 2. そもそもWM_BORDERが設定されていない 3. WM_BORDERが設定されていてもまだ反映されていない 一番疑わしいのは3.ですね。例えばShowWindowしないと反映されないとかあるかも知れません。(これは単なる思いつきです。昔、この辺の振る舞いが読めなくて苦労した記憶があるので、意外な振る舞いを想定してみただけです。) Windows APIの振る舞いを確認することは結構重要です。意外な振る舞い(というか振る舞いを理解しそこなうこと)は多いですから。 FindWindowして得たhWndに対して同様なことをやってみるとか、Spy++を使ってウィンド・スタイルを見てるとのは有用と思います。(昔のSpyは確か見れたと思います。今のSpy++が見れるかどうかは把握していません。見れなかったらすいません。)