📄 subject_50161.htm
字号:
<p>
序号:50161 发表者:木木二中 发表日期:2003-08-18 10:22:16
<br>主题:怎样制作查询进度条?
<br>内容:在数据库查询语句"select....."中,如何做一个显示其进度的进度条呢?<BR>哪位高手有类似的经验?指点一下我吧。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:木木二中 回复日期:2003-08-18 10:50:05
<br>内容:谁帮我顶一下?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:木木二中 回复日期:2003-08-18 15:26:51
<br>内容:我知道可能要用线程来做,但我怎么知道查询语句运行的进度呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:木木二中 回复日期:2003-08-18 20:09:24
<br>内容:自己顶!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:hurtmanzc 回复日期:2003-08-18 21:25:10
<br>内容:看你连顶好几次,怪累的,给你答一下:<BR><BR>先给你一个类CProgressBar,他可以在状态栏动态创建一个进度条。<BR><BR><BR>//ProgressBar.h文件<BR><BR>#ifndef _INCLUDE_PROGRESSBAR_H_<BR>#define _INCLUDE_PROGRESSBAR_H_<BR><BR>class CProgressBar: public CProgressCtrl<BR>//在状态栏显示的进度条<BR>{<BR>public:<BR> CProgressBar();<BR> CProgressBar(LPCTSTR strMessage, <BR> int nSize=100, int MaxValue=100, BOOL bSmooth=FALSE);<BR> ~CProgressBar();<BR> BOOL Create(LPCTSTR strMessage, <BR> int nSize=100, int MaxValue=100, BOOL bSmooth=FALSE);<BR> DECLARE_DYNCREATE(CProgressBar)<BR>public:<BR> BOOL SetRange(int nLower, int nUpper, int nStep = 1);<BR> BOOL SetText(LPCTSTR strMessage);<BR> BOOL SetSize(int nSize);<BR> COLORREF SetBarColour(COLORREF clrBar);<BR> COLORREF SetBkColour(COLORREF clrBk);<BR> int SetPos(int nPos);<BR> int OffsetPos(int nPos);<BR> int SetStep(int nStep);<BR> int StepIt();<BR> void Clear();<BR><BR>protected:<BR> int m_nSize; <BR> // 在进度条左侧显示的文本<BR> CString m_strMessage; <BR> CRect m_Rect; <BR> CStatusBar *GetStatusBar();<BR> BOOL Resize();<BR><BR>// Generated message map functions<BR>protected:<BR> //{{AFX_MSG(CProgressBar)<BR> afx_msg BOOL OnEraseBkgnd(CDC* pDC);<BR> //}}AFX_MSG<BR> DECLARE_MESSAGE_MAP()<BR><BR>};<BR><BR>#endif<BR><BR><BR><BR><BR><BR>//ProgressBar.cpp文件<BR><BR><BR>#include "stdafx.h"<BR>#include "ProgressBar.h"<BR>#ifdef _DEBUG<BR>#define new DEBUG_NEW<BR>#undef THIS_FILE<BR>static char THIS_FILE[] = __FILE__;<BR>#endif<BR>IMPLEMENT_DYNCREATE(CProgressBar, CProgressCtrl)<BR>BEGIN_MESSAGE_MAP(CProgressBar, CProgressCtrl)<BR>//{{AFX_MSG_MAP(CProgressBar)<BR>ON_WM_ERASEBKGND()<BR>//}}AFX_MSG_MAP<BR>END_MESSAGE_MAP()<BR><BR>CProgressBar::CProgressBar()<BR>{<BR> m_Rect.SetRect(0,0,0,0);<BR>}<BR><BR>CProgressBar::CProgressBar<BR>(LPCTSTR strMessage, int nSize,int MaxValue, BOOL bSmooth)<BR>{<BR> Create(strMessage, nSize, MaxValue, bSmooth);<BR>}<BR><BR>CProgressBar::~CProgressBar()<BR>{<BR> Clear();<BR>}<BR><BR>CStatusBar* CProgressBar::GetStatusBar()<BR>{<BR> CStatusBar* pStatusBar = NULL;<BR> CWnd *pMainWnd = AfxGetMainWnd();<BR> if (!pMainWnd)<BR> return NULL;<BR> //获取窗口的状态栏 <BR> pStatusBar = (CStatusBar*) pMainWnd->\<BR> GetDescendantWindow(AFX_IDW_STATUS_BAR);<BR> if (!pStatusBar || !pStatusBar->IsKindOf(RUNTIME_CLASS(CStatusBar))) <BR> return NULL;<BR> return pStatusBar;<BR>}<BR><BR>BOOL CProgressBar::Create(LPCTSTR strMessage, int nSize, int MaxValue, <BR> BOOL bSmooth /*=FALSE*/)<BR>{<BR> BOOL bSuccess = FALSE;<BR> CStatusBar *pStatusBar = GetStatusBar();<BR> if (!pStatusBar) return FALSE;<BR> DWORD dwStyle = WS_CHILD|WS_VISIBLE;<BR>#ifdef PBS_SMOOTH <BR> if (bSmooth)<BR> dwStyle |= PBS_SMOOTH;<BR>#endif<BR> // 将状态栏做为进度条的父窗口<BR> bSuccess = CProgressCtrl::Create(dwStyle, CRect(0,0,0,0), pStatusBar, 1);<BR> ASSERT(bSuccess);<BR> if (!bSuccess) return FALSE;<BR> SetRange(0, MaxValue);<BR> SetStep(1);<BR> m_strMessage = strMessage;<BR> m_nSize = nSize;<BR> //重绘进度条<BR> Resize();<BR> return TRUE;<BR>}<BR><BR>void CProgressBar::Clear()<BR>{<BR> if (!IsWindow(GetSafeHwnd()))<BR> return;<BR> ModifyStyle(WS_VISIBLE, 0);<BR> CString str;<BR> str.LoadString(AFX_IDS_IDLEMESSAGE);<BR> CStatusBar *pStatusBar = GetStatusBar();<BR> if (pStatusBar) <BR> pStatusBar->SetWindowText(str);<BR>}<BR><BR>BOOL CProgressBar::SetText(LPCTSTR strMessage)<BR>{ <BR> m_strMessage = strMessage; <BR> return Resize(); <BR>}<BR><BR>BOOL CProgressBar::SetSize(int nSize)<BR>{<BR> m_nSize = nSize; <BR> return Resize();<BR>}<BR><BR>COLORREF CProgressBar::SetBarColour(COLORREF clrBar)<BR>{<BR>#ifdef PBM_SETBKCOLOR<BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> <BR> SendMessage(PBM_SETBARCOLOR, 0, (LPARAM) clrBar);<BR>#else<BR> UNUSED(clrBar);<BR> return CLR_DEFAULT;<BR>#endif<BR>}<BR><BR>COLORREF CProgressBar::SetBkColour(COLORREF clrBk)<BR>{<BR>#ifdef PBM_SETBKCOLOR<BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> <BR> return SendMessage(PBM_SETBKCOLOR, 0, (LPARAM) clrBk);<BR>#else<BR> UNUSED(clrBk);<BR> return CLR_DEFAULT;<BR>#endif<BR>}<BR><BR>BOOL CProgressBar::SetRange(int nLower, int nUpper, int nStep) <BR>{ <BR> if (!IsWindow(GetSafeHwnd()))<BR> return FALSE;<BR> <BR>#ifdef PBM_SETRANGE32<BR> ASSERT(-0x7FFFFFFF <= nLower && nLower <= 0x7FFFFFFF);<BR> ASSERT(-0x7FFFFFFF <= nUpper && nUpper <= 0x7FFFFFFF);<BR> SendMessage(PBM_SETRANGE32, (WPARAM) nLower, (LPARAM) nUpper);<BR>#else<BR> ASSERT(0 <= nLower && nLower <= 65535);<BR> ASSERT(0 <= nUpper && nUpper <= 65535);<BR> CProgressCtrl::SetRange(nLower, nUpper);<BR>#endif<BR> CProgressCtrl::SetStep(nStep);<BR> return TRUE;<BR>}<BR><BR>int CProgressBar::SetPos(int nPos) <BR>{<BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> <BR>#ifdef PBM_SETRANGE32<BR> ASSERT(-0x7FFFFFFF <= nPos && nPos <= 0x7FFFFFFF);<BR>#else<BR> ASSERT(0 <= nPos && nPos =< 65535);<BR>#endif<BR> ModifyStyle(0,WS_VISIBLE);<BR> return CProgressCtrl::SetPos(nPos);<BR>}<BR><BR>int CProgressBar::OffsetPos(int nPos) <BR>{ <BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> <BR> ModifyStyle(0,WS_VISIBLE);<BR> return CProgressCtrl::OffsetPos(nPos);<BR>}<BR><BR>int CProgressBar::SetStep(int nStep)<BR>{ <BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> <BR> ModifyStyle(0,WS_VISIBLE);<BR> return CProgressCtrl::SetStep(nStep); <BR>}<BR><BR>int CProgressBar::StepIt() <BR>{ <BR> if (!IsWindow(GetSafeHwnd()))<BR> return 0;<BR> ModifyStyle(0,WS_VISIBLE);<BR> return CProgressCtrl::StepIt(); <BR>}<BR><BR>BOOL CProgressBar::Resize() <BR>{<BR> if (!IsWindow(GetSafeHwnd()))<BR> return FALSE;<BR> <BR> CStatusBar *pStatusBar = GetStatusBar();<BR> if (!pStatusBar) return FALSE;<BR> <BR> // 重绘进度条文本<BR> if (IsWindowVisible())<BR> {<BR> pStatusBar->SetWindowText(m_strMessage);<BR> pStatusBar->UpdateWindow();<BR> }<BR> <BR> //计算文本的宽度<BR> CClientDC dc(pStatusBar);<BR> CFont *pOldFont = dc.SelectObject(pStatusBar->GetFont());<BR> CSize size = dc.GetTextExtent(m_strMessage);<BR> int margin = dc.GetTextExtent(_T(" ")).cx * 2;<BR> dc.SelectObject(pOldFont);<BR> <BR> CRect rc;<BR> pStatusBar->GetItemRect (0, rc);<BR> rc.left = size.cx + 2*margin;<BR> rc.right = rc.left + (rc.right - rc.left) * m_nSize / 100;<BR> if (rc.right < rc.left)<BR> rc.right = rc.left;<BR> int Height = rc.bottom - rc.top;<BR> rc.bottom -= Height/10;<BR> rc.top += Height/10;<BR> <BR> if (rc != m_Rect) {<BR> MoveWindow(&rc);<BR> m_Rect = rc;<BR> }<BR> <BR> return TRUE;<BR>}<BR>BOOL CProgressBar::OnEraseBkgnd(CDC* pDC) <BR>{<BR> Resize();<BR> return CProgressCtrl::OnEraseBkgnd(pDC);<BR>}<BR><BR><BR><BR><BR>使用范例:<BR>一般我们是在显示查询数据时使用进度条,下面这段程序是从我的一个项目中摘出来的,仅供参考。<BR><BR>CProgressBar ProgressBar(_T("正在准备数据"), 30, 10000,1);//在状态栏显示进度条<BR> ProgressBar.SetRange(0,nRows);//设置进度条范围<BR> //填充每格数据<BR> CString strCellText;//存放每格文本<BR><BR> if(!pRS->IsBOF()) pRS->MoveFirst();<BR> for( row = 1; row <=nRows; row++)<BR> {<BR> for( col = 1; col <=nCols; col++)<BR> {<BR> pRS->GetFieldValue(col-1,strCellText);<BR> Item.row =row;//行号<BR> Item.col =col;//列号<BR> Item.szText=strCellText;<BR> SetItem(&Item);<BR> }<BR> ProgressBar.SetPos(row);<BR> if(!pRS->IsEOF()) pRS->MoveNext();<BR> }
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -