複数のウィンドウ生成について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
luc
記事: 32
登録日時: 10年前

複数のウィンドウ生成について。

#1

投稿記事 by luc » 9年前

現在Win32API,C++で複数のウィンドウを表示させようと思ってますが上手くいきません。片方はゲーム用のウィンドウ、もう片方はEDITを使って名前を入力させるウィンドウにしようと思っています。
現在はウィンドウは表示されるが、名前入力のウィンドウのほうが上手く作動しません。
名前入力のプロシージャ関数が呼ばれないせいか、ゲーム用のウィンドウの動作になってしまっています。

コード:

TCHAR szClassName[] = TEXT("edit1"); // ウィンドウクラス。
TCHAR szClassName2[] = TEXT("edit2"); // ウィンドウクラス。

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// ウインドウプロシージャ関数
LRESULT CALLBACK WndProc1(HWND, UINT, WPARAM, LPARAM);	// ウインドウプロシージャ関数

BOOL InitApp(HINSTANCE);
BOOL InitApp1(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
BOOL InitInstance1(HINSTANCE, int);

HWND hWnd,hWnd2,hEWnd1,hBWnd1;		//ゲーム用、名前用、エディット用、ボタン用

int nameinput(HWND);
#define ID_EDIT1   1000
#define ID_BUTTON1    1020
TCHAR name[30];  //名前用

/////メイン関数///////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	
	MSG msg;

	
	if (!hPrevInstance) {
		if (!InitApp(hInstance))		//ゲーム用のウィンドウ初期化
			return FALSE;
	}
	if (!InitInstance(hInstance, nCmdShow)) {	//ゲーム用のウィンドウ生成
		return FALSE;
	}
	if (!hPrevInstance) {
		if (!InitApp1(hInstance))		//名前用のウィンドウ初期化
			return FALSE;
	}
	if (!InitInstance1(hInstance, nCmdShow)) {	//名前用のウィンドウ生成
		return FALSE;
	}

	while (true)
	{
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (msg.message == WM_QUIT) break;
			TranslateMessage(&msg);  //キーボード利用を可能にする
			DispatchMessage(&msg);
		}
		else
		{
			// WM_USER+1へ (ここがゲームループ)
			SendMessage(hWnd, WM_USER + 1, 0, 0);
			SendMessage(hWnd2, WM_USER + 1, 0, 0);

			// スリープ関数へ
			Sleep(20);
		}
	}
	
	return msg.wParam;
}

BOOL InitApp(HINSTANCE hInstance)
{
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(WNDCLASS));
	wc.style = CS_HREDRAW | CS_VREDRAW;         // ウインドウスタイル
	wc.lpfnWndProc = (WNDPROC)WndProc;                // ウインドウプロシージャアドレス
	wc.cbClsExtra = 0;                               // 補助領域サイズ(使用しない)
	wc.cbWndExtra = 0;                               // 補助領域サイズ(使用しない)
	wc.hInstance = hInstance;                       // インスタンスハンドル
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコン
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);     // マウスカーソル
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      // ウィンドウ画面の色
	wc.lpszMenuName = NULL;                            // ウインドウメニュー
	wc.lpszClassName = szClassName;                // ウインドウクラス名

	if (!RegisterClass(&wc)) return FALSE;
}

BOOL InitApp1(HINSTANCE hInstance)
{
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(WNDCLASS));
	wc.style = CS_HREDRAW | CS_VREDRAW;		 // ウインドウスタイル
	wc.lpfnWndProc = WndProc;				// ウインドウプロシージャアドレス
	wc.cbClsExtra = 0;						// 補助領域サイズ(使用しない)
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;				// インスタンスハンドル
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;   // ウインドウメニュー
	wc.lpszClassName = szClassName2;	// ウインドウクラス名

	// ウインドウクラスの登録
	if (!RegisterClass(&wc)) return FALSE;
}


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	hWnd = CreateWindow(
		szClassName,
		TEXT("title"),					// ウインドウのタイトル名
		WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,			// ウインドウスタイル
		250,												// ウィンドウの表示X座標
		100,												// ウィンドウの表示Y座標
		WINDOW_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2,						// ウィンドウの幅
		WINDOW_HEIGHT + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION),	// 高さ
		NULL,														// 親ウインドウ
		NULL,														// ウインドウメニュー
		hInstance,													// インスタンスハンドル
		NULL);														 // WM_CREATE情報
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	return TRUE;
}

BOOL InitInstance1(HINSTANCE hInstance, int nCmdShow)
{
	hWnd2 = CreateWindow(
		szClassName2,
		TEXT("title2"),					// ウインドウのタイトル名
		WS_OVERLAPPED | WS_SYSMENU,			// ウインドウスタイル
		250,												// ウィンドウの表示X座標
		100,												// ウィンドウの表示Y座標
		180,						// ウィンドウの幅
		150,						// 高さ
		NULL,														// 親ウインドウ
		NULL,														// ウインドウメニュー
		hInstance,													// インスタンスハンドル
		NULL);													 // WM_CREATE情報
	ShowWindow(hWnd2, nCmdShow);
	UpdateWindow(hWnd2);
	return TRUE;
}



