zoukankan      html  css  js  c++  java
  • 消息映射与处理

    WM_KEYDOWN:某一键被按下

    WM_KEYUP:某一键弹起

    WM_CHAR:某一键按下又弹起,输入了一个字符        进入消息处理函数OnChar

    其参数并不是虚键码,而是默认的ASCII码

    CPoint型变量     记录位置

     1 CPoint ptCharacter;                //记录字符位置
     2 if(nChar==13)                        //按下了回车键
     3     {
     4         //换行
     5         ptCharacter.x=0;
     6         ptCharacter.y=ptCharacter.y+25;
     7     }
     8     else
     9     {
    10         CClientDC dc(this);
    11         dc.TextOut(ptCharacter.x,ptCharacter.y,(LPCTSTR)&nChar);        //输出显示字符
    12         CSize textsize;
    13         textsize=dc.GetTextExtent((LPCTSTR)&nChar);                //获取当前字符大小
    14         //前进到下一个字符位置
    15         ptCharacter.x=ptCharacter.x+textsize.cx;
    16     }

    键盘插入符(Caret)是一个闪烁的位图,可以使用户知道在窗口何处进行有效的键盘输入

    Windows总是把键盘消息送到拥有输入焦点的窗口,接收键盘消息的窗口称为有“输入焦点”的窗口,具有输入焦点的窗口称为活动窗口。

    WM_SETFOCUS  通知即将接收输入焦点的窗口,当窗口获得键盘焦点时,就可以创建插入符了,若窗口没有焦点,就不能进行键盘输入。

    插入符一旦创建起来,还要在窗口对其进行定位和显示。

    void CCaretKeyDemoView::OnSetFocus(CWnd* pOldWnd) 
    {
        CView::OnSetFocus(pOldWnd);
        
        // TODO: Add your message handler code here
            CreateSolidCaret(3, 18);                            //创建插入符
            SetCaretPos (ptCharacter);                            //将插入符移到当前字符输入点
            ShowCaret ();                                    //显示插入符    
    }

    使用API函数keybd_event可以触发WM_KEYDOWN或者WM_UP键盘消息,模拟键盘的输入

    为用户在视图窗口中按下鼠标左键,拖动鼠标时,在窗口中绘制一个随鼠标位置变化的椭圆,当释放鼠标键时,停止椭圆绘制。

    BOOL bDrag;                        //是否在拉动
    CPoint ptDown;                    //鼠标左键按下位置
    CPoint ptUp;                        //鼠标左键释放位置
    
    
    
    //初始化成员变量
    bDrag=false;
    ptDown.x=ptDown.y=0;
    ptUp.x=ptUp.y=0;
    
    
    void CBaseMouseDemoView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
        bDrag=TRUE;
        ptUp=ptDown=point;//记录鼠标当前位置
        CView::OnLButtonDown(nFlags, point);
    }
    
    void CBaseMouseDemoView::OnLButtonUp(UINT nFlags, CPoint point) 
    {
        if(bDrag)
        {
            ptUp=point;
            DrawCircle();                                    //画新圆
            bDrag=FALSE;
        }
        
        CView::OnLButtonUp(nFlags, point);
    }
    
    void CBaseMouseDemoView::OnMouseMove(UINT nFlags, CPoint point) 
    {
        if(bDrag)
        {
            ptUp=point;//记录鼠标的当前位置
            DrawCircle();                                    //画新圆
        }
        CView::OnMouseMove(nFlags, point);
    }
    
    void CBaseMouseDemoView::DrawCircle()
    {
        Invalidate(false);
        CClientDC dc(this);                            //获取DC
        CRect rect;
        GetClientRect(rect);                            //获取客户窗口区域
        CBrush brush(RGB(255,255,255));
        dc.FillRect(rect,&brush);                        //填充背景色为白色
        dc.Ellipse(ptDown.x,ptDown.y,ptUp.x,ptUp.y);        //绘制矩形
    
    }

    // 将提示性文字隐藏
    GetDlgItem(IDC_TEXT)->ShowWindow(SW_HIDE);

    实现鼠标的捕捉功能,即当用户在客户区窗口中单击鼠标左键后,该窗口实现对鼠标的捕捉,并记录鼠标的位置坐标,而当双击鼠标时,则释放捕捉

    使用API函数SetCapture()可以实现鼠标的捕获

    其原型为HWND SetCapture(HWND hWnd);

    一旦某个窗口捕获了鼠标,其他窗口将无法得到鼠标消息,因此,当窗口不再需要捕获鼠标消息时,应及时使用ReleaseCapture()函数将鼠标释放。

    void CCaptureMouseView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
        // TODO: Add your message handler code here and/or call default
        SetCapture();//捕捉鼠标
        CString s;
        s.Format("用户摁下鼠标左键的位置:X=%d,Y=%d",point.x,point.y);
        CClientDC dc(this);                                        //获得DC
        dc.TextOut(30,40,s);                        //输出文本
        CView::OnLButtonDown(nFlags, point);
    }
    
    
    
    void CCaptureMouseView::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
        // TODO: Add your message handler code here and/or call default
        ReleaseCapture();//释放鼠标    
        CClientDC dc(this);                                        //获得DC
        dc.TextOut(30,40,"释放了鼠标,此时可以响应客户窗口以外的鼠标命令!");                        //输出文本
    
        CView::OnLButtonDblClk(nFlags, point);
    }
    
    void CCaptureMouseView::OnLButtonUp(UINT nFlags, CPoint point) 
    {
        // TODO: Add your message handler code here and/or call default
        CString s;
        s.Format("用户松开鼠标左键的位置:X=%d,Y=%d",point.x,point.y);
        CClientDC dc(this);                                        //获得DC
        dc.TextOut(30,80,s);                        //输出文本
        
        CView::OnLButtonUp(nFlags, point);
    }

    创建和使用自定义消息

    #define WM_MYMESSAGE (WM_USER+100)       //声明自定义消息

    afx_msg LRESULT OnMyMessage(WPARAM w,LPARAM l); //声明消息响应函数

    ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)            //添加消息响应宏

    PostMessage(WM_MYMESSAGE, IDC_BUTTON1);

    PostMessage  只把消息放入队列,不管其他程序是否处理都继续执行;

    SendMessage 必须等待其他程序处理消息后才继续执行

    使用VC提供的范围消息映像宏,可以实现为ID在某一范围内的对象添加同一个消息处理函数

    ON_COMMAND_RANGE(ID_MENUITEM1,ID_MENUITEM4,OnMenuItemCommandRange)//命令消息映射
    ON_UPDATE_COMMAND_UI_RANGE(ID_MENUITEM1,ID_MENUITEM4,OnUpdateMenuItemCommandRange)//界面消息映射

  • 相关阅读:
    Jenkins+Ansible+Gitlab自动化部署三剑客(四)--Jenkins Linux shell集成
    Jenkins+Ansible+Gitlab自动化部署三剑客(三)--Jenkins
    腾讯云从业者线上课程(一)--云计算技术架构
    腾讯云从业者线上课程(一)--云计算发展历史
    nmcli 静态方式添加IP地址
    nmcli
    systemctl 控制单元
    ansible组件 Ad-Hoc
    ansible 定义主机用户和密码
    ansible 主机清单 /etc/ansible/hosts
  • 原文地址:https://www.cnblogs.com/wangfx91/p/4981135.html
Copyright © 2011-2022 走看看