MFC笔记

本文介绍了Windows程序中的队列消息与非队列消息处理,包括消息寄送与发送的区别,以及在MFC中GetTextMetrics()和GetTextExtent()函数的应用。同时,详细阐述了MFC中菜单项响应顺序和消息分类,如标准消息、命令消息和通知消息。此外,还提及了在VS2012中添加自定义消息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、队列消息与非队列消息

      Windows为当前运行的每个Windows程序维护一个“队列消息”。在消息循环过程中,队列消息被“发送”给消息队列,而非队列消息则“发送”给窗口过程。在消息循环中,队列消息被重新传回并分配给窗口过程, 非队列消息在Windows调用窗口时直接传送给窗口过程。有些消息既可以是作为队列消息也可以作为非队列消息,看发给谁了。

2、消息寄送和消息发送

     (1)消息寄送

       寄送一个消息时,把消息发送到拥有那个窗口的应用程序的消息队列中。当应用发现自己有空闲时,就搜索消息队列,并在消息队列中处理消息,即从消息队列中删除它们,并将它们发送到指定的窗口。寄送消息用PostMessage()。

      (2)发送消息

        发送一个消息时,消息不进入目标窗口的消息队列,本质上与直接调用窗口处理过程一样,通信时即时的。发送消息使用SendMessage()

3、GetTextMetrics()和GetTextExtent()

     GetTextMetrics()获得指定字体的尺寸
     GetTextExtent()获得是指定字符串的尺寸

4、路径层功能演示

       CString str ;
str = "dkjfffsdddddddddddddddd" ;
pDC->TextOutW(50 , 50 , str); 
CSize sz = pDC->GetTextExtent(str) ;


str.LoadStringW(IDS_STRWEI) ;
pDC->TextOutW(0 , 200 , str) ;


pDC->BeginPath();
pDC->Rectangle(50 , 50 , 50 + sz.cx , 50 + sz.cy) ;
pDC->EndPath() ;


pDC->SelectClipPath(RGN_DIFF) ;
for(int i = 0 ; i < 300 ; i += 10)
{
pDC->MoveTo(0 , i) ;
pDC->LineTo(300 , i) ;


pDC->MoveTo(i , 0) ;
pDC->LineTo(i , 300) ;
}

5、MFC中对一个菜单项的响应顺序

    先是View类,再是Doc类,再是MainFrame类,最后是App类

6、消息分类

  (1)标准消息
    除WM_COMMAND之外,所有WM_开头的消息。
    从CWnd派生的类,都可以接受到这类消息
  (2)命令消息
    来自菜单、加速键或工具栏按钮的消息。
    这类消息都以WM_COMMAND呈现,在MFC中,通过
    菜单项的标识(ID)来区分不同的命令消息:在SDK中
    通过消息的wParam参数识别。
    从CCmdTarget派生的类,都可以接收到这类消息。
  (3)通知消息
    由控制产生的消息,例如,按钮的单击,列表框的选择等
    产生此类消息,为的 是向父窗口(通常是对话框)通知事件的发生。
    这类消息也是以WM_COMMAND形式呈现。
    从CCmdTarget派生的类,都可以接收这类消息。

7、VS2012中添加自定义消息通过类向导方便些,但是需要自定义用户消息ID

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值