Win32学习笔记

基础

软件为Visual Studio 2013,中途函数遇到问题,可试试在项目属性中将Unicode字符集改为多字节字符集

在这里插入图片描述

1.主函数

//_In_ 修饰 数据要进入到函数里面,如后缀包括 _opt_,则表示该参数可能为空,其余与没有包括_opt_的相同
//HINSTANCE  void * 
//LPSTR  CHAR *
//HANDLE void * 句柄

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_WIN32PROJECT2, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

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

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

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

	return (int) msg.wParam;
}

Windows中“HANDLE”通常和其他名词连用,使用前缀“H”。

在Windows中因为字符串编码不同,一般使用_T("");输入文本。

2.注册窗口类

ATOM MyRegisterClass(HINSTANCE hInstance)
{
//后缀ex的,一般为扩展
//窗口类的结构变量 窗口类,用一个结构体存放
	WNDCLASSEX wcex;

//结构体的第一个成员为size,一般都是自身结构体的内存大小
	wcex.cbSize = sizeof(WNDCLASSEX);

//窗口的风格  CS_HREDRAW 水平刷新   CS_VREDRAW垂直刷新
	wcex.style = CS_HREDRAW | CS_VREDRAW;
//增加风格用|隔开	
/*	窗口其他风格
CS_BYTEALIGNCLIENT    0x1000
在窗口边界(x方向)上对齐窗口的客户区域。
CS_BYTEALIGNWINDOW    0x2000
在窗口边界(x方向)上对齐窗口。
CS_CLASSDC    0x0040
分配一个设备上下文以供类中的所有窗口共享。
CS_DBLCLKS    0x0008
当用户在属于该类的窗口内双击鼠标时,向窗口过程发送双击消息。 
CS_GLOBALCLASS    0x4000
指示窗口类是应用程序全局类。。
CS_HREDRAW    0x0002
如果移动或大小调整更改客户区的宽度,则重绘整个窗口。
CS_NOCLOSE    0x0200
禁用窗口菜单上的关闭。
CS_OWNDC    0x0020
为类中的每个窗口分配唯一的设备上下文。 
CS_PARENTDC    0x0080
将子窗口的剪切矩形设置为父窗口的剪切矩形,以便子窗口可以在父窗口上绘制。
CS_SAVEBITS    0x0800
以位图的形式保存由此类窗口遮挡的屏幕图像部分。删除窗口后,系统将使用保存的位图恢复屏幕图像,包括其他被遮挡的窗口。
CS_VREDRAW     0×0001
如果移动或大小调整更改客户区的高度,则重绘整个窗口。
*/

	wcex.lpfnWndProc	= WndProc;
	
//窗口类的额外信息,直接给0
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	
//窗口类的实例
	wcex.hInstance = hInstance;

//窗口的图标 MAKEINTRESOURCE 带参宏 ,通过宏可以把id号当成字符串来进行加载
//窗口需要的资源都有id号,通过id号对应不同的资源,资源在资源视图有部分可见
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT2));
	
//窗口光标
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	
//窗口背景颜色	可通过+后面的数字改变颜色
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	
//窗口菜单 可赋值为空,则为无菜单
	wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT2);
	
//窗口类名
	wcex.lpszClassName = szWindowClass;
	
//窗口小图标
	wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
	
//系统函数,把我们自定义数据注册到window
	return RegisterClassEx(&wcex);
}

3.创建主函数,并保存实例句柄

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

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

//CreateWindow()创建窗口函数
   hWnd = CreateWindow(szWindowClass, //类名,必须与上面窗口类名一致
   						szTitle,//窗口标题,可用_T("")替换
   						WS_OVERLAPPEDWINDOW,//窗口风格
   						
   						//控制窗口起始坐标,一般默认
      					CW_USEDEFAULT, 
      					0, 
      					CW_USEDEFAULT, 
     					0, 
     					
      					NULL, //窗口的父窗口
      					NULL, //窗口的菜单句柄,给NULL是代表用注册窗口类中的菜单,不给NULL,就意味着当前窗口用的这个菜单
      					hInstance, //实例句柄
      					NULL//拓展参数
          				);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);//显示窗口
   UpdateWindow(hWnd);//更新窗口

   return TRUE;
}

4.处理窗口信息函数(重点)

先简述,后面补充

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//定义初始工具
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)//判断信息
	{
	//如果消息用到鼠标双击WM_LBUTTONDBLCLK,需要在窗口风格加上CS_DBLCLKS
	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;
}

5.框处理函数(暂时不用,用到会补充)

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;
}

6.运行

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值