获得主窗口句柄AfxGetApp()->m_pMainWnd

AfxGetApp()->m_pMainWnd

1: AfxGetApp()->m_pMainWnd这个东西就是主窗口的指针。即CMainFrame类的对象指针。很多东西的创建和它有关。以及可以用它来获取视图和文档指针。也可以使用AfxGetMainWnd();或 AfxGetApp()->GetMainWnd()

这个函数在程序的任何地方都可以调用的原因是它是一个全局函数,函数返回值是CWinApp * 。它将返回程序在进入WinMain()函数之前,系统就为程序创建好的一个CWinApp全局实例theApp,通过这个实例的成员变量 m_pMainWnd便可以很容易地在程序地任何地方得到程序的主窗口指针。进而可以引用主窗口类的成员变量和成员函数。

CWinApp* AfxGetApp( );

A pointer to the single CWinApp object for the application.

The pointer returned by this function can be used to access application information such as the main message-dispatch code or the topmost window.

返回值:指向应用程序的单一CWinApp对象的指针。

说明:
这个函数返回的指针可以被用来访问应用程序的信息,如主消息调度代码以及顶层窗口等。

MFC在开发的时候封装了一些全局的API函数,在这些函数的前面都会加上Afx这样的标志,因为是全局的函数,所以你在App类中不会找到,返回值是获得一个CWINApp类指针,至于什么时候会用到,当你要访问CWINApp类成员时候可以用啊,还有共享的时候也可以用的。 AfxGetApp();在文档中十分重要,它是一个全局函数,可以取得类的指针。在视图、框架、文档中起到穿针引线的作用,用它可以在它们之间随意的访问调用

2: CWinThread Class Members

Data Members

Specifies whether to destroy the object at thread termination. Handle to the current thread. ID of the current thread. (主窗口变量) Holds a pointer to the application’s main window. Pointer to the main window of the container application when an OLE server is in-place active. 用该成员变量去存储你的线程主窗口对象。当和m_pMainWnd 相关的窗口被关闭后,MFC会自动终止你的线程。如果该线程是应用程序主线程,程序也将会被终止。如果该数据成员为NULL,应用程序CWinApp对象的主窗口将用来决定什么时候去终止线程。m_pMainWnd是一个CWnd*类型的public变量。
很明显,你需要在重载InitInstance是为m_pMainWnd赋值。在工作线程中,m_pMainWnd自动继承其父线程的值。

补充:只有CWinThread对象才有m_pMainWnd
class CWinThread : public CCmdTarget
{
DECLARE_DYNAMIC(CWinThread)

public:
// Constructors
CWinThread();
BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

// Attributes
CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)
CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd)
BOOL m_bAutoDelete; // enables 'delete this' after thread termination
..............
}


//在用户界面线程中创建非模态对话框
if (!pDlg.Create(IDD_DIALOG1, NULL))
{
AfxMessageBox("窗口创建失败!");
}
else
{
pDlg.ShowWindow(SW_SHOW);
m_pMainWnd=&pDlg;
}

在创建用户界面线程时,该句一定要加上。否则在线程不会得到释放!

InitInstance是用来执行程序每次开始时都需要进行的初始化工作的最好地方。
如果用框架窗口作为主窗口,
m_pMainWnd = new CYourMainWindow;
如果用对话框作为主窗口,
CYourDlg dlg;
m_pMainWnd = &dlg;

m_HArrow=AfxGetApp()->LoadStandardCursor(IDC_ARROW);

m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);

问题:为什么写成:

m_HArrow=LoadStandardCursor(IDC_ARROW);

m_HCross=LoadStandardCursor(IDC_CROSS);

不行呢?此处 AfxGetApp()的用法,作用及返回值是什么?(帮助里看不清楚。)

 

LoadStandardCursor不是VC++的标准函数,也不是API的函数,它是CWinApp类的函数,当然你不能不写AfxGetApp()。AfxGetApp返回一个CWinApp对象指针,就是MFC生成的 C??App.cpp中定义的那个对象。如果你需要调用这个对象的某个成员函数,就可以使用AfxGetApp()函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值