Win32学习(第九天)控件初探

如果要谈控件的话那就要先来谈一下控件的载体——对话框:
对话框分为模态对话框和非模态对话框两种对话框
1、模态对话框:阻塞(同步)对话框,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框。
2、非模态对话框:非阻塞(异步)对话框模式,对这个对话框之外的应用程序窗口来进行操作,可以直接进行操作。
对话框创建的步骤(四步)
1、添加对话框资源
2、调用一个函数去创建一个对话框(模态:DialogBox;非模态:CreateDialog)
3、释放一个对话框的窗口处理函数(对话框是一个特殊的窗口,窗口就应该有和窗口对应的消息处理函数)
4、释放对话框(模态:EndDialog;非模态:DestoryWidow)

HWND g_hDlgWnd;//用做非模态对话框窗口句柄(模态不需要,其原因可以理解为:模态对话框窗口没有操作完之前,无法操作其他窗口)
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		//非模态对话框调用
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			DestroyWindow(g_hDlgWnd);
			return (INT_PTR)TRUE;
		}

		创建一个模态对话框
		//switch (LOWORD(wParam))
		//{
		//case IDC_BUTTON1:
		//	MessageBox(0, 0, 0, 0);
		//case IDOK:
		//case IDCANCEL:
		//	EndDialog(hDlg, LOWORD(wParam));
		//	return (INT_PTR)TRUE;
		//}
		//break;
		///*if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		//{
		//	EndDialog(hDlg, LOWORD(wParam));//模态对话框的释放
		//	return (INT_PTR)TRUE;
		//}
		//break;*/
	}
	return (INT_PTR)FALSE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	//case WM_CREATE:
		//CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 100,
		//	300, 50, hWnd, NULL, hInst, NULL);
		//break;
	case WM_RBUTTONDOWN:
		//DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);//模态对话框的创建
		
		//非模态对话框的创建
		//(hInstance, lpName, hWndParent, lpDialogFunc) 
		g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
		ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);//创建完成后,要调用该函数显示
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择: 
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

了解完对话框,下面开始了解控件:
控件 是用来帮助用户输入的(缩小用户的输入范围或提示用户的操作)
控件可以在窗口上显示,一般不会在主窗口上显示
控件需要通过对话框来进行承载
控件:也是一个特殊的子窗口
1、控件是窗口,只要是窗口就会有消息
2、控件是一个子窗口,必须有一个父窗口
3、控件是特殊的子窗口
子窗口的类型在系统中已经定义好了,直接用,系统通过小写表示来定义控件的窗口类名

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG://初始化对话框消息(在这里可以参照wm_create来进行理解)
		//控件的动态添加
		//button 是类名(按钮类),包含很多派生类,通过按钮风格来确定使用哪一种按钮
		//WS_CHILD 子窗口  WS_VISIBLE 可见的
		//BS_PUSHBUTTON 下压式按钮  BS_GROUPBOX组框
		//注意:控件是不需要菜单的,那么菜单这个参数会在控件中用来保存id号,来标记对应的控件

		CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 400, 400, 100, 30, hDlg, (HMENU)5001, hInst, NULL);
		//组框
		CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 500, 350, hDlg, (HMENU)5002, hInst, NULL);
		//静态文本
		CreateWindow(_T("static"), _T("谁是长得最帅的人"), WS_CHILD | WS_VISIBLE, 20, 40, 150, 30, hDlg, (HMENU)5003, hInst, NULL);
		//单选框//注意:如果没有选择一种风格,那么所有单选就默认为一组
		//WS_GROUP 表示单选的分组,直到下一个WS_GROUP宏作为一组,或者没有单选
		CreateWindow(_T("button"), _T("道明寺"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 40, 70, 100, 30, hDlg, (HMENU)5004, hInst, NULL);
		CreateWindow(_T("button"), _T("花泽类"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 100, 100, 30, hDlg, (HMENU)5005, hInst, NULL);
		CreateWindow(_T("button"), _T("西门"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 130, 100, 30, hDlg,(HMENU)5006, hInst, NULL);
		
		CreateWindow(_T("static"), _T("这是谁评的"), WS_CHILD | WS_VISIBLE , 20, 160, 150, 30,hDlg, (HMENU)6001, hInst, NULL);
		CreateWindow(_T("button"), _T("最帅的人评的"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 40, 190, 120, 30, hDlg, (HMENU)6002, hInst, NULL);
		CreateWindow(_T("button"), _T("最衰的人评的"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 220, 120, 30, hDlg,(HMENU)6003,hInst, NULL);
		
		CreateWindow(_T("static"), _T("评选人的学历"), WS_CHILD | WS_VISIBLE, 200, 40, 150, 30, hDlg, (HMENU)7001, hInst, NULL);
		CreateWindow(_T("button"), _T("幼儿园毕业"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 220, 70, 120, 30, hDlg, (HMENU)7002, hInst, NULL);
		CreateWindow(_T("button"), _T("家里蹲大学"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 220, 100, 120, 30, hDlg, (HMENU)7003, hInst, NULL);
		SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0);
		SendMessage(GetDlgItem(hDlg, 6002), BM_SETCHECK, 1, 0);
		SendMessage(GetDlgItem(hDlg, 7003), BM_SETCHECK, 1, 0);
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case 5005:
			MessageBox(0, 0, 0, 0);
		}
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_RBUTTONDOWN:
		DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择: 
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO:  在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值