获得主窗口句柄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()函數。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的获得主窗口句柄AfxGetApp()-m_pMainWnd的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC全局函数开局——AfxGetApp
- 下一篇: VC由进程ID获取窗口句柄的各种方