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);
uj5u.com熱心網友回復:
//pDC->FillRect(leftRC,&CBrush(m_Pro));取消這一句的注釋再試試
uj5u.com熱心網友回復:
m_Pro 是進度條 ?pDC 是不是 進度條的 ?uj5u.com熱心網友回復:
就是說 你這個 paint 是不是 進度條的 paintuj5u.com熱心網友回復:
m_Pro是進度條的變數uj5u.com熱心網友回復:
pDC->FillRect(leftRC,&CBrush(m_Pro));這句中的m_Pro應該是m_crProgreess當前進度的顏色uj5u.com熱心網友回復:
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) !
uj5u.com熱心網友回復:
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; //進度顏色
uj5u.com熱心網友回復:
要在 進度條的 OnPaint、 中 自繪 !uj5u.com熱心網友回復:
是放到OnPaint中的uj5u.com熱心網友回復:
1 建議從CProgressCtrl 派生新類, 處理 WM_PAINT 訊息2 不能阻塞訊息環,長時操作放到后臺行程中
uj5u.com熱心網友回復:
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79634.html
標籤:基礎類
上一篇:求救
