winapp | 窗口程序的win32子控件

基于上一篇博客里的简单win32app实现:

// windowsapp.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

HINSTANCE g_hInstance;         // 全局变量程序句柄

// 定义子控件编号宏
#define IDC_EDIT_1 0x100
#define IDC_BUTTON_1 0x101
#define IDC_BUTTON_2 0x102


LRESULT CALLBACK WindowProc(HWND hwnd,
							UINT uMsg,
							WPARAM wParam,
							LPARAM LParam){
	// 窗口程序
	// 处理消息队列的消息
	switch (uMsg)
	{
	case WM_CREATE:          // 窗口被创建出来的消息
		//创建子控件
		//创建文本框
		CreateWindow(
			"EDIT",                             // 注册的类名 这里是文本框
			"",                 // 窗口名
			WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE,         // 窗口风格
			0,
			0,                                   // 相对于父窗口的x,y坐标
			300,
			300,                                 // 宽高
			hwnd,                                  // 父窗口的句柄
			(HMENU)IDC_EDIT_1,                                 // 菜单句柄如果是子窗口就是身份标识
			g_hInstance,                        // 是属于哪个模块的
			NULL                              // 附加数据 空
		);
		//创建两个按钮
		CreateWindow(
			"BUTTON",                             // 注册的类名 这里是文本框
			"设置",                 // 窗口名
			WS_CHILD|WS_VISIBLE,         // 窗口风格
			300,
			0,                                   // 相对于父窗口的x,y坐标
			60,
			30,                                 // 宽高
			hwnd,                                  // 父窗口的句柄
			(HMENU)IDC_BUTTON_1,                                 // 菜单句柄
			g_hInstance,                        // 是属于哪个模块的
			NULL                              // 附加数据 空
		);
		CreateWindow(
			"BUTTON",                             // 注册的类名 这里是文本框
			"获取",                 // 窗口名
			WS_CHILD|WS_VISIBLE,         // 窗口风格
			300,
			100,                                   // 相对于父窗口的x,y坐标
			60,
			30,                                 // 宽高
			hwnd,                                  // 父窗口的句柄
			(HMENU)IDC_BUTTON_2,                                 // 菜单句柄
			g_hInstance,                        // 是属于哪个模块的
			NULL                              // 附加数据 空
		);

		break;
	case WM_COMMAND:    // 按钮发过来的消息
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON_1:
			SetDlgItemText(hwnd, IDC_EDIT_1, TEXT("测试"));
			break;
		case IDC_BUTTON_2:
			break;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);    // 让当前程序退出
		break;
	}

	return DefWindowProc(hwnd, uMsg, wParam, LParam); // 调用默认的消息处理函数
}


int APIENTRY WinMain(HINSTANCE hInstance,           // 句柄 模块的起始位置
                     HINSTANCE hPrevInstance,       // 永远为空
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	/*
	DWORD dwAddr = (DWORD)hInstance;
	char szOutBuff[0x80];
	sprintf(szOutBuff, "module place: 0x%X \n", dwAddr);   // 打印模块起始地址
	OutputDebugString(szOutBuff);
	*/
	
	// 给全局变量句柄赋值
	g_hInstance = hInstance;

	// 第一步:定义窗口是什么样的
	TCHAR className[] = TEXT("My first Window");
	WNDCLASS wndclass = {0};                // 窗口类初始化
	wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;//背景色
	wndclass.lpszClassName = className;             // 窗口类名
	wndclass.hInstance = hInstance;               // 窗口是属于哪个程序的
	wndclass.lpfnWndProc = WindowProc;            // 窗口程序(窗口过程函数地址)

	// 第二步:注册窗口类
	RegisterClass(&wndclass);        // 让操作系统知道你这个窗口

	// 第三步:创建并显示窗口
	HWND hwnd = CreateWindow(
		className,                             // 注册的类名
		TEXT("Mz1小工具"),                 // 窗口名
		WS_OVERLAPPEDWINDOW,                   // 窗口风格
		100,
		100,                                   // 相对于父窗口的x,y坐标
		600,
		300,                                 // 宽高
		NULL,                                  // 父窗口的句柄
		NULL,                                 // 菜单句柄
		hInstance,                        // 是属于哪个模块的
		NULL                              // 附加数据 空
		);

	// 第四步:显示窗口
	ShowWindow(hwnd, SW_SHOW);         // 默认形式显示

	// 第五步:接收消息并处理
	MSG msg;          // 用于接收消息的结构体
	BOOL bRet; 
	while((bRet = GetMessage( &msg, NULL, 0, 0)) != 0){// 参数2:取哪个窗口的消息,如果为空,就是取所有的
		if (bRet == -1){
			// handle the error
		}else{
			TranslateMessage(&msg); // 转换消息
			DispatchMessage(&msg);   // 分发消息 给消息处理函数处理
		}
	}
	return 0;
}
posted @ 2021-08-19 16:02  Mz1  阅读(129)  评论(0编辑  收藏  举报