void CCoolListCtrl::OnPaint()
{
// device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CListCtrl::OnPaint()
CPaintDC dc(this);

if(m_IsLoadImage)
{
   BOOL bFocused = (GetFocus()==this);   
   CRect   rectIcon(0,0,0,0);   
   CRect   rectLabel(0,0,0,0);
CRect   rectItem(0,0,0,0); //建立背景画刷

CBrush brush;
CBitmap hBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
hBitmap.CreateCompatibleBitmap(&dc,GridSize*2,GridSize*2);
CBitmap *pOldBit=MemDC.SelectObject(&hBitmap);
MemDC.FillSolidRect(0,0,GridSize*2,GridSize*2,RGB(255,255,255));
MemDC.FillSolidRect(0,0,GridSize,GridSize,RGB(236,233,200));  //236,233,216
MemDC.FillSolidRect(GridSize,GridSize,GridSize,GridSize,RGB(236,233,200));
brush.CreatePatternBrush(&hBitmap);

for(int   i=0;   i<GetItemCount();   ++i) 
{
   CPoint pt;
//GetItemPosition(i,&pt);
//画外框
GetItemRect(i, &rectItem, LVIR_BOUNDS);  
CPen pen, *pOldPen;
pen.CreatePen(PS_SOLID,0,RGB(241,239,0)); //226
pOldPen=dc.SelectObject(&pen);
dc.Rectangle(rectItem);
dc.SelectObject(pOldPen);
//画底图

dc.SelectObject(&brush);
GetItemRect(i,&rectIcon,LVIR_ICON); 
rectIcon.DeflateRect(50,0,50,0);
dc.FillRect(rectIcon,&brush);
//dc.StretchBlt(rectIcon.left,rectIcon.top,rectIcon.Width(),rectIcon.Height(),&MemDC,0,0,20,20,SRCCOPY);
//dc.FillSolidRect(rectIcon,RGB(237,235,219)); //画缩略图
   LVITEM   lvItem   =   {0};   
   lvItem.iItem   =   i;   
   lvItem.mask   =   LVIF_IMAGE|LVIF_PARAM|LVIF_STATE;   
   GetItem(&lvItem); 
GetItemRect(i,&rectIcon,LVIR_ICON); 
m_ImageListThumb.Draw(&dc,   lvItem.iImage,   CPoint(rectIcon.left+5,rectIcon.top),   ILD_TRANSPARENT);  }
MemDC.DeleteDC();
   hBitmap.DeleteObject();
}
}
为什么当我拖动滚动条的时候,底图显示变形?如下图:
正常:
不正常:还有,dc.FillRect(rectIcon,&brush);无论我把rectIcon设成多大,填充的区域仍然不会改变,不知道为什么?

解决方案 »

  1.   

                //dc.StretchBlt(rectIcon.left,rectIcon.top,rectIcon.Width(),rectIcon.Height(),&MemDC,0,0,20,20,SRCCOPY);
                //dc.FillSolidRect(rectIcon,RGB(237,235,219));
    这样的话,就不会出现上面的重影,为什么?大家帮我顶啊。
      

  2.   

    托动的时候刷新一下界面
    rectIcon是不是当前窗口上的啊
      

  3.   

    把CPaint dc(this)改为:CClient dc(this)试试,问题解决了的话就给我使劲给分哈:)
      

  4.   


    直接显示error C2065: “CClient”: 未声明的标识符
      

  5.   

    CClientDC dc(this)不好意思,写错了哈
      

  6.   

    改成这样的话,那会不停的绘制哦。CPU占100%哦,不停哦。
      

  7.   

    你用CPaintDC还不是区域无效时就会画,怎么改了后CPU占用就会到100%了?我不太相信:)
    把创建画笔,选画笔、画刷等代码
                   CPen pen, *pOldPen;
                pen.CreatePen(PS_SOLID,0,RGB(241,239,0)); //226
                pOldPen=dc.SelectObject(&pen);            dc.SelectObject(pOldPen);            dc.SelectObject(&brush);
    移到for循环外面来,那样效率高些,注意代码效率啊!!!!!!!!
      

  8.   

    函数最后应该调用CListCtrl::OnPaint()哦
      

  9.   

    行了,再问一下,一般onpaint里都用CPaint dc(this),为什么要用CClientDC dc(this)才行呢?稍后会给你分的。
      

  10.   

    但是还有一个问题,第一次载入图片的时候,没有响应onpaint,而且窗口改变大小的时候调用Invalidate()重绘的时候,那些背景也看不到了。只能看到图片。在onpaint里绘制的东西都不见了,只有拉滚动条的时候才会出来。为什么?
      

  11.   

        The CPaintDC class is a device-context class derived from CDC. It performs a CWnd::BeginPaint at construction time and CWnd::EndPaint at destruction time. 
        A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.    The CClientDC class is derived from CDC and takes care of calling the Windows functions GetDC at construction time and ReleaseDC at destruction time. This means that the device context associated with a CClientDC object is the client area of a window.所以CPaintDC用于响应WM_PAINT消息,只用于OnPaint()函数中,重画区域为客户区中的无效区域;
    而CClientDC可用于更广泛的地方,重画区域对应整个客户区。
      

  12.   

    那我现在onpaint里面绘的东西看不到了,只有拖滚动条的时候才能看到。那这样也不行嘛!Invalidate()也看不到。
      

  13.   

    说得越来越离奇了,第二个问题超出了OnPanit()函数的范围,没看到代码,不好定位啊:)先给了分再说................
      

  14.   

    把CClientDC dc(this)放到if语句里面去试试