-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
    -PR-
    -PR-

    その他の回答 (全2件)

    • 2013-03-23 10:54:48
    • 回答No.1
    こんにちは。 wc2.lpszClassName = szClassName; は wc2.lpszClassName = szClassName2; じゃないでしょうか。 ...続きを読む
    こんにちは。

    wc2.lpszClassName = szClassName;



    wc2.lpszClassName = szClassName2;

    じゃないでしょうか。
    お礼コメント
    回答ありがとうございます。
    投稿日時 - 2013-03-23 17:42:07
    • ありがとう数0
    • 2013-03-23 11:42:58
    • 回答No.3
    変換ミス。 「修了」->「終了」 orz
    変換ミス。
    「修了」->「終了」
    orz
    • ありがとう数0
    • 回答数3
    • 気になる数0
    • ありがとう数0
    • ありがとう
    • なるほど、役に立ったなど
      感じた思いを「ありがとう」で
      伝えてください
    • 質問する
    • 知りたいこと、悩んでいることを
      投稿してみましょう
    こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
    このQ&Aにはまだコメントがありません。
    あなたの思ったこと、知っていることをここにコメントしてみましょう。

    関連するQ&A

    -PR-
    -PR-

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

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

    特集


    成功のポイントとは?M&Aで経営の不安を解決!

    -PR-

    ピックアップ

    -PR-
    ページ先頭へ