创建父窗口和子窗口,子窗口在父窗口里

#include <windows.h>
#include <stdio.h>

//声明窗口回调函数
LRESULT CALLBACK WinParentProc(
	HWND hWnd,		// 窗口句柄
	UINT uMsg,		// 消息ID
	WPARAM wParam,	// 第1个消息参数
	LPARAM lParam	// 第2个消息参数
);

LRESULT CALLBACK WinChildProc(
	HWND hWnd,		// 窗口句柄
	UINT uMsg,		// 消息ID
	WPARAM wParam,	// 第1个消息参数
	LPARAM lParam	// 第2个消息参数
);
HWND hParentWnd;
HWND hChildWnd;
HWND CreateParentWindows(HINSTANCE hInstance)
{
	//1. 注册窗口
	WNDCLASS wc;	//定义并填充窗口类

	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);	//CreateSolidBrush
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WinParentProc;	//重点:指定窗口消息的处理函数
	wc.lpszClassName = "Itjob2010";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
 
	if(0 == RegisterClass(&wc)) return NULL;		//注册窗口
 
	//2. 创建窗口
	HWND hWnd = CreateWindow(
		wc.lpszClassName,	//窗口类名称
		"一个简单的Win32程序",	//窗口标题
		WS_OVERLAPPEDWINDOW,	//窗口风格,定义为普通型
		0,						//窗口位置的x坐标
		0,						//窗口位置的y坐标
		900,					//窗口的宽度
		700,					//窗口的高度
		NULL,					//父窗口句柄
		NULL,					//菜单句柄
		hInstance,				//应用程序实例句柄
		NULL);					//窗口创建数据指针
	if (hWnd == NULL) return  NULL;

	//3. 显示窗口
	ShowWindow(hWnd, SW_SHOWNORMAL);

	//4. 更新窗口
	UpdateWindow(hWnd);
	return hWnd;

}


HWND CreateChildWindows(HINSTANCE hInstance)
{
	//1. 注册窗口
	WNDCLASS wc;	//定义并填充窗口类
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);	//CreateSolidBrush
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WinChildProc;	//重点:指定窗口消息的处理函数
	wc.lpszClassName = "wuciqiu12";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; 
	RegisterClass(&wc);
//	if(0 == )	
//	{
//		DWORD err = ::GetLastError();
//		return NULL;
//				//注册窗口
//	}
 
	//2. 创建窗口
	HWND hWnd = CreateWindow(
		wc.lpszClassName,	//窗口类名称
		"第二个窗口",	//
		WS_OVERLAPPEDWINDOW | WS_CHILD ,	//窗口风格,定义为普通型
		0,						//窗口位置的x坐标
		0,						//窗口位置的y坐标
		600,					//窗口的宽度
		400,					//窗口的高度
		hParentWnd ,					//父窗口句柄
		NULL,					//菜单句柄
		hInstance,				//应用程序实例句柄
		NULL);					//窗口创建数据指针
	if (hWnd == NULL) return NULL;

	//3. 显示窗口
	ShowWindow(hWnd, SW_SHOWNORMAL);

	//4. 更新窗口
	UpdateWindow(hWnd);
return hWnd;
}
//程序入口
int WINAPI WinMain(
	HINSTANCE hInstance,		// 当前实例句柄
	HINSTANCE hPrevInstance,	// 前一实例句柄
	LPSTR lpCmdLine,			// 命令行参数
	int nCmdShow				// 窗口显示方式
)
{
  hParentWnd = CreateParentWindows(hInstance);
 hChildWnd = CreateChildWindows(hInstance);

	//5. 消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);		//把虚键消息翻译成字符消息(WM_CHAR),
									//再把WM_CHAR消息放到消息队列中去
		DispatchMessage(&msg);		//指示操作系统把这条消息发送到窗口
									//过程WinProc进行处理
	}
	return msg.wParam;
}

//窗口回调函数,由操作系统调用,程序员
//不要调用,但程序员需要编写其实现代码
LRESULT CALLBACK WinParentProc(
	HWND hWnd,		// 窗口句柄
	UINT uMsg,		// 消息ID
	WPARAM wParam,	// 第1个消息参数
	LPARAM lParam	// 第2个消息参数
)
{
	switch (uMsg)
	{
	case WM_RBUTTONDOWN://当右键点击父窗口时,就会把之前隐藏的子窗口显示出来	::ShowWindow(hChildWnd,SW_SHOW);
		{
//		::ShowWindow(hChildWnd,SW_SHOW);
		 hChildWnd = CreateChildWindows(NULL);//当关闭子窗口时,没有隐藏它case WM_CLOSE:,而是真的关闭了,点击它时就会不断生新窗口
		
		}
 break;
	case WM_DESTROY:
		{
		PostQuitMessage(0);
		}
		break;

	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;	//return 1
}


LRESULT CALLBACK WinChildProc(
	HWND hWnd,		// 窗口句柄
	UINT uMsg,		// 消息ID
	WPARAM wParam,	// 第1个消息参数
	LPARAM lParam	// 第2个消息参数
)
{
	switch (uMsg)
	{
//	case WM_CLOSE://这样做只是点击子窗口的关闭时,只是隐藏例如,而没有真的关闭
//		{
//			::ShowWindow(hWnd,SW_HIDE);
//		}
//		break;
//	case WM_DESTROY:
//		PostQuitMessage(0);
//		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;	//return 1
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值