精华内容
下载资源
问答
  • MFC获取picture控件的鼠标点击坐标位置的方法
  • 在VS2013下用MFC构建获取鼠标位于picture控件实时坐标,和点击坐标,能获得点击处的实时坐标
  • 在一个自定义的Dialog中加入了picture控件,想要获取鼠标在该控件上的点击位置,遇到一些困难,最终解决了。方法如下:  其实挺简单的,首先用自定义的Dialog类重载CDialog的PreTranslateMessage函数,并在其中...

    转载来自:http://blog.csdn.net/wesleyluo/article/details/7056026  

    在一个自定义的Dialog中加入了picture控件,想要获取鼠标在该控件上的点击位置,遇到一些困难,最终解决了。方法如下:

         其实挺简单的,首先用自定义的Dialog类重载CDialog的PreTranslateMessage函数,并在其中用到了Dialog的OnLButtonDown函数(其实不用也行,我只是想把操作封在这个函数里)这样就可以通过此函数传递点击位置。

    BOOL PrintDialog::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class


    if(pMsg->message == WM_LBUTTONDOWN && GetDlgItem(IDC_PACKPIC)->GetSafeHwnd() == pMsg->hwnd)

       OnLButtonDown(MK_LBUTTON, pMsg->pt);   //在此传递点击部位在对话框中的坐标


    return CDialog::PreTranslateMessage(pMsg);
    }


    接下来在Dialog中的OnLButtonDown函数中判段是否点在picture控件内(lRect是控件的区域)

    if((point.x>=lRect.left && point.x<=lRect.right) && (point.y>=lRect.top && point.y<=lRect.bottom))
    {

                   //  通过对point的处理,获得实际在picture控件中的点击位置(坐标),完成。

    CRect lRect;
    GetDlgItem(IDC_PACKPIC)->GetWindowRect(&lRect);  //获取控件相对于屏幕的位置
    point.x-=lRect.left;

    point.y-=lRect.top;

    }


    展开全文
  • 在一个自定义的Dialog中加入了picture控件,想要获取鼠标在该控件上的点击位置,遇到一些困难,最终解决了。方法如下:  其实挺简单的,首先用自定义的Dialog类重载CDialog的PreTranslateMessage函数,并在其中...
        在一个自定义的Dialog中加入了picture控件,想要获取鼠标在该控件上的点击位置,遇到一些困难,最终解决了。方法如下:
    

         其实挺简单的,首先用自定义的Dialog类重载CDialog的PreTranslateMessage函数,并在其中用到了Dialog的OnLButtonDown函数(其实不用也行,我只是想把操作封在这个函数里)这样就可以通过此函数传递点击位置。

    BOOL PrintDialog::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class


    if(pMsg->message == WM_LBUTTONDOWN && GetDlgItem(IDC_PACKPIC)->GetSafeHwnd() == pMsg->hwnd)

       OnLButtonDown(MK_LBUTTON, pMsg->pt);   //在此传递点击部位在对话框中的坐标


    return CDialog::PreTranslateMessage(pMsg);
    }


    接下来在Dialog中的OnLButtonDown函数中判段是否点在picture控件内(lRect是控件的区域)

    if((point.x>=lRect.left && point.x<=lRect.right) && (point.y>=lRect.top && point.y<=lRect.bottom))
    {

                   //  通过对point的处理,获得实际在picture控件中的点击位置(坐标),完成。


    point.x-=lRect.left;

    point.y-=lRect.top;

    }

    展开全文
  • BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);
  • 需要通过点击控件,获取控件的位置,并标注。 通过尝试可以获知 控件坐标采用 GetWindowRect获得 ScreenToClient 鼠标按下事件内点 这样点和控件的坐标就在同一空间内了

    需要通过点击控件,获取控件的位置,并标注。

    通过尝试可以获知

    控件坐标采用

    GetWindowRect获得

    ScreenToClient

    鼠标按下事件内点

    这样点和控件的坐标就在同一空间内了

    展开全文
  • VS2010/MFC 获取ListControl鼠标点击位置

    千次阅读 2015-04-22 11:16:33
    在使用MFC编程的时候,在列表视图中通常会涉及到需要获取鼠标当前位置所对应的元素。这种通过光标位置来获得相应元素项的操作我们称之为命中测试。 2、获取光标位置 网上有人这样处理:   DWORDdwPos = ::...

    1、引言

           HitTest是命中测试的意思。在使用MFC编程的时候,在列表视图中通常会涉及到需要获取鼠标当前位置所对应的元素。这种通过光标位置来获得相应元素项的操作我们称之为命中测试。

    2、获取光标位置

    网上有人这样处理:

       DWORDdwPos = ::GetMessagePos();                                 //获得包含坐标信息的DWORD类型

     CPointpt(LOWORD(dwPos), HIWORD(dwPos));               //将坐标值转换为CPoint类型

        ScreenToClient(&pt);                                                                //将屏幕坐标转换为窗口客户区坐标

    考虑到兼容性、可移植性等不建议这样处理,原因如下:

    GetMessagePos

    外文名
    GetMessagePos                                                                   
    函数原型
         DWORD GetMessagePos(VOID)
    返回值
    返回值给出光标位置的X,y坐标
    速    查
    Windows NT:3.1及以上版本
    函数功能:该函数返回表示屏幕坐标下光标位置的长整数值。此位置表示当上一消息由GetMessage取得时鼠标占用的点。
    参数:无。
    返回值:返回值给出光标位置的X,y坐标。X坐标在低位整数,y坐标在高位整数。
    备注:如前所述,X坐标在返回值的低位整数,y坐标在高位整数(都表示有符号值,因为在多显示器的系统里可取得负值)。如果返回值赋给了一个变量,可用MAKEPOINT宏从返回值取得POINT结构。也可用GET_X_LPARAM或GET_Y_LPARAM宏来抽取X,y坐标,取得的坐标为屏幕坐标,并不是客户区坐标。
    要得到光标的当前位置而不是上一个消息发生时的位置,调用函数GetCursorPos。
    要点:不要用LOWORD或HIWORD宏来抽取鼠标位置的x,y坐标,因为在多显示器的系统里将返回不正确的结果。多显示器的系统里可取得负的x, y坐标,但LOWORD和HIWORD将坐标当作无符号量。
    Windows CE下,对那些使用记录笔而不是鼠标的设备,光标位置是指当上一信息由GetMessage取得时,记录笔在触屏上的位置。
    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。

    正确处理方式如下:

    CPoint  point;  
    GetCursorPos(&point); 

    3、在ListControl中获取当前选中项

    资源视图-->选中ListControl控件-->属性中点击闪电符号-->添加NM_CLICK(即鼠标通知消息),在响应函数OnNMClick****(NMHDR *pNMHDR, LRESULT *pResult)中添加如下代码:

    //获取当前光标位置

    CPoint  point;  
    GetCursorPos(&point);

     //将屏幕坐标转到客户区坐标
    m_list.ScreenToClient(&point);  (注意:CListControl m_list)

    或者

    ScreenToClient(this,&point);也可以实现屏幕坐标转客户区坐标

    参考:

    ScreenToClient

    顾名思义:ScreenToClient也就是Screen(屏幕坐标) 到 Client(客户区坐标)的转换。也就是说这个函数可以把你在屏幕上鼠标的位置转换为你打开的程序的客户区的坐标(位置)。

    函数功能:该函数把屏幕上指定点的屏幕坐标转换成用户坐标。
    函数原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
    BOOL ScreenToClient(
    HWNDhWnd,// handle to window
    LPPOINTlpPoint// screen coordinates
    );

    hWnd

    指向窗口的句柄,此窗口的用户空间将被用来转换。

    lpPoint

    指向POINT结构指针,该结构含有要转换的屏幕坐标。

    返回值

    如果函数调用成功,返回值为非零值,否则为零。


    LVHITTESTINFO

    typedef struct _LVHITTESTINFO {
      POINT pt;    //输入
      UINT  flags; //输出
      int   iItem;//输出
      int   iSubItem;//输出
      int   iGroup;//输出
    } LVHITTESTINFO, *LPLVHITTESTINFO;
    
    上面这个结构体给定pt值后,在应用命中测试(hittest)之后,其他三个参数就可以获取到数据。
    
    LVHITTESTINFO info;  
    info.pt = point;  
    int Itsub = m_list.SubItemHitTest(&info);  
    int row = info.iItem;//行号从0开始
    int col = info.iSubItem;//列号从0开始
    UINT UtEST = info.flags;//一般点击在可编辑的列上返回#define LVHT_ONITEMLABEL        0x00000004,点击到控件上的其他地方返回#define LVHT_NOWHERE            0x00000001
    
    参考:C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h
    #define LVHT_NOWHERE            0x00000001
    #define LVHT_ONITEMICON         0x00000002
    #define LVHT_ONITEMLABEL        0x00000004
    #define LVHT_ONITEMSTATEICON    0x00000008
    #define LVHT_ONITEM             (LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON)
    
    #define LVHT_ABOVE              0x00000008
    #define LVHT_BELOW              0x00000010
    #define LVHT_TORIGHT            0x00000020
    #define LVHT_TOLEFT             0x00000040
    
    
    #define LVHT_EX_GROUP_HEADER       0x10000000
    #define LVHT_EX_GROUP_FOOTER       0x20000000
    #define LVHT_EX_GROUP_COLLAPSE     0x40000000
    #define LVHT_EX_GROUP_BACKGROUND   0x80000000
    #define LVHT_EX_GROUP_STATEICON    0x01000000
    #define LVHT_EX_GROUP_SUBSETLINK   0x02000000
    #define LVHT_EX_GROUP              (LVHT_EX_GROUP_BACKGROUND | LVHT_EX_GROUP_COLLAPSE | LVHT_EX_GROUP_FOOTER | LVHT_EX_GROUP_HEADER | LVHT_EX_GROUP_STATEICON | LVHT_EX_GROUP_SUBSETLINK)
    #define LVHT_EX_ONCONTENTS         0x04000000 // On item AND not on the background
    #define LVHT_EX_FOOTER             0x08000000
    
    
    参考:https://msdn.microsoft.com/zh-cn/vstudio/bb774754关于该结构体的定义
    
    
    

    其他相关:CListControl类中有下面三个函数

        // Determines the visual feature of a subitem control under
        // the specified point.
        int SubItemHitTest(_In_ LPLVHITTESTINFO pInfo);


        // Determines the visual feature of the control under
        // the specified point.
        int HitTest(_In_ LVHITTESTINFO* pHitTestInfo) const;
        int HitTest(_In_ CPoint pt, _In_opt_ UINT* pFlags = NULL) const;


    注意体会区别,使用HitTest无法获取iSubItem的值,只能获得iItem的值,使用SubItemHitTest就可以获得iItem和iSubItem的值。



    总结:一般常用的如下

    void C*****Dlg::OnNMClick***(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
        // TODO: 在此添加控件通知处理程序代码
        CPoint  point;  
        GetCursorPos(&point);
        //将屏幕坐标转到客户区坐标
        m_list.ScreenToClient(&point);  (Glg.h文件中定义    CListCtrl m_list;)

        LVHITTESTINFO info;  
        info.pt = point;  
        int Itsub = m_list.SubItemHitTest(&info); 
        int row = info.iItem;//行号从0开始
        int col = info.iSubItem;//列号从0开始

    }

    MSDN给出的例子如下:

    void CListCtrlDlg::OnDblClk(NMHDR* pNMHDR, LRESULT* pResult)
    {
    	UNREFERENCED_PARAMETER(pResult);
    
    	LPNMITEMACTIVATE pia = (LPNMITEMACTIVATE)pNMHDR;
    	LVHITTESTINFO lvhti;
    
    	// Clear the subitem text the user clicked on.
    	lvhti.pt = pia->ptAction;
    	m_myListCtrl.SubItemHitTest(&lvhti);
    
    	if (lvhti.flags & LVHT_ONITEMLABEL)
    	{
    		m_myListCtrl.SetItemText(lvhti.iItem, lvhti.iSubItem, L"要输入的内容");
    	

    详细代码见:




    展开全文
  • MFC teechart控件 获取坐标 在teechart控件中绘制了几个空间点(x,y,z)想通过鼠标点击获取坐标值 有大佬会吗想请教一下 目前通过XScreenToValue函数获取到的坐标只有平面是正确的,三维就不正确了。 ...
  • 题目是老师布置的一道作业题,要求用C或C++完成,但不能用VTK/Opencv等软件包,经过很多摸索之后实现了该功能,后续可能还有其他功能要实现,所以先写一篇博客记录下,一方面是方便自己以后使用,另一...鼠标点击该...
  • 上篇博客简要介绍了如何利用MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值信息,主要包含了对话框的创建和添加程序,代码也在上一页中给了大家,但是并没有详细说明功能,所以在这一节当中主要...
  • 我想做一个界面,有三个控件,button,edit和picture,实现功能如下:点击button,鼠标限定在picture区域,单击鼠标,edit出现单击的坐标值,并且释放鼠标移动的区域。求大神们指点迷津!只要button内的代码即可
  • 我想在CDrawView类中定义一个public成员函数,void CDrawView::GetPoint(CPoint& point),功能是让用户在客户区窗口中点击鼠标选取一点,并返回该点的坐标。 但是问题是,如何在这个函数中等待鼠标单击事件,即等待...
  • MFC获取控件在屏幕上的绝对坐标

    千次阅读 2016-03-02 12:28:44
    通过鼠标点击事件可以获取控件在当前客户区的相对坐标,但有些时候不同地方获取坐标值不一致,如,在派生PICTURE控件类内部的鼠标事件所获取坐标值是相对该控件的,与在主窗体所获取坐标是不对应的(无法直接...
  • MFC】模拟鼠标点击代码

    千次阅读 2013-10-15 15:24:18
    MFC 工程 把以下代码放到你想要响应的函数里面...//获取鼠标在屏幕的当前位置 SetCursorPos(100,200);//移动到某点坐标 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//点下右键 mouse_event(MOUSEEVENTF_RIGHTUP,0,
  • MFC模拟鼠标点击

    2019-10-03 20:05:03
    MFC 工程 把以下代码放到你想要响应的函数...//获取鼠标在屏幕的当前位置SetCursorPos(100,200);//移动到某点坐标mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//点下右键mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0...
  • mat:成员变量,存放mat图像 widthPicCtrl:图像控件的宽度 width:mat图的宽 leftTop:图像控件的左上...//获取鼠标点击处的像素值 void CCameraLinkTestDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO...
  • mfc里作图用到的坐标以及颜色值,使用方法,点击启动后 按获取颜色坐标按钮 然后 将鼠标放到 所要求的位置 按空格就可以获取
  • 我已经把“view”窗口嵌入到mfc控件中(如下图代码),打算用opencv的鼠标事件来进行操作,然而我在用setMouseCallback("view", on_mouse, NULL)调用函数on_mouse时,on_mouse函数里的鼠标滚轮事件完全不响应,其他...
  • 1、首先鼠标左键按下,获取起始点坐标;这个过程中需要判断鼠标是否放在图片显示控件上,若是才会响应事件! 2、然后鼠标移动,实际上在这里,这一步没有执行任何操作! 3、最后鼠标左键抬起,获取停止点坐标;这...
  • 目前是使用trackball,通过获取鼠标点击和释放点的坐标得到旋转矩阵,然后对视点进行旋转,实现图像的旋转。可是程序运行的问题是我拖动鼠标,图像没有旋转而是在放大跟缩小,找了两三天都不知道问题出在哪里,求...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

mfc获取鼠标点击坐标