win32基本控件

 一.控件概念

     ·控件:特殊的一类”子”窗口,系统已经定义好了窗口类型.

     创建方式和创建窗口类似,调用createWindows,每个控件都由ID

     ·父窗口直接通过sendmessage向控件发送消息.

     控件事件发生后,会向所在的父窗口发送通知消息

     ·注意:创建窗口时必须添加两个属性

     WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口

          WS_CHILDWINDOW也一样,为了节约几个字母,用WS_CHILD吧。

WS_VISIBLE:设置可见,要想别人称赞你老婆漂亮,先让别人见你老婆

 ·创建窗口函数讲解

      HWND WINAPI CreateWindow( 类名, 显示内容,  风格,  nt x,   int y,   

               int nWidth,  int nHeight,  父窗口,  控件ID,  

               HINSTANCE hInstance,  LPVOID lpParam  );

·主要控件:按钮,编辑框,静态框,列表框,组合框,树控件,分组框,等

 二.按钮

2.1基本概念   

 窗口类名  BUTTON

 按钮分类:

 下压式按钮 BS_PUSHIBUTTON/BS_DEFPUSHIBUTTON

 复选框 BS_CHECKBOX/BS_AUTOCHECKBOX /BS_3STATE/ BS_AUTO3STATE

 单选框BS_RADIOBUTTON/BS_AUTORADIOBUTTON

 分组框BS_GROUPBOX

2.2下压式按钮

  创建按钮:

  CreateWindow(L"Button", L"按钮一", WS_VISIBLE | WS_CHILD |

       BS_PUSHBUTTON,     .... hwnd, (HMENU)IDB_ONE, hg_app, NULL); 

 按钮消息:WM_COMMAND

       LOWORD(wParam) --- 保存的是按钮ID

       HIWORD(wparam)---通知码BN_CLICKED

       lParam 子窗口句柄

      

 改变按钮文本信息: 向控件发送 WM_SETTEXT

      

2.3 分组框

    窗口名称BUTTON

    窗口风格 BS_GROUPBOX    

2.4单选框

    窗口名称BUTTON

    窗口风格BS_RADIOBUTTON / BS_AUTORADIOBUTTON/WS_GROUP

    WS_GROUP的单选框,到下一个WS_GROUP单选框之前,为1组

     获取和设置选择状态(通知消息是BN_CLICKED)

     BM_SETCHECK

     BM_GETCHECK 

    案例:if( HIWORD(wParam)==BN_CLICKED )                         {

                                HWND h3State = GetDlgItem( hWnd, 1005 );

                                LRESULT nRet = SendMessage( h3State, BM_GETCHECK, 0, 0 );

                                if( nRet == BST_CHECKED )}  

2.5复选框

   窗口类名:BUTTON

   窗口风格:

    BS_CHECKBOX - 点击选择时,需要自己维护选择状态

    BS_AUTOCHECKBOX - 点击选择时,系统自动维护选择状态

    BS_3STATE --变灰的三种状态

    BS_AUTO3STATE-自动处理的三种状态

获取和设置选择状态(通知消息是BN_CLICKED)

   BST_INDETERMINATE-设置灰色

    BST_CHECKED     ---设置选择

    BST_UNCHECKED  --设置不选择

    设置状态SendMessage(... BM_SETCHECK,具体状态,必须为0);

    获取状态SendMessage(... BM_GETCHECK,0,0);

    案例SendMessage( 句柄, BM_SETCHECK,BST_INDETERMINATE, 0 );

 三. 编辑框

3.1基本概念

  窗口类名 EDIT

  分类:

  文字编辑框:显示单行文字/显示多行文字

  密码编辑框:ES_PASSWORD,显示密码

  窗口风格

 

