学习方法:
主要就是模拟开发,即使你的基础不牢,模拟训练反而有助于对前期的语法理解。API的量大,API比SOCKET要简单一些,因为直观,按钮,下拉。
windows资源:
常用的资源有对话框、菜单、图标、光标、字符串表、快捷键、位图等。
1、窗口常用功能汇总:
a)SetForeGroundWindow
和BringToTop
SetForeGroundWindow() | BringToTop() |
---|---|
用于将指定的窗口设置为前台窗口,并激活它 | 用于将指定的窗口提升到所有非顶层窗口之上。 |
b)GetSystemMenu()
和GetMenu()
、SetMenu()
的区别
方法 | 说明 |
---|---|
GetSystemMenu() | 功能:用于获取窗口系统菜单的句柄。系统菜单是位于窗口标题栏左上角的小图标,当用户点击这个图标时,会弹出一个包含窗口控制命令的菜单。 |
GetMenu() | 功能:用于获取指定窗口的菜单句柄。 |
SetMenu() | 功能:用于设置指定窗口的菜单。 |
c)SetCapture设置捕捉的技术
- 通常在某个事件触发时调用 SetCapture,例如用户按下鼠标按钮。
- 一旦调用 SetCapture,鼠标事件(WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP 等)都会被发送到指定的窗口,即使鼠标光标移出了该窗口。
- 为了释放捕获,需要调用 ReleaseCapture 函数。
d)GetWindow主窗口遍历和子窗口搜索
2、消息分类:系统消息和用户消息:
a)类向导中第一页和第二页子窗口(反射型)消息和主窗口基础消息,全部都是系统消息。
b)系统消息的范围是:0-1024(WM_USER),用户消息(也叫自定义消息)的WM_USER到32767之间。
3、消息发送的用途:
a)往往是一个多线程程序的底层工作线程,向主线程的界面发送通知(包含数据)
b)子窗口向父窗口发送消息(可能携带数据)
c)一个进程向另外一个进程发送消息(可能携带数据)
注意:自从有了消息发送的方法之后,子窗口可以不再使用指针来调用父窗口了!!
参见CEyeCtrl:甚至都不知道父窗口是哪个类!!
4、面试题:SendMessage()
和PostMessage()
有什么区别
PostMessage
和SendMessage
都是 Windows API 中用于向窗口发送消息的函数,但它们在发送消息的方式和行为上有一些区别。PostMessage
:消息发送给目标窗口消息队列中后,立即返回,不等待结果返回,是是异步的。- 消息被放入目标窗口的消息队列中。
- 函数立即返回,不会等待目标窗口处理消息。
- 不保证消息的实时性和顺序性。
SendMessage
:发送给目标窗口后等待消息处理完成后才返回:- 消息直接发送给目标窗口。
- 函数等待目标窗口处理完消息后才返回。
- 保证消息的实时性和顺序性。
- 总结而言:
PostMessage
SendMessage
异步 同步 放入目标窗口消息队列中 发送给目标窗口,并等待消息处理完成 提高程序响应速度 可能会阻塞 无法保证消息的处理顺序 消息按顺序处理 如果不需要等待处理结果或 消息的实时性对应用程序没有太大影响 如果需要等待处理结果或 消息的顺序和实时性对应用程序非常重要
附录:主窗口是什么?
auto p = GetDesktopWindow();
p = p->GetWindow(GW_CHILD);
TCHAR s[256];
while §
{
//GetClassName(p->GetSafeHwnd(), s, _countof(s));
p->GetWindowText(s, _countof(s));
TRACE(_T(“主窗口:%s\n”),s);
p = p->GetWindow(GW_HWNDNEXT);
}