Win32笔记

该文介绍了Win32环境下窗口类的注册、消息循环的实现,包括常见消息如WM_DESTROY、WM_SIZE、WM_QUIT的处理。同时,讲解了键盘和鼠标消息、定时器消息的处理,以及如何进行图形绘制,如使用BeginPaint、EndPaint进行绘图操作。此外,文章还涵盖了菜单、图标资源的加载以及对话框的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Win32笔记

Window数据类型

字符编码

1.unicode编码

2.宽字节字符编码

wchar_t等价于unsigned short,字符串前需加L,如:

wchar_t* pwszText=L"Hello";
LPSTRchar *LPCSTRconst char *
LPWSTRwchar_t*LPCWSTRconst wchar_t*
LPTSTRTCHAR*LPCTSTRconst TCHAR*

注册窗口类

1.系统窗口类

系统已经注册好的窗口类:Button、Edit

消息

MSG消息结构体

typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
} MSG;

消息循环

MSG nMsg={0};
while(GetMessage(&nMsg,NULL,0,0)){//获取消息,阻塞函数
TranslateMessage(&nMsg);//翻译消息,将按键消息翻译成字符消息
DispatchMessage(&nMsg);//派发消息
}

常见消息

消息句柄产生时间wParamlParam一般用法
WM_DESTROY窗口被销毁时00常用来做资源、内存回收等
WM_SYSCOMMAND点击窗口最大化、最小化、关闭具体点击位置鼠标光标位置窗口关闭时,提示用户处理
WM_CREATE窗口创建成功但未显示时0CREATESTRUCT类型指针常用于初始化窗口的参数
WM_SIZE窗口大小发生变化时窗口变化的原因窗口变化后的大小窗口大小发生变化后,调整窗口内的布局
WM_QUIT(不需要处理)程序员发送PostQuitMessage函数传递的参数0用于结束消息循环
WP_PAINT窗口需要绘制时00用于绘图

typedef LONG_PTR LPARAM;

typedef _W64 long LONG_PTR;

PeekMessage():以查看的方式从系统获取消息。

if(PeekMessage(&nMsg,NULL,0,0,PM_NOREMOVE)){
	
}

发送消息:

SendMessage()等候消息处理结果

PostMessage()不等候,立刻返回

//SendMessage(hWnd,WM_QUIT,0,0);
PostMessage(hWnd,WM_QUIT,0,0);

消息分类

系统消息:0-0x03FF

用户自定义消息:0x0400-0x07FFF

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rzyd2AMW-1688600073423)(C:\Users\GuangshengLi\AppData\Roaming\Typora\typora-user-images\image-20230703234747886.png)]

队列消息:WM_PAINT、键盘、鼠标消息

非队列消息:WM_CREATE、WM_SIZE

#include <Windows.h>
#include <stdio.h>

HANDLE g_hOutput=0;

LRESULT CALLBACK WndProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam){
	switch(msgID){
	case WM_DESTROY:
	PostQuitMessage(0);	
	break;
	}
	return DefWindowProc(hWnd,msgID,wParam,lParam);
}

int CALLBACK WinMain(HINSTANCE hIns,HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow){
    AllocConsole();
	g_hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    
	//注册窗口类
	WNDCLASS wc={0};
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
	wc.hCursor=NULL;
	wc.hIcon=NULL;
	wc.hInstance=hIns;
	wc.lpfnWndProc=WndProc;
	wc.lpszClassName="Main";
	wc.lpszMenuName=NULL;
	wc.style=CS_HREDRAW|CS_VREDRAW;
	RegisterClass(&wc);

	HWND hWnd=CreateWindow("Main","window",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hIns,NULL);
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg={0};
	while(GetMessage(&nMsg,NULL,0,0)){
		TranslateMessage(&nMsg);//翻译消息
		DispatchMessage(&nMsg);//派发消息
	}
	return 0;
}

绘图步骤:

1.开始绘图

2.正式绘图

3.结束绘图

PAINTSTRUCT ps={0};
HDC hdc= BeginPaint(hWnd,&ps);
TextOut(hdc,100,100,"hello",5);
EndPaint(hWnd,&ps);

键盘消息

消息句柄产生时间wParamlParam一般用法
WM_KEYDOWN按键被按下时键码键按下的次数
WM_KEYUP按键抬起时键码0
WM_CHARTranslateMessage()函数产生的消息

鼠标消息

消息句柄产生时间wParamlParam一般用法
WM_LBUTTONDOWN鼠标左键被按下时其他按键状态,如Ctrl/Shift鼠标的位置
WM_LBUTTONUP鼠标左键抬起时
WM_LBUTTONDOWN鼠标右键被按下时
WM_LBUTTONUP鼠标右键抬起时
WM_MOUSEMOVE鼠标移动时
WM_LBUTTONDBLCLK双击鼠标左键时
WM_RBUTTONDBLCLK双击鼠标右键时
WM_MOUSEWHEEL鼠标滚轮消息

定时器消息

消息句柄产生时间wParamlParam一般用法
WM_TIMER定时器ID
SetTimer(hWnd,1,1000,NULL);//设置定时器

菜单

1.添加菜单资源

2.加载菜单资源

wc.lpszMenuName=(char*)IDR_MENU1;//(1)在注册窗口类时挂载
HWND hWnd=CreateWindow("Main","window",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,LoadMenu(hIns,(char*)IDR_MENU1),hIns,NULL);//(2)在创建窗口类时挂载
void onCreate(HWND hWnd){
	SetMenu(hWnd,LoadMenu(g_hINstance,(char*)IDR_MENU1));//(3)在处理WM_CREATE消息时挂载
}
消息句柄产生时间wParamlParam一般用法
WM_COMMAND低字节为菜单项ID