3.2通知消息

 在WM_COMMAND case下 处理这个参数
      if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == nEditID)

  3.2.1 WM_GETTEXT ---获取编辑框文本

  wPararm - buffer 的大小 lPararm – buffer的首地址

  SendMessage(  (WPARAM) wParam,  // number of characters to copy

                (LPARAM) lParam   // text buffer);

  3.2.2  WM_GETTEXTLENGTH-获取文本长度

 SendMessage(   (WPARAM) 0,         (LPARAM) 0)

 3.2.3 WM_SETTEXT设置内容

  wParam – 没用,lParam – 准备设置内容的buffer的首地址

补充:

· SendMessage( hWndEdit, WM_CUT, 0, 0 );  

·  SendMessage( hWndEdit, WM_COPY, 0, 0 );  

·  SendMessage( hWndEdit, WM_CLEAR, 0, 0 )

 四. 静态框:

  窗口名称 “STATIC” 用来用来显示文字,加载图片(设置属性 SS_ICON/SS_BITMAP)

  窗口消息: sendMessage 发送到控件即可 例如 STM_SETICON

  通知消息: 需要创建时增加SS_NOTIFY风格

  通知消息通过WM_COMMAND 消息传递

         LOWORD(wparam)---控件ID

         HIWORD(wparam)---notify-code(STN_CLICKED)

Lparam---控件窗口句柄      

 

 CreateWindowEx的拓展风格

WS_EX_NODRAG:防止窗口被移动

WS_EX_ACCEPTFILES: 接受一个拖拽文件。

WS_EX_APPWINDOW:当窗口可见时,将一个顶层窗口放置到任务条上。

WS_EX_CLIENTEDGE:指定窗口有一个带阴影的边界。

WS_EX_CONTEXTHELP:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到、

WS_EX_DLGMODALFRAME:创建一个带双边的窗口;

 

 五.组合框

5.1组合框分类

简单组合框        CBS_SIMPLE           (可以输入可以选择)

下拉式组合框      CBS_DROPDOWN       (可以输入,可以选择)

下拉式列表组合框  CBS_DROPDOWNLIST    (只可以选择不可以输入)

 

5.2组合框发送消息

CB_ADDSTRING ----添加项(WPARAM---没用   LPARAM----字符串指针)

CB_INSERTSTRING 添加项

CB_DELETESTRING  删除制定项

CB_RESETCONTENT 清除所有项

CB_SETCURSEL     设置当前项

CB_GETCURSLE     获取当前项

CB_FINDSTRING    查找某项字符串

CB_GETLBTEXTLEN  获取选择的字符长度

CB_GETLBTEXT     获取选项的一个字符内容

CB_DIR           在组合框中显示制定路径下的文件和目录名字

CB_SETITENDATA   将数据保存到指定选项中

CB_GETITEMDATA  从指定选项中获取数据

 

5.3向父窗口消息

当选择项发送改变时 会给父窗口发送   CBN_SELCHANGE消息

当输入内容发送改 变时 会给父窗口发送 CBN_EDITCHANGE

 六.杂烩知识点

UNREFERENCED_PARAMETER

 最高级别的警告 Level 4(/W4)进行编译时。例如在程序中定义一个变量未使用就会提出警告.你可以加上UNREFERENCED_PARAMETER为了骗过编译器。对某个变量不需要提供警告信息

LoadString把String Table里面的字符串读出来到CString对象里

LoadAccelerators加载快捷键,返回快捷键句柄

TranslateAccelerator把消息跟快捷键表里定义的按键进行比较,如果发现有快捷键,就会把这个按键消息转换为WM_COMMAND或者WM_SYSCOMMAND消息给窗口的消息处理函数发送过去,而不会发送wm_keydown消息

下面通过一些代码展示这些函数的用法(只是cpp部分的代码,不包含头文件)

// 控件练习.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "控件练习.h"
TCHAR TcharArr[1024] = _T("你好吧,你走吧大赛的恢复健康是的哈附近考虑水电费哈圣诞节快乐");
#define MAX_LOADSTRING 100
// 全局变量: 
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名

// 此代码模块中包含的函数的前向声明: 
INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO:  在此放置代码。
	MSG msg;
	HACCEL hAccelTable;

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化: 
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));

	// 主消息循环: 
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  函数:  MyRegisterClass()
//
//  目的:  注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MY);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   函数:  InitInstance(HINSTANCE, int)
//
//   目的:  保存实例句柄并创建主窗口
//
//   注释: 
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数:  WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND	- 处理应用程序菜单
//  WM_PAINT	- 绘制主窗口
//  WM_DESTROY	- 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_LBUTTONDOWN:
	{
		/*DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);*/
		HWND hDiawnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);
		ShowWindow(hDiawnd, 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;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(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)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}


