5373|10

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC 下拉菜单如何获得屏幕坐标???请大家看看,急求!!! [复制链接]

铁笔点击TreeCtrl中的选定一点弹出此菜单。   
  我用ON_MESSAGE(WM_CONTEXTMENU,   OnContextMenu)   
  让WM_CONTEXTMENU消息触发   OnContextMenu   
  在OnLButtonDow中加入以下代码   
  if(SHRecognizeGesture(point,true))   
      {   
            ::PostMessage(this->m_hWnd,GN_CONTEXTMENU,0,0);   
        }   
  我的OnContextMenu)如下   
  void   CView::OnContextMenu(UINT   nFlags,CPoint   point)   
  {   
  CMenu   menu;   
  GetCursorPos(&point);
  menu.LoadMenu   (IDR_POP1);   
  menu.GetSubMenu   (0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_TOPALIGN,point.x,point.y,this);   
  }   
  虽然浮动式菜单可以出现,但总是出现在屏幕的最下方,无法出现在点南击处的旁边

最新回复

KevinCEC高手 给个代码看看好吗?? 最近好久没来看了   详情 回复 发表于 2008-2-25 09:49
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
GetCursorPos()得到的是屏幕坐标,你这个应该用窗口坐标吧?
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

每次GetCursorPos都是返回0,也就是说,无法获得鼠标的位置
查了一下帮助文档,发现内中有一句:The   calling   process   must   have   WINSTA_READATTRIBUTES   access   to   the   window   station.也就是说,必须要获得设备读取权限,可这在EVC的文档中没有定义,那该如何开启呢?VC下面的方法,好像是OpenWindowsStation在EVC中没有  
GetLastError返回的值是DWORD,换算成10进制数值是120,对应的错误是This   function   is   not   valid   on   this   platform.   就是说平台不支持该函数,在Emulator上运行很好,但是到PDA上就没反应了。




窗口坐标应该怎么获得呢????
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
OnContextMenu(UINT       nFlags,CPoint       point)这个函数的point参数是可以带坐标的。 你应该在if(SHRecognizeGesture(point,true))      
            {      
                        ::PostMessage(this-> m_hWnd,GN_CONTEXTMENU,0,0);      
                }      
这里就获取坐标传进去。
参考一下MSDN的例子:
case WM_LBUTTONDOWN:
{
  SHRGINFO    shrg;
  HMENU       hmenu;

  shrg.cbSize = sizeof(shrg);
  shrg.hwndClient = hWnd;
  shrg.ptDown.x = LOWORD(lParam);
  shrg.ptDown.y = HIWORD(lParam);
  shrg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION;

  if (SHRecognizeGesture(&shrg) == GN_CONTEXTMENU) {
    hmenu = GetSubMenu(g_hMainMenu, 0);
    TrackPopupMenuEx(hmenu,
                     TPM_LEFTALIGN,
                     LOWORD(lParam),                                             
                     HIWORD(lParam),
                     hWnd,
                     NULL);
  }
  break;
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
我改过的代码,还是没有在PDA上得到。。。。。
void CServiceDlg::OnLButtonDown(UINT nFlgs,CPoint point)
{
        SHRGINFO shrg;
        HMENU hmenu;

        shrg.cbSize = sizeof(shrg);
        //shrg.hwndClient = hWnd;
        shrg.ptDown.x = LOWORD(&point);
        shrg.ptDown.y = HIWORD(&point);
        shrg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION;

        if(SHRecognizeGesture(point,true))      
            {      
                    ::PostMessage(this->m_hWnd,WM_CONTEXTMENU,shrg.ptDown.x,shrg.ptDown.y);      
                }      
CDialog::OnLButtonDown(nFlags,poinnt);
}
void CServiceDlg::OnContextMenu(CWnd* pWnd,CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_POP1);
GetCursorPos(&point);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN ?TPM_TOPALIGN,point.x,point.y,this);      
}

不知道是不是你说的意思??

