子ウィンドウについて

解決


ごま  2003-02-14 14:19:10  No: 51058  IP: [192.*.*.*]

SDKにて作成しています。
親ウィンドウのメニュー選択から子ウィンドウを呼び出し子ウィンドウを表示しています。

static HWND hWndChild = CreateWindow(
    szClassEditName,
    "Edit",
    WS_CHILD | WS_VISIBLE | WS_SYSMENU | WS_CAPTION |
    WS_MINIMIZEBOX | WS_CLIPSIBLINGS,
    x0, y0, cx, cy, 
    hWnd,
    NULL,
    hInst,            
    NULL              
    );
親ウィンドウからこんな感じで呼び出しています。

ここで聞きたいのが、子ウィンドウにはメニューコントロールの表示はできないのでしょうか?仮に

WNDCLASS wc;  // WNDCLASS構造体
ZeroMemory( &wc,sizeof(WNDCLASS) );
wc.style  = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc  = EditProg;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance=hInst;
wc.hIcon  = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName= (LPCSTR)IDM_EDIT;  //メニューの設定
wc.lpszClassName  = (LPCSTR)szClassEditName;
RegisterClass(&wc);  //ウィンドウ クラスを登録
ウィンドウクラスにてメニュー設定をすれば、メニューコントロール表示します。

上記の設定でWS_CHILDはWS_POPUPは併用できないとヘルプで書いてあったので、WS_POPUPWINDOWを加えての話です。これも併用していいのかわからないのですが・・・このような場合はどうしたらいいのでしょうか?  子ウィンドウではいけないのでしょうか?  

ここで続けて書いていいのかわかりませんが、この話の続きですが、
仮に、この方法でWS_POPUPWINDOWでメニュー表示をさせ、その中の機能の1つにこの子ウィンドウを閉じるというイベントを入れたのですが、この時は,
DestroyWindow(hWnd)にて呼び出し、子ウィンドウは閉じるのですが、もう一度親ウィンドウから子ウィンドウを呼び出すともう子ウィンドウが表示されないのです。デバッグではどうやら、子ウィンドウに入り、上記の(wc.lpfnWndProc)
設定でいうEditProgのメッセージの処理をするイベントが起こらないのです。
デバッグで一回だけ子ウィンドウを表示出来るときは、イベントは起きてるのですが、子ウィンドウを閉じて2度目からはもうイベントが起きません。
すいません、上記の2つの内容がわからなくて非常に困っています。
どなから教えてください。宜しくお願いします。

編集 削除
YuO  2003-02-14 15:32:38  No: 51059  IP: [192.*.*.*]

> static HWND hWndChild = CreateWindow(
>   szClassEditName,
>     "Edit",
>     WS_CHILD | WS_VISIBLE | WS_SYSMENU | WS_CAPTION |
>     WS_MINIMIZEBOX | WS_CLIPSIBLINGS,
>     x0, y0, cx, cy, 
>     hWnd,
>     NULL,
>     hInst, 
>     NULL 
>     );
> 親ウィンドウからこんな感じで呼び出しています。

staticについて,ちゃんとわかっているのでしょうか?
関数内のstatic変数は,その関数が最初に呼び出されたときのみ初期化されます。
つまり,このCreateWindowは最大で一度だけ呼び出されます。


> ここで聞きたいのが、子ウィンドウにはメニューコントロールの表示はできないのでしょうか?

できないです。
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/menus/aboutmenus.asp
に,
>Only an overlapped or pop-up window can contain a menu bar; a child window cannot contain one.
とあります。


> 仮に、この方法でWS_POPUPWINDOWでメニュー表示をさせ、その中の機能の1つにこの子ウィンドウを閉じるというイベントを入れた のですが、この時は,
> DestroyWindow(hWnd)にて呼び出し、子ウィンドウは閉じるのですが、もう一度親ウィンドウから子ウィンドウを呼び出すともう子ウィンド ウが表示されないのです。デバッグではどうやら、子ウィンドウに入り、上記の(wc.lpfnWndProc)
> 設定でいうEditProgのメッセージの処理をするイベントが起こらないのです。
> デバッグで一回だけ子ウィンドウを表示出来るときは、イベントは起きてるのですが、子ウィンドウを閉じて2度目からはもうイベントが起 きません。

そりゃ,DestroyWindowによって,hWndChildは正規なウィンドウではなくなっていますから。

編集 削除
ごま  2003-02-14 16:33:34  No: 51060  IP: [192.*.*.*]

YuOさんありがとうございます。
確認してみましt。やはりそうでした。
画面のレイアウトから考え直してみます。

編集 削除