概述
操作系统, 介于软件和硬件之间,所以通常都会将对硬件的操作封装,然后留出接口给编程者调用。也就是API(Application Programming Interface),Windows的主要函数都在Windows.h头文件中声明。具体的可以通过MSDN查询。
SDK,Software Development Kit,就是软件开发包。Windows SDK包括API函数、帮助文档、辅助工具等等。
窗口和句柄
Windows本来直译就是很多窗口,所以可见窗口的重要性。Windows系统中,窗口是一个交互的工具,接受用户的输入,显示输出。
窗口可以分为客户区和非客户区。我们用的部分就是客户区;系统自带的比如标题、菜单、最大最小化等等就是非客户区。
窗口也有父子之分,还有模态和非模态之分。模态就是子窗口不动,父窗口可以动,比如QQ聊天窗口和好友列表窗口,两者有交互但是互不影响。非模态就是子窗口必须处理完才能处理父窗口,比如警告。
窗口的表示就是句柄(HWND),可以理解为,你把书用绳子捆起来,就会比较好提。句柄就是把窗口、图标等等资源捆起来,然后打个结,做个标记。系统就按着你这个标记给你分配内存什么的。
有人也许会问,传递首地址不可以么?可以!但是会暴露内存地址,不安全。所以操作系统会有个映射表(句柄表),将地址和标记对应,很巧,这就是句柄。
常见句柄分类:
消息和消息队列
我们可以将操作系统比喻成卖冰淇淋的,然后有很多孩子想吃,就排队,还排成一个圈,循环吃。这些孩子就是消息,这个队伍就是消息队列。会一直循环,然后操作系统就依次处理。然后消息对应着事件,当轮到这个消息的时候,操作系统就会处理对应的事件。这个队伍可以不断有孩子插队和离开。
//MSG结构体:
typedef struct tagMSG {
HWND hwnd; //句柄,属于哪个窗口的
UINT message; //消息ID,不同数值表示不同消息
WPARAM wParam; //附加信息1
LPARAM lParam; //附加信息2
DWORD time; //时间
POINT pt; //鼠标位置
} MSG;
消息分类:
- 窗口消息:一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。
- 命令消息:一般与处理用户请求相关,当用户单击一个菜单项或工具栏时,命令消息产生,并被发送到能处理该请求的类对象(如,装载文件、编辑文本和保存选项等)。
- 控件通知:在某些重要事件发生时,由控件窗口发送到父窗口,控件通知为父窗口进一步控制子窗口提供了机会。
消息映射:
1、消息和消息处理函数。
2、SDK是遍历判断,MFC是消息映射,会快很多。(SDK编程是ifelse判断,MFC直接是switch)
Windows消息分类:
系统消息:WM_COMMAND等,ID区分的消息,通知消息(窗口之间的传递)。
自定义消息:宏,值应该大于等于WM_USER。
具体实现:函数声明—>消息映射入口—>消息处理函数
1.在类定义中加入消息处理函数的函数声明,注意要以afx_msg打头。
例如:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);。
函数原型为afx_msg void OnApplicationLook(UINT id);参数id为用户操作的菜单项等的ID。
2.在类的消息映射表中添加该消息的消息映射入口项。
//ON_NOTIFY是控件向其父窗口发送消息处理的宏
//ON_COMMAND是菜单和工具栏项处理消息的宏
//ON_MESSAGE是处理自定义消息的宏。
ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize);//消息ID,消息处理函数
ON_NOTIFY(wNotifyCode,id,memberFxn) //消息通知码,控件ID,消息处理函数
//ON_MESSAGE看下方的自定义消息
如果想要使用某个处理函数批量处理某些命令消息,则可以像CMainFrame消息映射表中的
ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7,&CMainFrame::OnApplicationLook)
3.在类实现中添加消息处理函数的函数实现。
例如,MainFrm.cpp中WM_CREATE的消息处理函数的实现:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ……}
如果需要使用用户自定义消息:
首先要定义消息宏,如:#define WM_UPDATE_WND (WM_USER+1);
再到消息映射表中添加消息映射入口项:ON_MESSAGE(WM_UPDATE_WND, &CMainFrame::OnUpdateWnd);
然后在MainFrm.h中添加消息处理函数的函数声明:afx_msg LRESULT OnUpdateWnd(WPARAM wParam, LPARAM lParam);
最后在MainFrm.cpp中实现此函数。
最后
以上就是紧张大山为你收集整理的Windows01.内部机制初步认识的全部内容,希望文章能够帮你解决Windows01.内部机制初步认识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复