图标资源

wc.hIcon=LoadIcon(hIns,(char*)IDI_ICON1);

光标资源

wc.hCursor=LoadCursor(hIns,(char*)IDC_CURSOR1);//(1)在注册窗口类时设置
case WM_SETCURSOR://(2)在WM_SETCURSOR消息处理中设置光标
SetCursor(LoadCursor(g_hInstance,(char*)IDC_CURSOR2));
return 0;
break;
消息句柄产生时间wParamlParam一般用法
WM_SETCURSOR鼠标移动时当前使用的光标ID低字节,当前光标活动区域

字符串资源

快捷键资源

HACCEL hAccel= LoadAccelerators(hIns,(char*)IDR_ACCELERATOR1);//加载加速键表
TranslateAccelerator(hWnd,hAccel,&nMsg);//翻译加速键

绘图编程

//绘制点
void drawPoint(HDC hdc){
	SetPixel(hdc,100,100,RGB(255,0,0));
}
//绘制直线
void drawLine(HDC hdc){
	MoveToEx(hdc,100,100,NULL);
	LineTo(hdc,300,300);
}
//画椭圆
void drawElip(HDC hdc){
	Ellipse(hdc,100,100,300,300);
}
//画矩形
void drawRect(HDC hdc){
	Rectangle(hdc,100,100,300,300);
}
void onDraw(HWND hWnd){
	PAINTSTRUCT ps={0};
	HDC hdc=BeginPaint(hWnd,&ps);
	drawPoint(hdc);
	EndPaint(hWnd,&ps);
}

画笔和画刷

HPEN hPen= CreatePen(PS_SOLID,1,RGB(255,0,0));//创建画笔
HGDIOBJ oldPen= SelectObject(hdc,hPen);//选择画笔

//drawPoint(hdc);
//drawLine(hdc);
//drawRect(hdc);
drawElip(hdc);//画图

SelectObject(hdc,oldPen);//收回画笔
DeleteObject(hPen);//删除画笔

//画刷使用
HBRUSH hBrush=CreateSolidBrush(RGB(0,255,0));
//HBRUSH hBrush=CreateHatchBrush(HS_CROSS, RGB(0,255,0));//纹理画刷
//HGDIOBJ hBrush= GetStockObject(NULL_BRUSH);//使用操作系统的透明画刷
HGDIOBJ oldBrush= SelectObject(hdc,hBrush);

//drawPoint(hdc);
//drawLine(hdc);
//drawRect(hdc);
drawElip(hdc);

SelectObject(hdc,oldBrush);
DeleteObject(hBrush);

位图

void drawBmp(HDC hdc){
	HBITMAP hBmp= LoadBitmap(g_hInstance,(char*)IDB_BITMAP1);//加载位图资源
	HDC hMemdc= CreateCompatibleDC(hdc);//创建一个与当前DC兼容的内存DC
	HGDIOBJ oldBmp= SelectObject(hMemdc,hBmp);
	BitBlt(hdc,100,100,48,48,hMemdc,0,0,SRCCOPY);//展示位图
	StretchBlt(hdc,200,200,24,24,hMemdc,0,0,48,48,SRCCOPY);//缩放展示
	SelectObject(hMemdc,oldBmp);
	DeleteObject(hBmp);
	DeleteDC(hMemdc);
}

字符串

void onDraw(HWND hWnd){
	PAINTSTRUCT ps={0};
	HDC hdc=BeginPaint(hWnd,&ps);
    
    SetTextColor(hdc,RGB(255,0,0));//设置字符串颜色
	SetBkColor(hdc,RGB(0,255,0));//设置背景色
	SetBkMode(hdc,TRANSPARENT);//设置字符串背景模式为透明模式
    
    HFONT hFont=CreateFont(30,0,45,0,900,1,1,1,GB2312_CHARSET,0,0,0,0,"黑体");//字体设置
	HGDIOBJ oldFont= SelectObject(hdc,hFont);
    
	char str[]="hello world hello world hello world hello world hello world";
	TextOut(hdc,100,100,str,strlen(str));
	RECT rc;
	rc.left=100;
	rc.top=150;
	rc.right=200;
	rc.bottom=200;
	Rectangle(hdc,100,150,200,200);
	DrawText(hdc,str,strlen(str),&rc,DT_LEFT|DT_TOP|DT_WORDBREAK|DT_NOCLIP);
    
    SelectObject(hdc,oldFont);
	DeleteObject(hFont);
}

对话框

int CALLBACK dlgProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam){
	switch(msgID){
        case WM_INITDIALOG:
        MessageBox(hWnd,"WM_INITDIALOG","info",MB_OK);
        break;
        case WM_SYSCOMMAND:
            if(wParam==SC_CLOSE){
                EndDialog(hWnd,100);
            }
        break;
        }
	return false;
}

void onCommand(HWND hWnd,WPARAM wParam){
	switch(LOWORD(wParam)){
	case ID_MODEL:
		int res=DialogBox(g_hIns,(char*)IDD_DIALOG1,hWnd,dlgProc);//创建模式对话框
            CreateDialog();//创建无模式对话框
            DestroyWindow();//销毁无模式对话框
		if(res==100){
			MessageBox(hWnd,"secess","info",MB_OK);
		}
		break;
	}
}
 break;
    }
return false;

}

void onCommand(HWND hWnd,WPARAM wParam){
switch(LOWORD(wParam)){
case ID_MODEL:
int res=DialogBox(g_hIns,(char*)IDD_DIALOG1,hWnd,dlgProc);//创建模式对话框
CreateDialog();//创建无模式对话框
DestroyWindow();//销毁无模式对话框
if(res==100){
MessageBox(hWnd,“secess”,“info”,MB_OK);
}
break;
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值