電子書籍の厳選無料作品が豊富!

お世話になります。
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);

のようになっています。ポップアップウィンドウが消えないのはなぜでしょうか。。。

A 回答 (4件)

★スプラッシュ画面を出したいの?


・スプラッシュ画面を CreateWindow() で試したことはありませんが WinMain() の
 書き方とかがおかしいような気がします。
 私なら次のようにします。

サンプル:
int WINAPI WinMain( … )
{
 /* モードレスダイアログを作成 */
 
 /* 時間の掛かる処理 */
 
 /* モードレスダイアログを閉じる */
 
 /* メインのウインドウを作成 */
 
 /* メッセージループを構成 */
 
 return 0;
}

その他:
・上記のようにモードレスダイアログをスプラッシュ画面として利用します。
 サンプルではタスクトレイに常駐するタイプの非表示ウインドウや起動時に時間が
 かかる場合のスプラッシュ・ウインドウの一般的な方法です。
 WM_CREATE でモードレスダイアログを出す方法もあるでしょうね。
 試していないけど。
・以上。ちなみにメインのプロシージャはありますよね?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/13 00:25

消えないのはポップアップウィンドウでしたね。

。。;
したのWM_CLOSEの処理を追加すればSendMessageやPostMessage
などでWM_CLOSEを送ることでそのWindowを破壊できます。
    • good
    • 0
この回答へのお礼

すみませんやっと原因が分かりました。
グローバルにしていたつもりのhhwndが、CreateWindowの戻り値を受け取るときにローカルになっていました。。

本当にご迷惑おかけして申し訳ありません。みなさまご回答どうもありがとうございましたm(__)m

お礼日時:2007/10/13 00:36

>PostMessage( hhwnd, WM_CLOSE, 0, 0 );


>って感じで消えると思いますが ・・・
質問者のプロシージャはWM_CLOSEを処理していないので、
送っても無視されるでしょうね。。。

プロシージャのメッセージ処理をクローズと
デストロイに対して処理することで終了させます。
#WinMainでどのようなコードが書かれているか知りませんが。。。

case WM_DESTROY:
 //DestroyWindowがコールされた場合Windowsに対し
 //アプリケーションが終了することを通知する
 PostQuitMessage( 0 );
 break;

case WM_CLOSE:
 //Windowの×ボタンなどが押された場合の処理
 DestroyWindow( hWnd );
 break;
    • good
    • 0

hhwndに有効なハンドルが返ってきているんですよね


メインの WndProcの中でそのハンドルが見えているのであれば
PostMessage( hhwnd, WM_CLOSE, 0, 0 );
って感じで消えると思いますが ・・・
    • good
    • 0

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