Win32笔记
Window数据类型
字符编码
1.unicode编码
2.宽字节字符编码
wchar_t等价于unsigned short,字符串前需加L,如:
wchar_t* pwszText=L"Hello";
LPSTR | char * | LPCSTR | const char * |
---|---|---|---|
LPWSTR | wchar_t* | LPCWSTR | const wchar_t* |
LPTSTR | TCHAR* | LPCTSTR | const 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);//派发消息
}
常见消息
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
WM_DESTROY | 窗口被销毁时 | 0 | 0 | 常用来做资源、内存回收等 |
WM_SYSCOMMAND | 点击窗口最大化、最小化、关闭 | 具体点击位置 | 鼠标光标位置 | 窗口关闭时,提示用户处理 |
WM_CREATE | 窗口创建成功但未显示时 | 0 | CREATESTRUCT类型指针 | 常用于初始化窗口的参数 |
WM_SIZE | 窗口大小发生变化时 | 窗口变化的原因 | 窗口变化后的大小 | 窗口大小发生变化后,调整窗口内的布局 |
WM_QUIT(不需要处理) | 程序员发送 | PostQuitMessage函数传递的参数 | 0 | 用于结束消息循环 |
WP_PAINT | 窗口需要绘制时 | 0 | 0 | 用于绘图 |
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);
键盘消息
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
WM_KEYDOWN | 按键被按下时 | 键码 | 键按下的次数 | |
WM_KEYUP | 按键抬起时 | 键码 | 0 | |
WM_CHAR | TranslateMessage()函数产生的消息 |
鼠标消息
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
WM_LBUTTONDOWN | 鼠标左键被按下时 | 其他按键状态,如Ctrl/Shift | 鼠标的位置 | |
WM_LBUTTONUP | 鼠标左键抬起时 | |||
WM_LBUTTONDOWN | 鼠标右键被按下时 | |||
WM_LBUTTONUP | 鼠标右键抬起时 | |||
WM_MOUSEMOVE | 鼠标移动时 | |||
WM_LBUTTONDBLCLK | 双击鼠标左键时 | |||
WM_RBUTTONDBLCLK | 双击鼠标右键时 | |||
WM_MOUSEWHEEL | 鼠标滚轮消息 |
定时器消息
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
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消息时挂载
}
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
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;
消息句柄 | 产生时间 | wParam | lParam | 一般用法 |
---|---|---|---|---|
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;
}
}