如果可以帮忙改改可以么?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
我这里没有PDA,具体也无法实验: 但是我认为可以有两种方法验证:看红色的部分
1》void   CServiceDlg::OnLButtonDown(UINT   nFlgs,CPoint   point)
{
                SHRGINFO   shrg;
HMENU   hmenu;

shrg.cbSize   =   sizeof(shrg);
//shrg.hwndClient   =   hWnd;
shrg.ptDown.x   =   LOWORD(&point);
shrg.ptDown.y   =   HIWORD(&point);
shrg.dwFlags   =   SHRG_RETURNCMD   ?   SHRG_NOANIMATION;

                if(SHRecognizeGesture(point,true))               
                        {               
                                        ::PostMessage(this-> m_hWnd,WM_CONTEXTMENU,shrg.ptDown.x,shrg.ptDown.y);               
                                }            
不要发送消息,可以直接在红色部分执行MENU的功能。
2》 第二个方法就是 修改发送消息的参数:也是在红色部分:  ClientToScreen(&point); //如果你取的是client坐标,先转一下   
        SendMessage(m_hwnd, WM_CONTEXTMENU,0,MAKELPARAM(point.x,point.y));     //参数要一起发过去,然后接收部分就可以直接用了。

lucky

 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
第一个方法试过了 if(SHRecognizeGesture(point,true))                              
                                                {                              
    CMenu       menu;      
    GetCursorPos(&point);
    menu.LoadMenu       (IDR_POP1);      
    menu.GetSubMenu       (0)-> TrackPopupMenu(TPM_LEFTALIGN ?TPM_TOPALIGN,shrg.ptDown.x,shrg.ptDown.y,this);                                   
                                                                }
没有变化
第二个方法 if(SHRecognizeGesture(point,true))                              
                                                {                              
                                 ClientToScreen(&point);                  
::SendMessage(m_hwnd,   WM_CONTEXTMENU,0,MAKELPARAM(shrg.ptDown.x,shrg.ptDown.y));      
                                                                    }                           
也是没有反应阿
都是在PDA的右上方出现的菜单
GetCursorPos 这个函数在pda platform 上有错误120
如果一直在OnLButtonDown里调用contextmenu 是不是会没有反应呢??
我刚刚接触evc 不知道说的对不对,请多多指教
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
不应该啊,你再试下红色的部分,MFC我也不太熟悉,都是用API来做的,如果再不行,那可没招了(建议你多试几次坐标的转换,搞不好就是坐标没转对,另外最笨的办法就是添加TREEVIEW本身的消息处理来创建MENU)。另外你可以参考一下这个:
http://www.codeproject.com/KB/edit/CRichEditControl50W.aspx
(还是老外好)

void   CServiceDlg::OnLButtonDown(UINT   nFlgs,CPoint   point)
{
                SHRGINFO   shrg;
HMENU   hmenu;

shrg.cbSize   =   sizeof(shrg);
//shrg.hwndClient   =   hWnd;
shrg.ptDown.x   =   LOWORD(&point);
shrg.ptDown.y   =   HIWORD(&point);
shrg.dwFlags   =   SHRG_RETURNCMD   ?   SHRG_NOANIMATION;

                if(SHRecognizeGesture(point,true))               
                        {               
                              
//ScreenToClient(&pt);
CMenu menu;
menu.LoadMenu(IDR_CONTEXTMENU);
CMenu *pMenu;
pMenu=menu.GetSubMenu(0);
  pMenu->TrackPopupMenu(TPM_LEFTALIGN,shrg.ptDown.x,shrg.ptDown.y,this);


         
                                }            
CDialog::OnLButtonDown(nFlags,poinnt);
}
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

9
 
我做的都是基于对话框,添加TREEVIEW本身的消息处理来创建MENU 这个方法可能不好用。
我也觉得的是坐标没有找对,我在试试吧。。。。
谢谢你的指点,问题解决就散分了
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
触摸屏应该模拟的是键盘消息而不是鼠标. 所以鼠标位置会不对.
直接获取控件的位置从而获得坐标.
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
KevinCEC高手 给个代码看看好吗??
最近好久没来看了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表