控制台程序
窗口程序
库程序:静态库程序,动态库程序
编译工具:
编译器cl.exe
链接器link.exe
资源编译器rc.exe
库:
kernel32.dll - 提供核心的API,例如进程、线程、内存管理等;
user32.dll - 提供窗口、消息等API;
gdi32.dll - 绘图相关的API。
头文件:
windef.h - windows数据类型;
winbase.h - kernel32 API的头文件;
wingdi.h - gdi32 API的头文件;
winuser.h - user32 API的头文件;
winnt.h - Unicode字符集文件;
windows.h - 所有windows头文件的集合。
1、编码历史
ASC->ASCII->DBCS->UNICODE
windows上unicode一般用utf-16,中英文都为双字节。
2、宽字节字符
wchar_t每个字符占2个字节
char每个字符占1个字节
wchar_t实际是unsigned short类型,定义时需要增加“L”通知编译器按照双字节编译字符串,采用Unicode编码。
需要使用支持wchar_t函数 *** 作宽字节字符串。例如:
const wchar_t* pwszText = L"Hello wchar",
wprintf(L"%s\n", pwszText);
如果分不清用char还是wchar_t,可以使用TCHAR,TCHAR是微软用宏定义的推导字符类型,。
const TCHAR* tstr = __TEXT(“hello tchar”);
#ifdef UNICODE
wprintf(L"%s, %d\n", tstr, wcslen(tstr));
#else
printf(“%s, %d\n”, tstr, strlen(tstr));
#endif
3、系统调用函数的参数类型
LPSTR == char* LPCSTR == const char*
LPWSTR == wchar_t* LPCWSTR == const wchar_t*
LPTSTR == TCHAR* LPCTSTR == const TCHAR*
1、创建入口函数
2、注册窗口类
3、创建窗口
4、显示窗口
5、消息循环
https://docs.microsoft.com/zh-cn/windows/win32/winmsg/about-window-classes
1、概念
窗口类是包含了窗口各种参数信息的数据结构;
每个窗口都具有窗口类,基于窗口类创建窗口;
每个窗口类都具有一个名称,使用前必须注册到系统。
2、分类
系统窗口类
| 系统窗口类 | 说明 |
|Button|按钮的类|
| ComboBox | 组合框的类 |
| Edit | 编辑控件的类 |
|ListBox|列表框的类|
| MDIClient | MDI客户端窗口的类 |
|ScrollBar| 滚动条的类 |
|Static|静态控件的类|
应用程序全局类
应用程序本地类
style窗口类分格
应用程序全局窗口类的注册,需要在窗口类的分格中增加CS_GLOBALCLASS。
例如:
WNIDCLASS wc{0};
wc.style = …|CS_GLOBALCLASS;
应用程序局部窗口类,在注册窗口类时,不添加CS_GLOBALCLASS风格。
其它分格:
CS_HREDRAW - 当窗口水平变化时,窗口重新绘制;
CS_VERDRAW - 当窗口垂直变化时,窗口重新绘制;
CS_DBLCLKS - 允许窗口接收鼠标双击;
CS_NOCLOSE - 窗口没有关闭按钮。
CreateWindow();
CreateWindowEx();
创建子窗口:
设置父窗口句柄;
窗口风格增加WS_CHILD | WS_VISIBLE
一个窗口类可以用来创建多个窗口。
八、消息
1、消息组成
窗口句柄
消息ID
消息的两个参数
消息产生的时间
消息产生时的鼠标位置
消息的作用
当系统通知窗口工作时,就采用消息的方式派发给窗口。
/*
* Message structure
*/
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
2、 窗口处理函数:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
系统默认:DefWindowProc。
3、 消息相关函数:
BOOL GetMessage(
LPMSG lpMsg, /存放获取到消息的Buff/
HWND hWnd, /抓取消息的窗口句柄/
UINT wMsgFilterMin, /获取消息的最小ID/
UINT wMsgFilterMax /获取消息的最大ID/
); //获取消息
返回值:如果抓到的消息为WM_QUIT,则返回0,其它返回非零。
BOOL TranslateMessage(
CONST MSG *lpMsg /要翻译的消息地址/
); //翻译消息,将可见按键消息翻译成字符消息。检查消息是否是按键的消息,如果不是按键消息,不做任何处理,继续执行。
LRESULT DispatchMessage(
CONST MSG *lpMsg /要派发的消息/
);//将消息派发到该消息所属窗口的窗口处理函数上。
4、常用消息类型
WM_DESTROY
产生时间:窗口被销毁时的消息;
附带消息:wParam:0 ,lParam 0;
一般用法:常用于在窗口被销毁之前,做 相应的善后处理,例如资源、内存等。
WM_SYSCOMMAND
产生时间:当点击窗口的最大化、最小化、关闭等按钮。
附带消息:wParam:具体点击的位置,例如关闭SC_CLOSE等;
lParam:鼠标光标位置(LOWORD, HIWORD)水平和垂直位置
一般用法:常用在窗口关闭时,提示用户处理。
WM_CREATE
产生时间:在窗口创建成功但还未显示时
附带消息:wParam:0;
lParam: 为CREATESTRUCT类型的指针;通过这个指针可以获取CreateWindowEx中的全部12个参数的信息。
一般用法:常用于初始化窗口的参数、资源等,包括创建子窗口等。
WM_SIZE
产生时间:在窗口的大小发生变化后
附带信息:wParam:窗口大小变化的原因
lParam:窗口变化后的大小
LOWORD(lParam)//变化后的宽度
HIWORD(lParam)//变化后的高度
一般用法:常用于出口大小变化后,调整窗口内各个部分的布局。
WM_QUIT
产生时间:程序员发送
附带消息:wParam:PostQuitMessage函数传递的参数
lParam : 0
一般用法:用于结束消息循环,当GetMessage收到这个消息后,会返回FALSE,结束while处理,退出消息循环。
WM_PAINT
产生时间:当窗口需要绘制时(或GetMessage检测到窗口需要重新绘制)
附带消息:wParam:0,lParam:0;
专职用法:用于绘图。
5、消息循环
GetMessage - 从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,会等候下一条消息。
PeekMessage - 以查看的方式从系统获取消息,可以不将消息从系统移除,非阻塞函数。当系统无消息时,返回FALSE,继续执行后续代码。
BOOL PeekMessage(
LPMSG lpMsg, //message information
HWND hWnd, //handle to window
UINT wMsgFilterMin, //first message
UINT wMsgFilterMax, //last message
UINT wRemoveMsg //移除标识, PM_REMOVE/PM_NOREMOVE
);
6、发送消息
SendMessage - 发送消息,会等候消息处理的结果,阻塞函数;
PostMessage - 投递消息,消息发出后立刻返回,不会等待消息执行结果,非阻塞函数。
BOOL SendMessage/PostMessage(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
7、消息类型
系统消息 - ID范围 0-0x03FF
由系统定义好的消息,可以在程序中直接使用。
用户自定义消息 - ID范围0x0400 - 0x7FFF(31743)
由用户自己定义,满足用户自己的需求。用户自己发出消息,并响应处理。
自定义消息宏:WM_USER
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)