Windows01.内部机制初步认识

操作系统, 介于软件和硬件之间,所以通常都会将对硬件的操作封装,然后留出接口给编程者调用。也就是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中实现此函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的提千万

江山父老能容我,不使人间造孽钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值