进度条显示百分比,进度条为什么不动?

qq_39944892 2017-12-04 02:28:35
PAINTSTRUCT ps;
CDC* pDC=BeginPaint(&ps);
int nPos=m_Pro.GetPos();
CString csPos;
csPos.Format("%d%%",nPos);
CRect clientRC;
GetClientRect(clientRC);
CSize sztext=pDC->GetTextExtent(csPos);
int nX=(clientRC.Width()-sztext.cx)/2;
int nY=(clientRC.Height()-sztext.cy)/2;
//pDC->SetBkMode(TRANSPARENT);
int nMin,nMax;
m_Pro.GetRange(nMin,nMax);
double dFraction=(double)clientRC.Width()/(nMax-nMin);
int nLeft=nPos * dFraction;
CRect leftRC=clientRC;
leftRC.left=nLeft;
CRect rightRC=clientRC;
rightRC.left=nLeft;
//pDC->FillRect(leftRC,&CBrush(m_Pro));
pDC->FillRect(leftRC,&CBrush(m_crBlank));
pDC->SetTextColor(m_crText);
pDC->TextOut(nX,nY,csPos);
ReleaseDC(pDC);
EndPaint(&ps);
...全文
533 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2017-12-06
  • 打赏
  • 举报
回复
1 建议从CProgressCtrl 派生新类, 处理 WM_PAINT 消息 2 不能阻塞消息环,长时操作放到后台进程中
qq_39944892 2017-12-06
  • 打赏
  • 举报
回复
是放到OnPaint中的
schlafenhamster 2017-12-06
  • 打赏
  • 举报
回复
win32 的 做法 1 创建 HWND CreateProgress(HINSTANCE hInstance, HWND hwndParent) {// progressbar HWND hProgress=0; hProgress= CreateWindow(PROGRESS_CLASS/* "msctls_progress32" */, NULL, WS_VISIBLE | WS_CHILD | WS_TABSTOP | PBS_SMOOTH, 10, 40, 160, 30, hwndParent, (HMENU)IDC_PROGRESS, hInstance, NULL); // SendMessage(hProgress,PBM_SETRANGE,0,MAKELPARAM(0,100)); SendMessage(hProgress,PBM_SETSTEP,1,0); SetTimer(hProgress,1,200,NULL); // return hProgress; } 2. WndProc 中 子类化(派生) case WM_CREATE: { m_hProgress=CreateProgress((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd); WNDPROC PbOldProc = (WNDPROC)SetWindowLong(m_hProgress, GWL_WNDPROC, (LONG)PBProc); SetProp(m_hProgress,// handle of window "PbOldProc", // atom or address of string PbOldProc); 3 新的滚动条

// ProgressBar
LRESULT CALLBACK PBProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	int nPos;
	RECT clientRC;
	RECT leftRC;
	double dFraction;
	int nLeft;
	HBRUSH br;
	char prompt[40];
	SIZE sz;
// get oldproc
	WNDPROC OldPbProc=(WNDPROC)GetProp(hWnd,"PbOldProc");
	sprintf(prompt,"PBProc:%d\n",Msg);// case WM_NOTIFY=4E
	OutputDebugString(prompt);
//
	switch(Msg)
	{
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
		nPos=SendMessage(hWnd,PBM_GETPOS,0,0);
		GetClientRect(hWnd,&clientRC);
		FillRect(hdc,&clientRC,(HBRUSH)GetStockObject(LTGRAY_BRUSH));
		dFraction=(double)(clientRC.right)/(100);
		nLeft=(int) (nPos * dFraction);
		leftRC=clientRC;
		leftRC.right=nLeft;
		leftRC.top+=18;
		br=CreateSolidBrush(RGB(255,0,0));
		FillRect(hdc,&leftRC,br);
		sprintf(prompt,"%d%%",nPos);
		GetTextExtentPoint32(hdc,prompt,strlen(prompt),&sz);
		SetTextColor(hdc,RGB(0,0,0));
		SetBkMode(hdc,TRANSPARENT);
		TextOut(hdc,(int)(nLeft*(clientRC.right-sz.cx)/(double)clientRC.right),0,prompt,strlen(prompt));
		EndPaint(hWnd,&ps);
		return 1;
        case WM_TIMER:
            SendMessage(hWnd,PBM_STEPIT,0,0);
		return 1;
	}
	return CallWindowProc(OldPbProc, hWnd, Msg, wParam, lParam);
}
schlafenhamster 2017-12-05
  • 打赏
  • 举报
回复
pDC->FillRect(leftRC,&CBrush(m_Pro)); 1 pDC 是不是 m_Pro.GetDC(); ? 2 leftRC 是 进度条 的 左边 ? 3 ,&CBrush(m_Pro) ??? CBrush::CBrush CBrush( ); CBrush( COLORREF crColor ); throw( CResourceException ); CBrush( int nIndex, COLORREF crColor ); throw( CResourceException ); CBrush( CBitmap* pBitmap ); throw( CResourceException ); 没有 CBrush(m_Pro) !
qq_39944892 2017-12-05
  • 打赏
  • 举报
回复
pDC->FillRect(leftRC,&CBrush(m_Pro));这句中的m_Pro应该是m_crProgreess当前进度的颜色
qq_39944892 2017-12-05
  • 打赏
  • 举报
回复
m_Pro是进度条的变量
schlafenhamster 2017-12-05
  • 打赏
  • 举报
回复
要在 进度条的 OnPaint、 中 自绘 !
qq_39944892 2017-12-05
  • 打赏
  • 举报
回复
pDC->FillRect(leftRC,&CBrush(m_Pro)); 1 pDC 是不是 m_Pro.GetDC(); ?不是 2 leftRC 是 进度条 的 左边 ?应该是客户区域 3 ,&CBrush(m_Pro) ??? CBrush::CBrush CBrush( ); CBrush( COLORREF crColor ); throw( CResourceException ); CBrush( int nIndex, COLORREF crColor ); throw( CResourceException ); CBrush( CBitmap* pBitmap ); throw( CResourceException ); 没有 CBrush(m_Pro) !应该是CBrush(m_crProgress);COLORREF m_crProgress; //进度颜色
schlafenhamster 2017-12-04
  • 打赏
  • 举报
回复
就是说 你这个 paint 是不是 进度条的 paint
schlafenhamster 2017-12-04
  • 打赏
  • 举报
回复
m_Pro 是进度条 ?pDC 是不是 进度条的 ?
向立天 2017-12-04
  • 打赏
  • 举报
回复
//pDC->FillRect(leftRC,&CBrush(m_Pro)); 取消这一句的注释再试试

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