• 有没有上城客在越南的踪迹? 2019-10-14
  • 本人几天前就吃了几个粽子了。 2019-10-14
  • 德媒:起好中文名,洋品牌入华第一步 2019-10-10
  • 紫光阁中共中央国家机关工作委员会 2019-10-10
  • 鹅肝做成冰淇淋 玉米做成小螃蟹?这位意大利厨神太6了 2019-10-05
  • 库恩:2017,站在历史长河中看中国这一年 2019-09-19
  • 【昆明天气】最新昆明今天天气,实时提供昆明气温、空气质量、24小时天气预报、生活指数查询 2019-09-12
  • 拆迁背后玩猫腻造成国家巨额经济损失 南昌这名官员“栽”了 2019-09-12
  • 竹编:缝隙里的乡愁文章中国国家地理网 2019-08-29
  • 习近平:真抓实干埋头苦干万众一心 夺取脱贫攻坚战全面胜利 2019-08-25
  • 回复@笑傲江湖V:咱那么多帖子一个赞都没有,又是咋回事呢? 2019-08-25
  • 新能源汽车产业升级将呈三大变化 2019-08-19
  • 次仁卓玛一家的端午节 2019-08-16
  • 回复@看着就想笑,不要以你现在满脑子的资产阶级的思想去度量共产主义社会人们的思想。呵呵! 2019-08-14
  • 聚焦两会:五年间习近平去的第一个“团组”是哪些? 2019-08-14
  • 浙江省快乐12走势图表

     找回密码
     立即注册

    QQ登录

    只需一步,快速开始

    查看: 501|回复: 0
    打印 上一主题 下一主题

    上海时时乐开奖结果: MFC各种类型指针获取句柄方法

    [复制链接]
    跳转到指定楼层
    楼主
    发表于 2019-5-22 20:50:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决.

    HWND hWnd=::FindWindow(NULL,_T("Sphere"));      //得到对话框的句柄

    C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd); //由句柄得到对话框的对象指针

    pWnd->xxx( );   //调用C***Dialog中的函数xxx();


    通过窗口类函数:CWnd *GetWindow获得窗口指针,pWnd->m_hWnd(The handle of the Windows window attached to this  CWnd )在::FromHandle(hWnd);

    获取主窗口句柄:        CWnd *wnd  = AfxGetMainWnd();

                         HWND hwnd = wnd->GetSafeHwnd();

    设置控件为窗口焦点: GetDlgItem(IDC_TREE1)->SetFocus();

    获取控件句柄: HWND hwndctrl = ::GetDlgItem(mainHwnd, IDC_TREE1); // 获取树形控件的句柄 IDC_TREE IDC_COMBO1

    获取当前最上层窗口的句柄: HWND  mainHwnd = ::GetForegroundWindow(); //获取当前 topmost 的窗口句柄

    获取当前窗口的焦点句柄:          HWND  currentFocus = ::GetFocus();

    (一)MFC中获得各个类的句柄总结  

         VC中编程,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上

    必讲的内容,而且通过MSDN很多问题都能解决。 下 面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。

    下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。

    这其中的关键在于理解 m_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意义!

    1) 在View中获得Doc指针
    CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文档。
    2) 在App中获得MainFrame指针
    CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
    3) 在View中获得MainFrame指针
    CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
    4) 获得View(已建立)指针
    CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
    CyouView *pView=(CyouView *)pMain->GetActiveView();
    5) 获得当前文档指针
    CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
    6) 获得状态栏与工具栏指针
    CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
    CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

    7) 如果框架中加入工具栏和状态栏变量还可以这样
    (CMainFrame *)GetParent()->m_wndToolBar;
    (CMainFrame *)GetParent()->m_wndStatusBar;

    8) 在Mainframe获得菜单指针
    CMenu *pMenu=m_pMainWnd->GetMenu();
    9) 在任何类中获得应用程序类
    AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指针

    B1.如何在自己的类和“应用程序类”中获得“文档类”的句柄?
    SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指针
    MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指针
    B3.如何在“框架类”中获得“文档类”句柄?
    SDI GetActiveView() -> GetDocument() 得到指针,MDI MDIGetActive() -> GetActiveView() -> GetDocument() 从 CMainFrame 得到指针,GetActiveView() -> GetDocument() 从 CChildFrame 得到指针
    B4.如何在“视图类”中获得“文档类”句柄?
    GetDocument()

    C1.如何在“文档类”中获得“视图类”句柄?
    GetView(),调用 GetFirstViewPosition 和 GetNextView 函数得到指针。
    C2.如何在自己的类和“应用程序类”中获得“视图类”句柄?
    SDI GetActiveView 得到指针
    MDI MDIGetActive() -> GetActiveView() 从 CMainFrame 得到指针,GetActiveView 从 CChildFrame 得到指针


    最后提醒大家,在提取到各个句柄之后,因为初次提取的都是标准类句柄,所以,在使用时要注意将标准句柄转换成自己的类的句柄。如:
    AfxGetApp();//得到的是WinApp类的句柄,
    所以操作前记得转换成自己定义的类的句柄。
    如:((CMyApp*)AfxGetApp())->XXXX();//这的xxxx()就是你定义的类中间的成员。

    (二)MFC中 句柄、指针、ID之间的转换

    win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。

    从句柄到指针  
    CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached.  
    pWnd->Attach(hWnd); //Attaches a Windows window to a CWnd object

    从指针到句柄  
    HWND hWnd=pWnd->GetSafeHandle();  
    hWnd=pWnd->m_hWnd;

    SDK编程中窗口ID,句柄,指针三者相互转换函数  
    ID--HANDLE--HWND三者之间的互相转换  
    id->句柄-----------hWnd = ::GetDlgItem(hParentWnd,id);  
    id->指针-----------CWnd::GetDlgItem();  
    句柄->id-----------id = GetWindowLong(hWnd,GWL_ID);  
    句柄->指针--------CWnd *pWnd=CWnd::FromHandle(hWnd);  
    指针->ID----------id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);  
    GetDlgCtrlID();  
    指针->句柄--------hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;
    HICON->ID--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID);
    HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconID));


    附注:获得窗口句柄三种方法

    1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

    HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

    2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND

    VC++中有关句柄和指针及其转换

    1.MFC窗口的句柄和指针的转换
    (1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。
    (2)使用GetSafeHwnd函数取得程序所在窗口类的句柄
    (3)使用FromHandle函数来通过句柄得到其想要的指针
    其他的一些方法:
    GetActiveWindow 取当前活动窗口句柄
    AfxGetMainWnd   取主窗口句柄
    GetForegroundWindow 取前台窗口句柄
    FindWindow寻找参数指定的窗口
    EnumWindow枚举窗口

    2. 上下文无关设备的句柄和指针的转换
    (1)this->m_hDC
    (2)CDC::GetSafeHdc  
    (3)可以使用FromHandle函数来通过句柄得到其想要的指针

    3.Gdi对象的句柄和指针的转换
    (1)this->m_hObject
    (2)CGdiObject::GetSafeHandle
    (3)可以使用FromHandle函数来通过句柄得到其想要的指针

    4.窗口、控件的指针和句柄的相互转化

    (1)指针转化为句柄

    在MFC应用程序中首先要获得窗口的指针,然后将其转化为句柄

    CWnd* pWnd;

    HANDLE hWnd = pWnd->GetSafeHwnd();

    (2)句柄转化为指针

    在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针

    HANDLE hWnd;

    GetDlgItem(IDC_xxx,&hWnd);

    CWnd * pWnd = FromHandle(hWnd);

    获得程序窗口指针的办法

    (1)获得主框架窗口指针(任何时候都可以用,只要是MFC程序中)

    CWnd* pWnd = AfxGetMainWnd();

    (2)获得对话框中控件指针

    CWnd* pWnd = GetDlgItem(IDC_xxx);

    (3)获得对话框中某控件的句柄

    HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);

    (4)获得GDI对象的句柄

    HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();


    C VC C++ MFC 汇编 函数 脚本 辅助 多开 注入 内存 插件 破解 基址 窗口 大漠 绑定 编程 交流 论坛 实例 源码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    VC中文网 - 豫ICP备14012807号|小黑屋|联系客服|金币冲值|浙江省快乐12走势图表

    GMT+8, 2019-10-16 00:17 , Processed in 0.078125 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 浙江省快乐12走势图表 返回列表
  • 有没有上城客在越南的踪迹? 2019-10-14
  • 本人几天前就吃了几个粽子了。 2019-10-14
  • 德媒:起好中文名,洋品牌入华第一步 2019-10-10
  • 紫光阁中共中央国家机关工作委员会 2019-10-10
  • 鹅肝做成冰淇淋 玉米做成小螃蟹?这位意大利厨神太6了 2019-10-05
  • 库恩:2017,站在历史长河中看中国这一年 2019-09-19
  • 【昆明天气】最新昆明今天天气,实时提供昆明气温、空气质量、24小时天气预报、生活指数查询 2019-09-12
  • 拆迁背后玩猫腻造成国家巨额经济损失 南昌这名官员“栽”了 2019-09-12
  • 竹编:缝隙里的乡愁文章中国国家地理网 2019-08-29
  • 习近平:真抓实干埋头苦干万众一心 夺取脱贫攻坚战全面胜利 2019-08-25
  • 回复@笑傲江湖V:咱那么多帖子一个赞都没有,又是咋回事呢? 2019-08-25
  • 新能源汽车产业升级将呈三大变化 2019-08-19
  • 次仁卓玛一家的端午节 2019-08-16
  • 回复@看着就想笑,不要以你现在满脑子的资产阶级的思想去度量共产主义社会人们的思想。呵呵! 2019-08-14
  • 聚焦两会:五年间习近平去的第一个“团组”是哪些? 2019-08-14
  • 二中二平码免费资料 捕鱼高手的鸟 黑龙江11选五今天的开奖 湖北ll选五遗漏看 广东20选8今天开奖结果 时时彩100本金十期方案 我要玩模拟赛车游戏 波克捕鱼怎么卡炮 海南飞鱼开奖给果 福彩3d直选投注技巧 西游记娱乐城反水 福彩3d012路遗漏图表 贵州快三走势图下载 幸运飞艇开奖结果直播 快乐扑克3玩法视频