CScrollView 滚动花屏

EasonTG 2012-05-14 02:10:23
void CBusListView::OnPaint(void)
{
CPaintDC dc(this);
//OnPrepareDC(&dc);
//OnDraw(&dc);

// CPoint ptScroll = GetScrollPosition();
UINT iBus=1;
CFont* oldFont=dc.SelectObject (&m_BusFont);
switch(nShowType)
{
case 1:
{
for(BusInfoIt BusIt=theApp.m_BusInfoList.begin();BusIt!=theApp.m_BusInfoList.end();BusIt++)//for (int iBus=1;iBus<50;iBus++)
{
BOOL b_free=TRUE;
POINT pnt;
for (ContractListInfoIt ContractIt=theApp.m_ContractListInfo.begin();ContractIt!=theApp.m_ContractListInfo.end();ContractIt++)
{

if (ContractIt->second.m_BusOnTheLine.find(BusIt->second.m_BusOwnerCode)!=ContractIt->second.m_BusOnTheLine.end())
{
b_free=FALSE;
}
}
if (iBus%2==1)
pnt.x=10;
else
pnt.x=40;

pnt.y=20*((iBus-1)/2);

if (b_free)
{

if(BusIt->second.m_Remarks.CompareNoCase(_T("禁用"))==0)//禁用采用红球+黑字
{
m_BusImageList.Draw (&dc, 3, pnt, ILD_TRANSPARENT);
dc.SetTextColor(RGB(0,0,0));
}
else//否则为篮球+白字
{
m_BusImageList.Draw (&dc, 0, pnt, ILD_TRANSPARENT);
dc.SetTextColor(RGB(255,255,255));
}
dc.SetBkMode(TRANSPARENT);
dc.TextOut(pnt.x,pnt.y,BusIt->second.m_BusOwnerCode);
}
else
{
m_BusImageList.Draw (&dc, 2, pnt, ILD_TRANSPARENT);
dc.SetTextColor(RGB(0,0,0));
dc.SetBkMode(TRANSPARENT);
dc.TextOut(pnt.x,pnt.y,BusIt->second.m_BusOwnerCode);
}
iBus++;
}
}
break;
case 2:
{
for( ;iBus<theApp.m_LoadingBusOrder.size();iBus++)
{
POINT pnt;
if (iBus%2==1)
pnt.x=10;
else
pnt.x=40;
pnt.y=20*((iBus-1)/2);

m_BusImageList.Draw (&dc, 0, pnt, ILD_TRANSPARENT);
dc.SetTextColor(RGB(255,255,255));
dc.SetBkMode(TRANSPARENT);
dc.TextOut(pnt.x,pnt.y,theApp.m_LoadingBusOrder[iBus]);
}
}
break;
default:
{
POINT pnt;
pnt.x = 10;
pnt.y = 10;
m_BusImageList.Draw (&dc, 0, pnt, ILD_TRANSPARENT);
pnt.y = 30;
m_BusImageList.Draw (&dc, 1, pnt, ILD_TRANSPARENT);
pnt.y = 50;
m_BusImageList.Draw (&dc, 2, pnt, ILD_TRANSPARENT);
pnt.y = 70;
m_BusImageList.Draw (&dc, 3, pnt, ILD_TRANSPARENT);
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *old=dc.SelectObject(&pen);

CBrush br, *oldBr;
br.CreateSolidBrush (RGB(255,0,0));
oldBr = dc.SelectObject (&br);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(10,50,"23");
}
break;
}
int yLine = 30;

CSize szTotal;
szTotal.cx = m_szClient.cx;
szTotal.cy = 20*iBus/2+1;
if (szTotal.cy > m_szClient.cy)
szTotal.cx -= GetSystemMetrics(SM_CXVSCROLL);

SetScrollSizes(MM_TEXT, szTotal);
dc.SelectObject(oldFont);
}

如果处理滚动刷新,以及出现的花屏!!请教高手!!
...全文
226 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-05-14
  • 打赏
  • 举报
回复
OnPrepareDC(&dc);是用来准备打印的,跟画图和刷新图无关,你把画图部分专门放到一个函数里,这个函数只是在鼠标弹出后执行和滚动条结束滚动后调用.平时不用调用,也不要放在OnPaint函数里,但一定要放在视图里的初始化函数里,不然程序刚运行时是不会画图的,只有鼠标弹出或滚动条结束滚动后才能画图
EasonTG 2012-05-14
  • 打赏
  • 举报
回复
具体的刷新怎么做呢? 我的想法是刷新可视区域,但是可视区域怎么去呢? 用GetClientRect(&temp);不对啊!!上网查了资料 说是必须在CPaintDC dc(this);后面加上OnPrepareDC(&dc); 但是为什么我加上会出错呢!!告急告急啊!!
liuli7786 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
等滚动完成后,再刷新
[/Quote]
++
或者你在图像上鼠标点击然后move,当你松开鼠标时计算移动的位置,这个时候再加载刷新
ouyh12345 2012-05-14
  • 打赏
  • 举报
回复
等滚动完成后,再刷新

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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