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设成多大,填充的区域仍然不会改变,不知道为什么?
解决方案 »
- vc下怎样用odac?旷世难题,高手请进
- MFC中调用cmd的命令
- 请教关于在VC中调用win32 dll工程中,再调用DialogBoxParam显示界面的问题...
- CControlBar类中200ms和300ms定时器作用
- 去掉窗口标题栏,怎么实现?
- 大家做帮助文档时大多采用什么软件啊?
- CSDN上的问题和有些提问的人令我非常失望!!!
- 运行速度的问题如何解决?
- 如何编程禁止IP?特急!
- PostThreadMessage失败,GetLastError返回6。
- CLIstCtrl 显示多线程数据会死锁..如何解决
- C++基本问题,CComPtr<IEnumMoniker> pEm;是什么意思???
//dc.FillSolidRect(rectIcon,RGB(237,235,219));
这样的话,就不会出现上面的重影,为什么?大家帮我顶啊。
rectIcon是不是当前窗口上的啊
直接显示error C2065: “CClient”: 未声明的标识符
把创建画笔,选画笔、画刷等代码
CPen pen, *pOldPen;
pen.CreatePen(PS_SOLID,0,RGB(241,239,0)); //226
pOldPen=dc.SelectObject(&pen); dc.SelectObject(pOldPen); dc.SelectObject(&brush);
移到for循环外面来,那样效率高些,注意代码效率啊!!!!!!!!
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可用于更广泛的地方,重画区域对应整个客户区。