写了一个进度条但闪得厉害!!!

ji_hui 2002-03-29 01:06:44
关于控件的刷新,Microsoft是怎么做的,大家讨论讨论!
...全文
60 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ji_hui 2002-04-03
  • 打赏
  • 举报
回复
再等两天如果没人回答我就
给分了!
ji_hui 2002-04-02
  • 打赏
  • 举报
回复
写错了,应是“代码很少,而且我改了以后,现在却不显示了”
我是用VB6测试的,测试代码如下:

Private Sub Command1_Click()
Dim i As Long

Progress1.Min = 0
Progress1.Max = 10000

For i = 0 To 10000
Progress1.SetPos i
DoEvents
Next i
End Sub

其中若不加DOENENTS,循环很快完成,加上DOEVENTS后开始单步进行,但刷新很差,出现好多横条。
ji_hui 2002-04-02
  • 打赏
  • 举报
回复
代码很少,而且我改了以后,现在却一显示了。
我不知下面的代码问题出在哪,帮我看看。

示例代码如下:
HRESULT OnDraw(ATL_DRAWINFO& di)
{
char buf[10];

ZeroMemory(buf,10);

ltoa(lngPos,buf,10);

LPCTSTR pszText = buf;

long lngTemp;

long intLeft;
long intRight;
long intTop;
long intBottom;
long intWidth;

lngTemp=lngMax-lngMin;

if (lngTemp>0)
{
lngTemp=lngPos*100/lngTemp;
}
else
{
lngTemp=100;
}

COLORREF clrFore;
COLORREF clrBack;
COLORREF clrBar;

OleTranslateColor(colorFore,NULL,&clrFore);
OleTranslateColor(colorBack,NULL,&clrBack);
OleTranslateColor(colorBar,NULL,&clrBar);

RECT& rc = *(RECT*)di.prcBounds;

intLeft=rc.left ;
intRight=rc.right ;
intTop=rc.top ;
intBottom=rc.bottom ;
intWidth=(intRight-intLeft)*lngTemp/100;

RECT rcBar;
rcBar.left =intLeft;
rcBar.top =intTop;
rcBar.right =intWidth+intLeft;
rcBar.bottom =intBottom;

HDC hDC;
HBITMAP hBitmap;
HBITMAP hOldBitmap;

HBRUSH hBrush;
HBRUSH hBrushBar;

hDC=CreateCompatibleDC (di.hdcDraw );
hBitmap=CreateCompatibleBitmap (hDC ,rc.right -rc.left ,rc.bottom -rc.top );

hOldBitmap=(HBITMAP)SelectObject (hDC,hBitmap);

hBrush=CreateSolidBrush(clrBack);
hBrushBar=CreateSolidBrush(clrBar);

SetTextAlign(hDC, TA_LEFT|TA_TOP|TA_NOUPDATECP );
SetBkMode(hDC ,TRANSPARENT);
SetTextColor(hDC ,clrFore);

FillRect(hDC ,&rc,hBrush);
FillRect(hDC ,&rcBar,hBrushBar);
DrawEdge(hDC ,&rc,EDGE_SUNKEN,BF_RECT);
DrawTextEx(hDC ,(char*)pszText,lstrlen(pszText),&rc,DT_SINGLELINE|DT_VCENTER|DT_CENTER,NULL);

BitBlt (di.hdcDraw ,rc.left ,rc.top ,rc.right -rc.left ,rc.bottom -rc.top ,hDC,rc.left ,rc.top ,SRCCOPY);

SelectObject(hDC,hOldBitmap);

DeleteObject (hBitmap);
DeleteObject(hBrush);
DeleteObject(hBrushBar);

DeleteDC (hDC);

return S_OK;
}
LLnju 2002-04-01
  • 打赏
  • 举报
回复
是啊。你的具体应用环境是什么?在 memdc 中把图形全部画好后再 bitblt 到屏幕一般不会感觉到闪烁的啊。可能是你向内存中绘图的时间太长了吧,进度条应该不会有很繁重的重绘吧,应该不会闪烁的,用 DDraw 应该用不着的。
ji_hui 2002-04-01
  • 打赏
  • 举报
回复
我以前试过用MEMDC,最好只是一次 BitBlt,效果虽有改善,但也不是特别理想。
LLnju(LLnju) 兄,DDraw是不是DirectDraw?
BigBigFish 2002-04-01
  • 打赏
  • 举报
回复
同上,建内存DC,最好重载WM_ERASEBKGND,return TRUE
LLnju 2002-03-29
  • 打赏
  • 举报
回复
尽量在 memdc 中画图,最后一次真正的显示时最好只是一次 BitBlt, 在GDI函数中就这个速度还不错,如果你的要求实在很高,就用 DDraw。 我以前也做过一个,在 200 * 150 的区域上以 100 次/秒 的速度刷新也没有任何闪烁感。
gxh 2002-03-29
  • 打赏
  • 举报
回复
使用內存DC作畫.我作過類似的控件﹐應該沒有問題。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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