很多時候我們在一個全域函數中會訪問到應用程式控制項,由於全域函數不屬於具體的某個對話方塊類,所以它裡面是無法直接存取某個對話方塊,當然也就訪問不到對話方塊控制項了。有以下幾種情況和對應的處理方式。
(1)全域線程函數中利用線程參數訪問對話方塊控制項
建立一個對話方塊後,放置一個進度條,添加對應的控制變數myProgressCt,在CPP添加一個線程式控制制標誌volatile BOOL m_bRun2。進度條是個狀態顯示量,跟後台資料處理是獨立的,所以需用多線程。在對話方塊初始化添加進度條的預設值處理:
myProgressCt.SetRange(0,100); //範圍
m_bRun2 = TRUE;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,this, 0,NULL); //注意線程帶的參數this,指向當前對象
線程函數如下:
void ThreadFunc(LPVOID lParam)
{
CProgressThreadDlg* p = (CProgressThreadDlg*)lParam; //把this強制轉成對話方塊類指標
int i = 0;
while(m_bRun2)
{
i ++;
p->myProgressCt.SetPos(i); //從而用對話方塊指標P的子控制項顯示進度條
Sleep(200);
}
}
(2)全域函數中利用某些帶視窗控制代碼的函數訪問對話方塊控制項
在一個線程中不斷更新對話方塊的編輯框上的時間顯示
void ThreadFunc()
{
CTime time;
CString strTime;
m_bRun=TRUE;
while(m_bRun)
{
time=CTime::GetCurrentTime();
strTime=time.Format("%H:%M:%S");
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,strTime);
Sleep(1000);
}
}
AfxGetMainWnd()的說明:用嚮導建立一個單文檔/多文檔程式,其中最外面的架構叫做 frame,包括標題、最大最小化按鈕、菜單、工具條、以及view等都在frame中。frame中,中間那塊白色的部分被view 佔據。AfxGetMainWnd() 就是取得此frame 的指標,m_hWnd是此frame 的視窗控制代碼。
上面說的那個frame ,在你工程中預設的名字叫做CMainFrame,取得此frame 指標,可以對frame(也就是最外面的視窗) 進行操作,比如隱藏、移動、最小化、已最大化的視窗。其實CMainFrame從 CFrameWnd 派生,CFrameWnd又從CWnd派生。CMainFrame 本質上就是一個視窗。例如:
AfxGetMainWnd()-> CenterWindow() ; // 使視窗置中
AfxGetMainWnd()-> ShowWindow(SW_MAXIMIZE) ; // 最大化
m_hWnd 是基類CWnd 的成員變數,其定義為HWND m_hWnd,就是視窗控制代碼。所以上面函數中的顯示語句可以寫成另一種形式:AfxGetMainWnd()->SetDlgItemText(IDC_TIME,strTime);
(3)通過AfxGetApp( )
AfxGetApp( )這個函數可以得到當前應用進程的指標,是CWinApp*類型的,通過這個指標可以訪問到這個進程中的對象。
比如在全域函數中要向對話方塊中的列表寫資料。
void writeString(char* pString)
{
CWnd* pWnd = AfxGetApp()->GetMainWnd();
CMyDlg * pDlg;
pDlg=(CMyDlg *) pWnd;
pDlg->ShowMsg(pString);
}
AfxGetApp( )這個函數可以得到當前引用的指標CWinApp*,通過這個指標可以訪問到這個進程中的對象。
(4)全域變數
參考原文:http://topic.csdn.net/t/20050421/12/3954786.html
參考原文:http://blog.csdn.net/tianmeshi/archive/2009/05/22/4209904.aspx