博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获得主窗口句柄AfxGetApp()->m_pMainWnd
阅读量:3660 次
发布时间:2019-05-21

本文共 2566 字,大约阅读时间需要 8 分钟。

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()函数。

转载地址:http://khqfn.baihongyu.com/

你可能感兴趣的文章
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
查看>>
C语言 %zu
查看>>
C语言 alignof 运算符
查看>>
Intellij Idea简单打war包流程
查看>>
数据库 drop、truncate和delete简述
查看>>
学习计算机--很有意思的一段话
查看>>
数据类型输出格式
查看>>
记录 vim的d命令使用小技巧
查看>>
C C++数组要点
查看>>
web工程简述
查看>>
MVC模式与三层架构的区别
查看>>
超详细的java基础知识学习(java SE、javaEE)笔记 核心重点!
查看>>
linux系统裁剪
查看>>
博客数据库设计
查看>>
CentOS 7.0全自动安装光盘制作详解
查看>>
3. Springmvc架构
查看>>
浅谈线程和进程
查看>>
Android常用加密手段之MD5加密(字符串加密和文件加密)
查看>>
同步(Synchronous)和异步
查看>>
自定义View实战--实现一个清新美观的加载按钮
查看>>