//ゲーム用
///////ウインドウプロシージャ関数//////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	// 画像を読み込む準備
	HDC hdc;		// デバイスコンテキストハンドル
	PAINTSTRUCT ps; // ペイント構造体

	// バックバッファ用コンテキストハンドルと、ビットマップハンドルの準備
	static HDC hdc_back;	// 裏画面(バックバッファ)用デバイスコンテキストハンドル
	static HBITMAP hb_back;	// 裏画面(バックバッファ)用ビットマップハンドル

	switch (msg)
	{
	case WM_USER + 1:	// ゲームループ(SendMessageから呼ばれる)

		// 結果の再描画 WM_PAINTを実行する
		InvalidateRect(hWnd, NULL, false);
		return 0;

	case WM_PAINT:	// 画面を描画する時の処理

		hdc = BeginPaint(hWnd, &ps);	// 描画の開始
		Paint(hdc_back);				// Paint関数へ

		//バックバッファに保存された画像を表画面に描画
		BitBlt(hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, hdc_back, 0, 0, SRCCOPY);

		hdc = BeginPaint(hWnd, &ps);

		EndPaint(hWnd, &ps);			// 描画の終了

		return 0;

	case WM_CREATE:

		frr.SetSampleNum(100);
		Init_Game();		//ゲーム初期化


		HINSTANCE hInstance;
		hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
		
		hdc = GetDC(hWnd);

		// 描画の開始
		hdc = GetDC(hWnd);
		// 互換デバイスコンテキストの作成
		hdc_back = CreateCompatibleDC(hdc);
		// 互換ビットマップの作成
		hb_back = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);

		// オブジェクトの選択
		SelectObject(hdc_back, hb_back);
		// 描画の終了
		ReleaseDC(hWnd, hdc);

		//シーン用BITMAP
		menu_hb[Title] = (HBITMAP)LoadImage(NULL, TEXT("res/bgImage/title.bmp"), IMAGE_BITMAP,
			0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
		menu_hb[End] = (HBITMAP)LoadImage(NULL, TEXT("res/bgImage/end.bmp"), IMAGE_BITMAP,
			0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

		return 0;


	case WM_DESTROY:	// 最後にウインドウが閉じられた時の処理
		// デバイスコンテキストの解放
		DeleteDC(hdc_back);
		DeleteObject(hb_back);
		DeleteObject(menu_hb);
		PostQuitMessage(0);
		return 0;

	default:	// デフォルト処理
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}
	return 0L;
}

//名前入力
LRESULT CALLBACK WndProc1(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	int id;
	PAINTSTRUCT ps;
	HDC hdc;
	HINSTANCE hInst;

	switch (msg) {

	case WM_USER + 1:	// ゲームループ(SendMessageから呼ばれる)
		InvalidateRect(hWnd, NULL, false);
		return 0;

	case WM_CREATE:
		hInst = ((LPCREATESTRUCT)lParam)->hInstance;
		hEWnd1 = CreateWindow(TEXT("EDIT"),		//名前入力の欄
			TEXT("名前を入力"),
			WS_CHILD | WS_VISIBLE,
			60, 10,
			100, 20,
			hWnd,
			(HMENU)ID_EDIT1,
			hInst,
			NULL);
		hBWnd1 = CreateWindow(TEXT("BUTTON"),		//決定ボタン
			TEXT("決定"),
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			30, 50,
			100, 30,
			hWnd,
			(HMENU)ID_BUTTON1,
			hInst,
			NULL);

		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		TextOut(hdc, 10, 10, TEXT("名前:"), 3);
		EndPaint(hWnd, &ps);
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case ID_BUTTON1:
			GetWindowText(hEWnd1, name, 30);
			nameinput(hWnd);	//
			break;
		default:
			return(DefWindowProc(hWnd, msg, wParam, lParam));
		}
		break;
	case WM_CLOSE:
		id = MessageBox(hWnd,
			TEXT("終了してもよいですか"),
			TEXT("終了確認"),
			MB_YESNO | MB_ICONQUESTION);
		if (id == IDYES) {
			DestroyWindow(hWnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return (DefWindowProc(hWnd, msg, wParam, lParam));
	}
	return 0L;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 複数のウィンドウ生成について。

#2

投稿記事 by みけCAT » 9年前

luc さんが書きました:

コード:

BOOL InitApp(HINSTANCE hInstance)
{
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(WNDCLASS));
	wc.style = CS_HREDRAW | CS_VREDRAW;         // ウインドウスタイル
	wc.lpfnWndProc = (WNDPROC)WndProc;                // ウインドウプロシージャアドレス
	wc.cbClsExtra = 0;                               // 補助領域サイズ(使用しない)
	wc.cbWndExtra = 0;                               // 補助領域サイズ(使用しない)
	wc.hInstance = hInstance;                       // インスタンスハンドル
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコン
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);     // マウスカーソル
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);      // ウィンドウ画面の色
	wc.lpszMenuName = NULL;                            // ウインドウメニュー
	wc.lpszClassName = szClassName;                // ウインドウクラス名

	if (!RegisterClass(&wc)) return FALSE;
}

BOOL InitApp1(HINSTANCE hInstance)
{
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(WNDCLASS));
	wc.style = CS_HREDRAW | CS_VREDRAW;		 // ウインドウスタイル
	wc.lpfnWndProc = WndProc;				// ウインドウプロシージャアドレス
	wc.cbClsExtra = 0;						// 補助領域サイズ(使用しない)
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;				// インスタンスハンドル
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;   // ウインドウメニュー
	wc.lpszClassName = szClassName2;	// ウインドウクラス名

	// ウインドウクラスの登録
	if (!RegisterClass(&wc)) return FALSE;
}
せっかくWndProc1関数を作ったのに、どうして両方WndProcを使っているのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

luc
記事: 32
登録日時: 10年前

Re: 複数のウィンドウ生成について。

#3

投稿記事 by luc » 9年前

見落としてました・・・ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る