総ありがとう数 累計4,263万(2014年9月30日現在)

毎月4,000万人が利用!Q&Aでみんなで助け合い!

-PR-
youhelp-

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
TCHAR szClassName[] = TEXT("Window01");
TCHAR szClassName2[] = TEXT("Window02");

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){
MSG msg;
BOOL bRet;
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
WNDCLASSEX wc2;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(
NULL, MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(
NULL, MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.hIconSm = (HICON)LoadImage(
NULL, MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);

wc2.cbSize = sizeof(WNDCLASSEX);
wc2.style = CS_HREDRAW | CS_VREDRAW;
wc2.lpfnWndProc = WndProc;
wc2.cbClsExtra = 0;
wc2.cbWndExtra = 0;
wc2.hInstance = hInst;
wc2.hIcon = (HICON)LoadImage(
NULL, MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
wc2.hCursor = (HCURSOR)LoadImage(
NULL, MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
wc2.hbrBackground =
(HBRUSH)GetStockObject(BLACK_BRUSH);
wc2.lpszMenuName = NULL;
wc2.lpszClassName = szClassName;
wc2.hIconSm = (HICON)LoadImage(
NULL, MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
if((RegisterClassEx(&wc)||RegisterClassEx(&wc2)==0))
return 0;
return TRUE;
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;
HWND hWnd2;


hWnd = CreateWindow(szClassName,
TEXT("親ウィンドウ"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL
);
if(!hWnd) return FALSE;

hWnd2 = CreateWindow(szClassName2,
TEXT("子ウィンドウ"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
hWnd,
NULL,
hInst,
NULL
);
if(!hWnd2) return FALSE;

ShowWindow(hWnd, nCmdShow);
ShowWindow(hWnd2, nCmdShow);

UpdateWindow(hWnd);
UpdateWindow(hWnd2);

return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}

子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。
しかし、うまくいきません。
一体なにがダメなんでしょうか?
  • 回答数3
  • 気になる数0

Aみんなの回答(全3件)

質問者が選んだベストアンサー

  • 2013-03-23 11:41:09
  • 回答No.2
お決まりのセリフから。
「うまくいきません。」とはどういう現象ですか?

次に、質問。
「デバッグ」とか「デバッガ」という単語を知っていますか?

最後に回答。
プログラムをコピペしてデバッグしたところ、WinMainの最初、
if (!InitApp(hCurInst))
return FALSE;
でプログラムが修了してしまっています。
そこで、InitAppの中を追っかけると、
if((RegisterClassEx(&wc)||RegisterClassEx(&wc2)==0))
return 0;
で 0 を返しています。
RegisterClassExは「関数が成功すると、0 以外の値が返ります。」
従って、ここのコードは、
if((RegisterClassEx(&wc==0)||RegisterClassEx(&wc2)==0))
が正しいと思われます。しかし、ここを修正しても、まだウィンドウは表示されません。
そこで RegisterClassEx(&wc)とRegisterClassEx(&wc2)を順次呼び出してみると、&wc2の方が失敗しています。
wc2の設定内容をよく見ると、
wc2.lpszClassName = szClassName;
というコードがあります。これはwcに設定したものと同じものです。
これを
wc2.lpszClassName = szClassName2;
に修正してコンパイル、実行してみると、めでたく「親ウインドウ」、「子ウィンドウ」が表示されました。
(WinMainの他の内容、WndProcの内容は見ていないので、あしからず。)

デバッガを使えば、原因調査に5分もかかりません。
お礼コメント
回答ありがとうございます。
デバッガを使って一行一行実行していたのですが、
自分のソースコードではない、ヘッダーファイルに飛んだりして
よくわからなくなったので、質問してしまいました。
丁寧な回答重ねて感謝します。
投稿日時 - 2013-03-23 17:40:59
  • 同意数0(0-0)
  • ありがとう数0

その他の回答 (全2件)

  • 2013-03-23 10:54:48
  • 回答No.1
こんにちは。

wc2.lpszClassName = szClassName;



wc2.lpszClassName = szClassName2;

じゃないでしょうか。
お礼コメント
回答ありがとうございます。
投稿日時 - 2013-03-23 17:42:07
通報する
  • 同意数0(0-0)
  • ありがとう数0
  • 2013-03-23 11:42:58
  • 回答No.3
変換ミス。
「修了」->「終了」
orz
通報する
  • 同意数0(0-0)
  • ありがとう数0
  • 回答数3
  • 気になる数0
  • ありがとう数0
  • ありがとう
  • なるほど、役に立ったなど
    感じた思いを「ありがとう」で
    伝えてください

関連するQ&A

その他の関連するQ&Aをキーワードで探す

別のキーワードで再検索する

あなたの悩みをみんなに解決してもらいましょう

  • 質問する
  • 知りたいこと、悩んでいることを
    投稿してみましょう
-PR-
-PR-
-PR-

特集

正しい方法で健康的な綺麗を手に入れよう!

お城、ボート、ツリーハウス、ユニークな物件満載!

親同士が気軽に情報交換できるコミュニティです。

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