• VC++桌面编程中获取句柄的几种方式:


    ==========================================================================================

    GetSafeHwnd得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)

    CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器

      HWND hwnd = pwnd->m_hwnd; //得到它的HWND

    这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:

      CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器

      HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND

      就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL,通过GetSafeHwnd()的实现代码就更清楚了:

      _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const

      {

      return this == NULL?NULL:m_hWnd;

      }

      你看有很多函数的参数要求HWND,它就可以派上用场了.

      HWND hwnd;

      CWnd* pWnd;

      pWnd=((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();

      hwnd=pWnd->GetDlgItem(IDC_EDIT2)->GetSafeHwnd();

      ::SetWindowText(hwnd,m_strResult);

    ==========================================================================================

    AfxGetApp用法:

          AfxGetApp           --    取应用程序实例指针   ( AfxGetApp( )是全局的。 )
          AfxGetMainWnd   --    取主窗口对象指针  
    AfxGetApp( )这个函数可以得到当前应用进程的指针,是CWinApp*类型的,通过这个指针可以访问到这个进程中的对象。
    比如在全局函数中要向对话框中的列表写数据。

    void writeString(char* pString)

       CWnd* pWnd = AfxGetApp()->GetMainWnd();
       CMyDlg * pDlg;
       pDlg=(CMyDlg *) pWnd;
       pDlg->ShowMsg(pString);

    AfxGetApp()得到进程指针CWinApp*,通过这个指针可以得到pWnd。要不在全局函数里你怎么对已存在的对话框操作呢。

    AfxGetApp( )这个函数可以得到当前引用的指针CWinApp*,通过这个指针可以访问到这个进程中的对象。

    ==========================================================================================

    我们在任何一个VC工程中都会看到一个类似于:

    //Test.cpp文件中

    CTestApp theApp;(工程名为Test)

    的语句。它是指向工程对象的一个指针,你可以用它方向Test工程的成员函数和变量。

    如果工程中添加了一个CConfig类,在CConfig中想调用Test工程中的成员函数和变量,则可以这样调用之:

    CTestApp *pApp=(CTestApp *)AfxGetApp( );

    如果在CTest类中我们声明如下一些变量:

    //Test.cpp文件

    class CTestApp : public CWinApp
    {
    public:

    CTestApp( );

    CString str; //添加的对话框变量

    ...

    }

    //Test.cpp文件

    CTestApp::CTestApp()

    {

    str="abc";

    }

    好了,现在我们就在CConfig类中调用str吧!

    //Config.cpp文件

    CTestApp *pApp=(CTestApp *)AfxGetApp( );

    AfxMessageBox(pApp->str);

    这样,就实现了对CTestApp类中变量的调用。

    AfxGetApp()这个函数在VC当中很常见,主要是用来获得CWinAPP生成的全局对象的。一般情况下将其强制类型转换成你自己写的App类就可以调用里面的方法了。但是如果编写的是DLL程序的话,情况会稍有不同。你会发现在DLL中调用AfxGetApp这个函数会得到DLL的应用对象。原因出现在DLL的模块状态上。应用程序在调用DLL时为了保证资源不出问题,往往会调用一句:

    AFX_MANAGE_STATE(AfxGetStaticModuleState())

    注意这是一个宏。他的作用是切换模块的全局变量范围,即把应用程序的那些全局变量拷贝切换到这个DLL的全局变量拷贝,自然用AfxGetApp得到就是DLL里面的这个APP了。如果向访问应用程序的App对象,那么只要把模块状态切换回去就可以了,记着执行完后一定要把状态再切换回来啊,否则就要出问题了。

    例如:

    // switch thread state back to application

    _AFX_THREAD_STATE* pState = AfxGetThreadState();

    AfxSetModuleState(pState->m_pPrevModuleState);

    // do something with the application

    AfxGetApp()->...

    // switch thread state back to dll

    AFX_MANAGE_STATE(AfxGetStaticModuleState())

    //<-------------------------------------------------------------------------->//

     

    获得CWinApp

    获得CMainFrame

    获得CChildFrame

    获得CDocument

    获得CView

    在CWinApp中

     

    AfxGetMainWnd()

    m_pMainWnd

    AfxGetMainWnd()->MDIGetActive()

    AfxGetMainWnd()->GetActiveFrame()

    SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

    MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

    SDI:AfxGetMainWnd()->GetActiveView()  
    MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()
    在CMainFrame中

    AfxGetApp()

    theApp

    MDIGetActive()

    GetActiveFrame()

    SDI:GetActiveView()->GetDocument()  
    MDI:MDIGetActive()->GetActiveView()->GetDocument()  
    SDI:GetActiveView()  
    MDI:MDIGetActive()->GetActiveView()
    在CChildFrame中

    AfxGetApp()

    theApp

    GetParentFrame()

     

    GetActiveView()->GetDocument()   GetActiveView()
    在CDocument中

    AfxGetApp()

    theApp

    AfxGetMainWnd()  

    AfxGetMainWnd()->MDIGetActive()

    AfxGetMainWnd()->GetActiveFrame()

    POSITION   pos   =   GetFirstViewPosition();GetNextView(pos)  
    在CView中

    AfxGetApp()

    theApp

    AfxGetMainWnd()   GetParentFrame()   GetDocument()
    在其他类中

    AfxGetApp()

    AfxGetMainWnd()  

    AfxGetMainWnd()->MDIGetActive()

    AfxGetMainWnd()->GetActiveFrame()

    SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

    MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

    SDI:AfxGetMainWnd()->GetActiveView()  
    MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()
    理一理MFC的这几个类的关系,可以很容易明白上面的这些乱七八糟的逻辑。
    App是应用域,所有的域中的东西都可以通过全局函数访问到它。
    MainFrame是主框架,也基本可以用全局函数访问到。

    MainFrame下是若干个ChildFrame,ChildFrame中若干个View和Document(可能不成对),ChildFrame管理着View,View和Document进行互操作。

    ==========================================================================================

    函数AfxGetInstanceHandle详细介绍函数AfxGetInstanceHandle详细介绍

    函数功能描述:获取当前运行程序的实例句柄

    函数原型:
    HINSTANCE AfxGetInstanceHandle( )

    返回值:
    获取当前运行程序的实例句柄,或者DLL的实例句柄

    注意:
         这个方法如果是在应用程序中调用,返回该应用程序运行实例的句柄。如果在DLL中调用,将可能返回DLL是实例句柄。

    示例:
    HINSTANCE hInstance = AfxGetInstanceHandle( );

    ==========================================================================================

  • 相关阅读:
    淘宝从几百到千万级并发的十四次架构演进之路!
    19 个强大、有趣、好玩、又装B的 Linux 命令!
    Spring Boot实战:拦截器与过滤器
    初识zookeeper,linux 安装配置zookeeper
    Spring-boot:5分钟整合Dubbo构建分布式服务
    Spring-Boot:6分钟掌握SpringBoot开发
    Dubbo的使用及原理浅析.
    Java消息队列--ActiveMq 初体验
    关于Ubuntu 常用的简单指令
    IBM、HPUX、Solaris不同之处
  • 原文地址:https://www.cnblogs.com/cy163/p/1932265.html
Copyright © 2020-2023  润新知