| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9746 人关注过本帖
标题:如何获取窗口中的控件位置?
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:20 回复次数:5 
如何获取窗口中的控件位置?
我使用
            CWnd * pWnd = FromHandle(childhwnd);            // 得到控件的指针
            CRect rectBtn,rectBtn1;
            pWnd->GetWindowRect(&rectBtn);  // 得到的是在屏幕坐标系下的RECT
            rectBtn1 = rectBtn;
            ScreenToClient(&rectBtn);       // 得到的是在客户区坐标系下的RECT
得到确定按钮的坐标,
[附件ID:attach_1名称:确定.JPG]
图片附件: 游客没有浏览图片的权限,请 登录注册

但是 rectBtn和rectBtn1 与我的设计坐标值一个也对不上,这个是为什么呢 ?
[附件ID:attach_2名称:确定1.JPG]
搜索更多相关主题的帖子: 控件 窗口 位置 获取 
2009-09-06 09:28
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
我设计中 确定按钮的位置如下描述:
IDD_QQHASH_DIALOG DIALOGEX 0, 0, 223, 97
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "QQHash"
FONT 9, "宋体"
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,125,66,50,14
    PUSHBUTTON      "取消",IDCANCEL,33,66,50,14
    LTEXT           "MD5:",IDC_STATIC_MD5,27,33,20,8
    LTEXT           "密码:",IDC_STATIC_SECRET,23,19,25,8
    LTEXT           "QQHash:",IDC_STATIC_QQHash,16,45,33,8
    EDITTEXT        IDC_EDIT_SECRET,53,13,153,14,ES_PASSWORD |
                    ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_MD5,53,29,153,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_QQHASH,53,44,154,14,ES_AUTOHSCROLL
END
按照上面的描述,得到的left 应该是 125,但是不管是rectBtn还是rectBtn1,他们的left值均不是125?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009-09-06 09:40
吕伟
Rank: 2
等 级:论坛游民
帖 子:86
专家分:44
注 册:2009-3-7
收藏
得分:10 
窗口控件获取的时候应该错误了吧,换个函数获取下,或者在那里设个断点,看是否获取~~~~~~~
2009-09-08 08:21
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
hai有什么函数可以使用呢 ??

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009-09-10 12:18
liuxingyu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:10
注 册:2009-3-1
收藏
得分:10 
你试试用函数FromHandlePermanent()来获取窗口指针
2009-09-10 15:15
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
你可以参考   MFC   代码中   FromHandle      FromHandlePermanent   的实现,这两个函数都是在公共的   CMapHandle   中查找句柄对应的   CWnd   对象(通过一个CBT钩子,CWnd   对象将创建时得到的句柄和自己的指针纪录到   CMapHandle),区别是如果找不到相关的对象,FromHandle   在CMapHandle      temporarylist   中创建并返回一个临时对象的指针   ,而   FromHandlePermanent   返回   NULL(此外   FromHandlePermanent   不使用   temporarylist   ,所以不查找   temporarylist   下的句柄)。  
   
  我想   MFC   引入这个机制的原因是需要从   WindowProc、钩子或   API   返回的   HWND   值中得到“正确”的   CWnd   指针,比如   CMainFrame,   CView   的指针。因为需要从这些指针调用   CWnd   的虚函数(如PreTranslateMessage),这些虚函数可能被重载过。  
   
  大部分情况下,对任意句柄使用   FromHandle   是不错的,因为大多情况下只利用返回的   CWnd   指针调用的非虚函数,返回的即使是一个临时对象,调用也是正确的(MFC   中较少用   FromHandlePermanent,除非确定句柄是由本线程创建的或不需要创建临时对象)。  
   
  但是在某些情况下,比如从使用   MFC   的非   Extension   DLL   中创建的窗口,这个机制会有问题,因为窗口创建在其他的   MFC   模块之下,在   EXE   中调用   FromHandle,由于该模块的   CMapHandle   对象某有相关的纪录,所以只能得到临时对象,如果使用返回的指针调用   CWnd   的虚函数如   PreTranslateMessage,得到调用的是   CWnd::PreTranslateMessage,而不是   DLL   中的   CWnd   派生类重载过的   CWnd::PreTranslateMessage。我觉得   “FromHandle   有可能失效”这种情况是   MFC      Bug   的主要来源。  
   
  关于   CMapHandle   的描述可以参考   MFC   代码中的以下函数和结构:  
  _AFX_MODULE_THREAD_STATE,CThreadLocal  
  CHandleMap*   PASCAL   afxMapHWND(BOOL   bCreate)  
  LRESULT   CALLBACK   _AfxCbtFilterHook(int   code,   WPARAM   wParam,   LPARAM   lParam)  
  BOOL   CWinThread::PreTranslateMessage(MSG*   pMsg)  
  BOOL   PASCAL   CWnd::WalkPreTranslateTree(HWND   hWndStop,   MSG*   pMsg)

根据上面的意思,显然如果我使用FromHandlePermanent在不能找到一个合适的句柄时返回的是Null,仍旧不能得到确定键吧?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009-09-10 20:16
快速回复:如何获取窗口中的控件位置?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029622 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved