• 締切済み

ウィンドウが閉じない

お世話になります。 Adobe Illustratorは起動時にポップアップウィンドウを表示してプラグインを読み込む処理をリアルタイムに見せていますが、それに似た処理をしたいと思っています。 WinMain関数でポップアップウィンドウを生成した後メインウィンドウを生成し、メインウィンドウのWM_CREATEの最後でポップアップウィンドウを消すため ShowWindow(hhwnd, SW_HIDE); や DestroyWindow(hhwnd); を入れました。 ですが、ポップアップウィンドウが消えてくれません。 ポップアップウィンドウは winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = sWndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInst; winc.hIcon = NULL; winc.hCursor = LoadCursor(NULL, IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("START"); HWND hhwnd = CreateWindowEx(  WS_EX_TOOLWINDOW,  "START", "",  WS_POPUP | WS_VISIBLE | WS_BORDER ,  0 , 0 , 1 , 1 , NULL , NULL ,  hInst , NULL ); で生成し、ウィンドウプロシージャ内は HDC hdc; PAINTSTRUCT ps; static RECT re; int w = 600; int h = 30; switch (msg) { case WM_CREATE:  MoveWindow(hWnd,   (GetSystemMetrics(SM_CXSCREEN)-w)/2,   (GetSystemMetrics(SM_CYSCREEN)-h)/2,   w, h, 1);  InvalidateRect(hWnd, NULL, 1);  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  SetTextColor(hdc, RGB(0, 0, 0));  if (DrawText(hdc, str, -1, &re, DT_SINGLELINE | DT_CENTER | DT_VCENTER) == 0)   MessageBox(NULL, "err", "", NULL);  EndPaint(hWnd, &ps);  return 0; case WM_SIZE:  GetClientRect(hWnd, &re);  break; } return DefWindowProc(hWnd, msg, wp, lp); のようになっています。ポップアップウィンドウが消えないのはなぜでしょうか。。。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

消えないのはポップアップウィンドウでしたね。。。; したのWM_CLOSEの処理を追加すればSendMessageやPostMessage などでWM_CLOSEを送ることでそのWindowを破壊できます。

masaota56
質問者

お礼

すみませんやっと原因が分かりました。 グローバルにしていたつもりのhhwndが、CreateWindowの戻り値を受け取るときにローカルになっていました。。 本当にご迷惑おかけして申し訳ありません。みなさまご回答どうもありがとうございましたm(__)m

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>PostMessage( hhwnd, WM_CLOSE, 0, 0 ); >って感じで消えると思いますが ・・・ 質問者のプロシージャはWM_CLOSEを処理していないので、 送っても無視されるでしょうね。。。 プロシージャのメッセージ処理をクローズと デストロイに対して処理することで終了させます。 #WinMainでどのようなコードが書かれているか知りませんが。。。 case WM_DESTROY:  //DestroyWindowがコールされた場合Windowsに対し  //アプリケーションが終了することを通知する  PostQuitMessage( 0 );  break; case WM_CLOSE:  //Windowの×ボタンなどが押された場合の処理  DestroyWindow( hWnd );  break;

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

hhwndに有効なハンドルが返ってきているんですよね メインの WndProcの中でそのハンドルが見えているのであれば PostMessage( hhwnd, WM_CLOSE, 0, 0 ); って感じで消えると思いますが ・・・

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★スプラッシュ画面を出したいの? ・スプラッシュ画面を CreateWindow() で試したことはありませんが WinMain() の  書き方とかがおかしいような気がします。  私なら次のようにします。 サンプル: int WINAPI WinMain( … ) {  /* モードレスダイアログを作成 */    /* 時間の掛かる処理 */    /* モードレスダイアログを閉じる */    /* メインのウインドウを作成 */    /* メッセージループを構成 */    return 0; } その他: ・上記のようにモードレスダイアログをスプラッシュ画面として利用します。  サンプルではタスクトレイに常駐するタイプの非表示ウインドウや起動時に時間が  かかる場合のスプラッシュ・ウインドウの一般的な方法です。  WM_CREATE でモードレスダイアログを出す方法もあるでしょうね。  試していないけど。 ・以上。ちなみにメインのプロシージャはありますよね?

masaota56
質問者

お礼

回答ありがとうございます。 普通はダイアログでするんですね。独学なため変な方法でしてしまっていたようで^^; メインのプロシージャはあります。その中のWM_CREATEで画像を並べるのに時間がかかるためこの処理を入れようと考えました。