-PR-

解決済みの質問

質問No.8006789
困ってます
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数3
閲覧数135
子ウィンドウの作成方法
#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;
}

子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。
しかし、うまくいきません。
一体なにがダメなんでしょうか?
投稿日時 - 2013-03-22 23:59:37

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

回答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 11:41:09
この回答を支持する
(現在0人が支持しています)
お礼
回答ありがとうございます。
デバッガを使って一行一行実行していたのですが、
自分のソースコードではない、ヘッダーファイルに飛んだりして
よくわからなくなったので、質問してしまいました。
丁寧な回答重ねて感謝します。
投稿日時 - 2013-03-23 17:40:59

ベストアンサー以外の回答 (2)

回答No.3
変換ミス。
「修了」->「終了」
orz
投稿日時 - 2013-03-23 11:42:58
この回答を支持する
(現在0人が支持しています)
回答No.1
こんにちは。

wc2.lpszClassName = szClassName;



wc2.lpszClassName = szClassName2;

じゃないでしょうか。
投稿日時 - 2013-03-23 10:54:48
この回答を支持する
(現在0人が支持しています)
お礼
回答ありがとうございます。
投稿日時 - 2013-03-23 17:42:07
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる

関連するQ&A

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

回答募集中

同じカテゴリの人気Q&Aランキング

カテゴリ
C・C++
-PR-
-PR-

特集

背筋がゾクゾクする心霊体験を要チェック!

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

発見や気づきのある調査結果をお届け!

このQ&Aの関連キーワード

同じカテゴリの人気Q&Aランキング

カテゴリ
C・C++
-PR-

回答のついた最新のQ&A

カテゴリ
C・C++

rss

who_ray_sis

Q_icon目標地点への移動2014-07-27 17:10:07

ピックアップ

-PR-