全域函數如何訪問對話方塊控制項

來源:互聯網
上載者:User

      很多時候我們在一個全域函數中會訪問到應用程式控制項,由於全域函數不屬於具體的某個對話方塊類,所以它裡面是無法直接存取某個對話方塊,當然也就訪問不到對話方塊控制項了。有以下幾種情況和對應的處理方式。

(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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.