全局函数如何访问对话框控件
2011-11-03 19:25
211 查看
很多时候我们在一个全局函数中会访问到应用程序控件,由于全局函数不属于具体的某个对话框类,所以它里面是无法直接访问某个对话框,当然也就访问不到对话框控件了。有以下几种情况和对应的处理方式。
(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
(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
相关文章推荐
- 全局函数如何访问对话框控件
- 子对话框如何访问主对话框中的控件
- MFC访问对话框控件的7种方法
- vc++ 对话框控件访问的7种方法
- MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置 及Invalidate(TRUE)的闪屏问题
- MFC如何使控件大小随着对话框大小自动调整
- C++语言 访问对话框中的控件
- 猎豹MFC--对话框 静态文本 编辑框 按钮 对话框 访问控件
- MFC如何使控件大小随着对话框大小自动调整
- 收藏 使用webbrowser控件时,如何屏蔽网站弹出的对话框
- Windows程序设计 对话框控件访问的七种方法(3)
- Windows编程基础--第8节 MFC对话框控件访问的七种方法(上)
- MFC如何使控件大小随着对话框大小自动调整
- 对话框控件访问七种方式
- MFC中如何修改对话框中控件的TAB顺序
- 如何实现控件随对话框大小变化而自动调整大小和位置
- VC 如何获取对话框中控件的坐标
- 如何给对话框中的控件发送消息呢?Windows消息分类
- C++Builder下如何用FireDAC控件访问SQLite数据库
- List容器存储对话框控件句柄,并访问list数据设置控件文本