// “关于”框的消息处理程序。
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 550, 500, hDlg, (HMENU)5002, hInst, nullptr);
		
		//喜欢选项
		CreateWindow(_T("static"), _T("你喜欢谁:"), WS_CHILD | WS_VISIBLE, 15, 35, 100, 20, hDlg, (HMENU)5003, hInst, nullptr);
		CreateWindow(_T("button"), _T("花花:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 60, 100, 20, hDlg, (HMENU)5004, hInst, nullptr);
		CreateWindow(_T("button"), _T("草草:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 85, 100, 20, hDlg, (HMENU)5005, hInst, nullptr);

		//喜欢颜色选项
		CreateWindow(_T("static"), _T("你喜欢什么颜色:"), WS_CHILD | WS_VISIBLE, 15, 115, 130, 20, hDlg, (HMENU)5006, hInst, nullptr);
		CreateWindow(_T("button"), _T("蓝色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 140, 100, 20, hDlg, (HMENU)5007, hInst, nullptr);
		CreateWindow(_T("button"), _T("黄色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 165, 100, 20, hDlg, (HMENU)5008, hInst, nullptr);

		//爱好
		CreateWindow(_T("static"), _T("你喜欢做什么:"), WS_CHILD | WS_VISIBLE, 15, 200, 130, 20, hDlg, (HMENU)5009, hInst, nullptr);
		CreateWindow(_T("button"), _T("洗衣服:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX , 15, 225, 100, 20, hDlg, (HMENU)5010, hInst, nullptr);
		CreateWindow(_T("button"), _T("拖地:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 255, 100, 20, hDlg, (HMENU)5011, hInst, nullptr);

		//输入编辑框
		CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 15, 285, 400, 80, hDlg, (HMENU)5012, hInst, nullptr);
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case 5001:
			SendMessage(hDlg, 5012, sizeof(TcharArr), (unsigned int)TcharArr);
			if(IsDlgButtonChecked(hDlg, 5004))
			{
				MessageBox(0, _T("花花被选中了"), 0, 0);
			}
			else
			{
				SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0);
			}
			break;
		case 5002:
			break;
		}

		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			DestroyWindow(hDlg);
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

 运行结果:

 示例二

// test08.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "test08.h"

#define MAX_LOADSTRING 100

// 全局变量: 
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名

// 此代码模块中包含的函数的前向声明: 
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

HWND g_hWnd;

HWND g_hDlgWnd;

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO:  在此放置代码。
	MSG msg;
	HACCEL hAccelTable;

	// 初始化全局字符串
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_TEST08, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// 执行应用程序初始化: 
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST08));

	// 主消息循环: 
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//MessageBox(g_hWnd, 00, 0, 0);
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  函数:  MyRegisterClass()
//
//  目的:  注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST08));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_TEST08);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   函数:  InitInstance(HINSTANCE, int)
//
//   目的:  保存实例句柄并创建主窗口
//
//   注释: 
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   g_hWnd = hWnd;

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  函数:  WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    处理主窗口的消息。
//
//  WM_COMMAND	- 处理应用程序菜单
//  WM_PAINT	- 绘制主窗口
//  WM_DESTROY	- 发送退出消息并返回
//
//

//对话框:特殊的窗口,主要用于用户的输入(有意识让缩小用户的输入范围),布局控件
//可以认为对话框是用来承载控件

//对话框分为2类:
//模态对话框 阻塞(同步)模式,对这个对话框之外的应用程序主窗口要进行操作,必须先操作完这个对话框才行
//非模态对话框 非阻塞(异步)模式,对这个对话框之外的应用程序主窗口要进行操作,可以随时

//对话框的创建步骤:
//1、添加对话框资源(资源去添加一个对话框)
//2、调用一个函数去创建一个对话框(模态调用DialogBox,非模态调用createdialog)
//3、创建一个对话框的窗口处理函数
//4、释放对话框(模态调用EndDialog,非模态调用DestroyWindow)

//区别:
//模态的创建没返回窗口句柄,非模态返回了窗口句柄,非模态需要调用ShowWindow,否则对话框不显示

//基本控件
//控件也是一个特殊的子窗口,是系统已经定义好的窗口类
//系统用小写的标识符来定义控件窗口类名,button(按钮),static(静态文本)

//作业:
//自定义账号和密码,实现一个登录功能,输入正确的账号和密码之后点确定后才能进入主窗口,输入错误,把两个输入清空
//重新输入

TCHAR strArr[1024] = {};

INT_PTR CALLBACK ModDialogRroc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG://初始化对话框(类似wm_create)
		//在对话框显示之前先响应消息  子控件的创建通过CreateWindow
		//WS_CHILD 子窗口  WS_VISIBLE 可见的  WS_BORDER 有边框
		//BS_PUSHBUTTON  下压式的按钮   BS_GROUPBOX 组框  BS_AUTORADIOBUTTON 单选框  BS_AUTOCHECKBOX 复选框
		//注意:创建控件的窗口是不需要菜单句柄(对话框及子控件没菜单),把控件的id号,做为参数放在菜单这个形参
		CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			500, 450, 100, 30, hDlg, (HMENU)5001, hInst, NULL);

		//==========================
		//组框
		CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
			10, 10, 500, 400, hDlg, (HMENU)5002, hInst, NULL);
		//静态文本
		CreateWindow(_T("static"), _T("谁最帅:"), WS_CHILD | WS_VISIBLE,
			20, 40, 100, 30, hDlg, (HMENU)5003, hInst, NULL);
		//单选框
		//WS_GROUP  代表从当前代码处开始分组,碰到下一个WS_GROUP代码处终止(或者没有单选按钮为止),为一组
		CreateWindow(_T("button"), _T("小广广"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
			50, 70, 100, 30, hDlg, (HMENU)6001, hInst, NULL);
		CreateWindow(_T("button"), _T("夏七"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
			50, 100, 100, 30, hDlg, (HMENU)6002, hInst, NULL);
		CreateWindow(_T("button"), _T("凯文"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
			50, 130, 100, 30, hDlg, (HMENU)6003, hInst, NULL);

		//静态文本
		CreateWindow(_T("static"), _T("调查者的学历:"), WS_CHILD | WS_VISIBLE,
			20, 170, 200, 30, hDlg, (HMENU)5004, hInst, NULL);
		//单选框
		CreateWindow(_T("button"), _T("大专"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP,
			50, 200, 100, 30, hDlg, (HMENU)6004, hInst, NULL);
		CreateWindow(_T("button"), _T("本科"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
			50, 230, 100, 30, hDlg, (HMENU)6005, hInst, NULL);
		CreateWindow(_T("button"), _T("幼儿圆"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
			50, 260, 100, 30, hDlg, (HMENU)6006, hInst, NULL);

		//静态文本
		CreateWindow(_T("static"), _T("调查者的兴趣喜好:"), WS_CHILD | WS_VISIBLE,
			220, 40, 200, 30, hDlg, (HMENU)5005, hInst, NULL);
		//复选框
		CreateWindow(_T("button"), _T("吃饭"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
			250, 70, 100, 30, hDlg, (HMENU)6007, hInst, NULL);
		CreateWindow(_T("button"), _T("睡觉"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
			250, 100, 100, 30, hDlg, (HMENU)6008, hInst, NULL);
		CreateWindow(_T("button"), _T("打豆豆"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
			250, 130, 100, 30, hDlg, (HMENU)6009, hInst, NULL);

		//编辑框: edit
		CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE |WS_BORDER,
			30, 290, 450, 100, hDlg, (HMENU)6010, hInst, NULL);

		//设置默认的控件
		//没有保存窗口,可以通过GetDlgItem得到控件的窗口句柄
		//第3个参数设置为1,代表6001id的这个控件被选中
		SendMessage(GetDlgItem(hDlg, 6001), BM_SETCHECK, 1, 0);

		SendMessage(GetDlgItem(hDlg, 6007), BM_SETCHECK, 1, 0);
		return (INT_PTR)TRUE;

	case WM_COMMAND://命令消息
		switch (LOWORD(wParam))
		{
		case 6010:
			break;
		case 6007:
			break;
		case 6001:
			break;
		case 5001:
			_tcscpy_s(strArr, _T("谁最帅:"));
			if (IsDlgButtonChecked(hDlg, 6001))//判断6001这个按钮是否被选中
				_tcscat_s(strArr,_T("小广广。"));
			_tcscat_s(strArr,_T("调查者的学历:"));
			if (IsDlgButtonChecked(hDlg, 6004))
				_tcscat_s(strArr,_T("大专。"));
			_tcscat_s(strArr,  _T("调查者的兴趣喜好:"));
			if (IsDlgButtonChecked(hDlg, 6007))
				_tcscat_s(strArr, _T("吃饭。"));
			
			
			SetDlgItemText(hDlg, 6010, strArr);

			TCHAR aa[1024] = {};
			GetDlgItemText(hDlg, 6010, aa, 1023);
			MessageBox(0, aa, 0, 0);
			break;
		}
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			//DestroyWindow(g_hDlgWnd);//非模态的释放
			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:
		//模态
		//第3个参数为父窗口句柄; //第4个参数为对话框的窗口处理函数指针
		DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建模态对话框
		//EndDialog模态对话框的释放  DialogBox模态对话框的创建

		////非模态
		//g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建非模态对话框
		//ShowWindow(g_hDlgWnd, SW_SHOWNORMAL);//非模态对话框创建之后必须要调用ShowWindow来显示
		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;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG://初始化对话框(类似wm_create)
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}

 运行结果

猜你喜欢

转载自blog.csdn.net/ASZSYJ/article/details/82185627
今日推荐