VC++中的Progress控件如何使用
进度控制可以让人感受到一个应用程序的进度,它可以用在很多应用程序中。但通常只支持在单个任务中使用进度控制,在Windows98/NT中文操作系统和VC++6.0环境下。一个很小的应用程序是用线程编译的。它可以支持多线程,使用起来非常方便。
下面是这个应用程序的源代码:
//ProgressDialog.h
类CProgressDialog:公共CDialog
{
//构造
公共:
CProgressDialog(LPCSTR标题,BOOL
enableCancel=TRUE,CWnd * p parent = NULL);
//标准构造函数
virtual ~ CProgressDialog(void);
//对话数据
//{{AFX_DATA(CProgressDialog)
枚举{ IDD = IDD _ PROGRESS _ DIALOG };
CStatic
m _ MessageStatic//进度栏的标题
CButton m _ CancelButton//停止按钮控制键
条控件
m _ ProgressCtrl
//}}AFX_DATA
CString m _ Caption
//对话框标题
BOOL m _ EnableCancel//停止按钮显示开关
BOOL m _ IsCancel//停止按钮是否按下开关。
句柄m _ Thread
//线程句柄
静态DWORD WINAPI thread proc(CProgressDialog * DLG);//静态线程
Void SetProgress(int percent) //设置进程位置
{ m_ProgressCtrl。SetPos(百分比);}
Void SetMessage(LPCSTR msg) //设置进程栏的标题。
{ m_MessageStatic。SetWindowText(msg);}
布尔取消(无效)
{ return m _ IsCancel}
虚拟DWORD progress proc()= 0;//线程进程的纯虚函数
//覆盖
// ClassWizard生成的虚函数重写
//{ { AFX _ VIRTUAL(CProgressDialog)
受保护:
虚拟void DoDataExchange(CDATA exchange * pDX);
// DDX/DDV支持
//}}AFX_VIRTUAL
//实现
受保护:
//生成的消息映射函数
//{{AFX_MSG(CProgressDialog)
虚拟BOOL OnInitDialog();
虚拟void on cancel();
虚拟void OnOK();
//}}AFX_MSG
声明消息映射()
};
类CMyProgressDialog:public CProgressDialog {
公共:
CMyProgressDialog(LPCSTR标题):CProgressDialog(标题){}
虚拟DWORD progress proc();//继承过程
};
// ProgressDialog.cpp
#包含" stdafx.h "
#包含" ProgressTest.h "
#包含" ProgressDialog.h "
#ifdef _DEBUG
#定义新的DEBUG_NEW
#undef THIS_FILE
static char THIS _ FILE[]= _ _ FILE _ _;
#endif
CProgressDialog::CProgressDialog(LPCSTR标题,BOOL enableCancel,CWnd* pParent /*=NULL*/):
CDialog(CProgressDialog::IDD,pParent)
{
//{ { AFX _ DATA _ INIT(CProgressDialog)
m _ Caption =标题;
m _ EnableCancel = enableCancel
m _ IsCancel = FALSE
m _ Thread = NULL
//}}AFX_DATA_INIT
}
CProgressDialog::~ CProgressDialog(void)
{
if (m_Thread) {
close handle(m _ Thread);
}}
空的
CProgressDialog::DoDataExchange(CDATA exchange * pDX)
{ CDialog::DoDataExchange(pDX);
//{ { AFX _ DATA _ MAP(CProgressDialog)
DDX _ Control(pDX IDC _ MESSAGE _ STATIC,m _ MESSAGE STATIC);
DDX_Control(pDX,IDCANCEL,m _ cancel button);
DDX_Control(pDX,IDC_PROGRESS,m _ PROGRESS ctrl);
//}}AFX_DATA_MAP
}
BEGIN _ MESSAGE _ MAP(CProgressDialog,CDialog)
//{ { AFX _ MSG _ MAP(CProgressDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CProgressDialog消息处理程序bool CProgressDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO:在此添加额外的初始化
m_ProgressCtrl。SetRange(0,100);
m_ProgressCtrl。SetPos(0);
SetWindowText(m _ Caption);
如果(!m_EnableCancel) {
m _取消按钮。ShowWindow(SW _ HIDE);
}
DWORD threadID
m_Thread=CreateThread(NULL,0,
(LP Thread _ START _ ROUTINE)CProgressDialog::Thread
Proc,(LPVOID)this,0,& threadID);
返回TRUE//除非将焦点设置到控件上,否则返回TRUE
//异常:OCX属性页应该返回
错误的
}
DWORD WINAPI
CProgressDialog::thread proc(CProgressDialog * DLG)
{ DWORD ret = DLG-> progress proc();
dlg->PostMessage(WM_COMMAND,IDOK);
返回ret
}
void CProgressDialog::OnCancel()
{
// TODO:在此处添加额外的清理
if(m _ enable cancel)m _ is cancel = TRUE;
}
void CProgressDialog::OnOK()
{
// TODO:在此添加额外的验证
WaitForSingleObject(m_Thread,INFINITE);
CDialog::OnOK();
} DWORD CMyProgressDialog::progress proc()
{SetMessage("进度...");
for(int I = 0;i if (IsCancel())中断;
睡眠(100);
SetProgress(一);
}
返回0;
}
只需调用应用进度控件的CMyProgressDialog类的对象即可。根据不同的应用,可以修改DWORD CMYProgressDialog::progress proc()的函数体,以适合相应的程序。
0条评论