全局函数如何访问对话框控件

来源:互联网 发布:mac程序员必备 编辑:程序博客网 时间:2024/05/19 02:44

      很多时候我们在一个全局函数中会访问到应用程序控件,由于全局函数不属于具体的某个对话框类,所以它里面是无法直接访问某个对话框,当然也就访问不到对话框控件了。有以下几种情况和对应的处理方式。

(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