11.子窗口控件

Windows提供了几个预定义的类供我们使用,我们一般将他们叫做子窗口控件,简称控件;
控件会自己处理消息,并在自己状态发生改变时通知父窗口;
预定义的控件有:
按钮、复选框、编辑框、静态字符串标签和滚动条;
用效果如下的案例来来练习使用子窗口控件:
在这里插入图片描述

/*-------------------------------
MyWindows.c
---------------------------------*/
#include <Windows.h>
#include <Strsafe.h>

#define IDC_EDIT_1 0x100
#define IDC_BUTTON_1 0x101
#define IDC_BUTTON_2  0x102

HINSTANCE g_hInstance;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,	//入口函数,WINAPI即是__stdcall(函数调用约定的一种)
	HINSTANCE hPrevInstance,
	PSTR szCmdLine,
	int iCmdShow)
{
	g_hInstance = hInstance;
	static TCHAR szAppName[] = TEXT("MyWindows");//定义窗口类的名字
	HWND hwnd;	//窗口句柄定义
	MSG msg; //定义消息
	WNDCLASS wndclass; //Windows类定义

	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	//背景,先要得到画刷句柄传回
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
	wndclass.hInstance = g_hInstance;//模块句柄,如前面说的.exe .dll等地址
	wndclass.lpfnWndProc = WndProc;//过程函数
	wndclass.lpszClassName = szAppName;	//类名
	wndclass.lpszMenuName = NULL;//菜单
	wndclass.style = CS_HREDRAW | CS_VREDRAW;//调整宽度和高度重新绘制窗口

	if (!RegisterClass(&wndclass)){ //填完窗口类注册该窗口类
		MessageBox(NULL, TEXT("此程序需要在Windows NT平台上运行!"), 
			szAppName, MB_ICONERROR);
		return 0;
	}
 	//创建窗口并设置其具体特征,返回窗口句柄,窗口类名
	hwnd = CreateWindow(szAppName,
		TEXT("Win模板"),		   //窗口标题
		WS_OVERLAPPEDWINDOW,     //类风格的扩展
		CW_USEDEFAULT,           //初始窗口坐标
		CW_USEDEFAULT,
		600,
		500,
		NULL,	//有无父窗口
		NULL,	//有无菜单
		g_hInstance,
		NULL
		);
	ShowWindow(hwnd, iCmdShow);//显示窗口
	UpdateWindow(hwnd);	//更新窗口
	while (GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);	//翻译消息
		DispatchMessage(&msg);	//派送消息到系统,系统再调用WinProc函数处理消息
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, 
	LPARAM lParam)//传入消息结构体的前四个参数
{
	TCHAR szOutBuffer[0x80] = {0};
	//StringCchPrintf(szOutBuffer, 0x80, TEXT("消息:%x\n"), message);
	//OutputDebugString(szOutBuffer);//用来看产生什么消息

	switch (message)
	{
	case WM_CREATE:
		CreateWindow(TEXT("EDIT"),	//文本框
			NULL,							
			WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE,	
			0,								
			0,
			500,
			500,
			hwnd,										
			IDC_EDIT_1,
			g_hInstance,
			NULL
			);
		CreateWindow(TEXT("BUTTON"),	//按钮
			TEXT("设置"),
			WS_CHILD | WS_VISIBLE,
			520,
			380,
			60,
			30,
			hwnd,										
			IDC_BUTTON_1,
			g_hInstance,
			NULL
			);
		CreateWindow(TEXT("BUTTON"),	//按钮
			TEXT("获取"),
			WS_CHILD | WS_VISIBLE,
			520,
			420,
			60,
			30,
			hwnd,
			IDC_BUTTON_2,
			g_hInstance,
			NULL
			);
		return 0;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON_1:
			SetDlgItemText(hwnd, IDC_EDIT_1, TEXT("测试"));
			return 0;
		case IDC_BUTTON_2:										
			GetDlgItemText(hwnd, IDC_EDIT_1, szOutBuffer, 0x80);
			MessageBox(hwnd, szOutBuffer, TEXT("读到数据"), MB_OK);
			return 0;
		}
		return 0;
	case WM_DESTROY:	//点击右上角关闭发送WM_DESTROY消息
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, message, wParam, lParam);
}

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/84981275
今日推荐