$$$双缓冲解决方案

hnzlk 2009-12-18 05:20:03
private:
CBitmap m_bitmap;
CDC m_dcMemory;

m_bitmap的大小即是CListCtrl控件的大小,我想所有绘图操作,我都将画在m_bitmap上,但有个问题,我的CListCtrl控件大小是变化的,是随着父窗口的变化而变化的,在这种情况下,如何实现呢?
...全文
216 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
我知道,我已经实现了拖拽,但你看windows缩略图拖动的时候,鼠标处的那张图是透明的。
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
上面的iconList是一个CImageList对象
aoyihuashao 2009-12-23
  • 打赏
  • 举报
回复
MARK。
等有空花一个周末的时间研究双缓存。
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
在开始拖拽的时候调用类似的代码
CPoint pt(0, 0);
iconList.BeginDrag ( 0, pt );
iconList.DragEnter ( /*拖拽窗体的指针*/, /*绘制的点*/);
至于什么时候可以出发开始拖拽

链接里面的文章已经讲得很清楚了。

BeginDrag和DragEnter楼主如果不明白可以查阅MSDN
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 xpbhere 的回复:]
楼主可以查询一些关于窗口双缓冲绘制的资料看看,如果是完全自绘的话可能实现起来麻烦,但难度不高~
MFC提供的界面不好看,现在很多软件基本都是自绘的。

关于拖拽
http://surmountyu.blog.hexun.com/23221392_d.html
里面讲得很详细
[/Quote]
那上面讲的是功能,我不需要那样的功能。我需要的是效果。我是将CBitmap选入DC,然后在DC上面绘的。
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
楼主可以查询一些关于窗口双缓冲绘制的资料看看,如果是完全自绘的话可能实现起来麻烦,但难度不高~
MFC提供的界面不好看,现在很多软件基本都是自绘的。

关于拖拽
http://surmountyu.blog.hexun.com/23221392_d.html
里面讲得很详细
M_S_D_N 2009-12-23
  • 打赏
  • 举报
回复
那就得DC来配合了,楼主这里用DC吗?是那个m_dcMemory?

[Quote=引用 24 楼 xpbhere 的回复:]
引用 22 楼 m_s_d_n 的回复:
1. CBitmap的宽高改变很麻烦,是绕的;
2. API不提供对CBitmap(HBITMAP)直接绘制操作接口;
3. 自行提供绘制操作,也不容易操作CBitmap,还得先取得HBITMAP中的BITMAP结构,然后再操作。

楼主这种方式,已经接近DirectUI方式。


取得里面的BITMAP结构然后呢?难道要一个字节一个字节地往里面去填数据还是干嘛?
windows提供了窗体的设备上下文(DC)供我们绘制窗体。想做什么绘制直接往上面画就可以了~
CBitmap对象被DC选入后对DC的所有绘制都会体现到这个CBitmap对象里面。
[/Quote]
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 m_s_d_n 的回复:]
1. CBitmap的宽高改变很麻烦,是绕的;
2. API不提供对CBitmap(HBITMAP)直接绘制操作接口;
3. 自行提供绘制操作,也不容易操作CBitmap,还得先取得HBITMAP中的BITMAP结构,然后再操作。

楼主这种方式,已经接近DirectUI方式。
[/Quote]

取得里面的BITMAP结构然后呢?难道要一个字节一个字节地往里面去填数据还是干嘛?
windows提供了窗体的设备上下文(DC)供我们绘制窗体。想做什么绘制直接往上面画就可以了~
CBitmap对象被DC选入后对DC的所有绘制都会体现到这个CBitmap对象里面。
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
唉,不这么做的话,那个拖动缩略图透明的地方,不好做。以前用imagelist的CreateDragImage
BeginDrag DragEnter DragLeave来做。
M_S_D_N 2009-12-23
  • 打赏
  • 举报
回复
1. CBitmap的宽高改变很麻烦,是绕的;
2. API不提供对CBitmap(HBITMAP)直接绘制操作接口;
3. 自行提供绘制操作,也不容易操作CBitmap,还得先取得HBITMAP中的BITMAP结构,然后再操作。

楼主这种方式,已经接近DirectUI方式。

[Quote=引用 21 楼 xpbhere 的回复:]
引用 19 楼 m_s_d_n 的回复:
这种情况下不应该用CBitmap类创建画板对象。

引用 17 楼 hnzlk 的回复:
是啊




CBitmap是用来存储当前绘制的数据啊,有什么问题?那应该用什么?
[/Quote]
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 m_s_d_n 的回复:]
这种情况下不应该用CBitmap类创建画板对象。

引用 17 楼 hnzlk 的回复:
是啊

[/Quote]


CBitmap是用来存储当前绘制的数据啊,有什么问题?那应该用什么?
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xpbhere 的回复:]
引用 8 楼 cdpc0202 的回复:
要什么解决方案?
你怎么做的?遇到什么问题了?
m_bitmap的大小不是你控制的吗?
list多大你就创建多大的不就可以了?


全都是自己控制,你想怎么画就怎么画啊。
如果想实现类似于windows缩略图的功能,建议没个图都要做一个数据块来保存,不管是gdi对象还是gdi+对象都可以。
然后每次改变大小的时候重新计算每个图的区域并往上贴图。

如果是把所有的图片都绘制到一个CBitmap对象上,那随着listctrl的大小改变,这个CBitmap对象还是每次删除并根据当前listctrl大小重新创建好。

还是那句话 想怎么画怎么画
[/Quote]

不仅仅是贴上图这么简单,还要实现很多相关的功能,比如,拖动图片透明显示,有焦点时绘制边框,拖动图片的时候也需要绘制不同的边框,要实现缩略图自适应控件大小。。。。。等等,一系列功能。
M_S_D_N 2009-12-23
  • 打赏
  • 举报
回复
这种情况下不应该用CBitmap类创建画板对象。

[Quote=引用 17 楼 hnzlk 的回复:]
是啊
[/Quote]
xpbhere 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cdpc0202 的回复:]
要什么解决方案?
你怎么做的?遇到什么问题了?
m_bitmap的大小不是你控制的吗?
list多大你就创建多大的不就可以了?
[/Quote]

全都是自己控制,你想怎么画就怎么画啊。
如果想实现类似于windows缩略图的功能,建议没个图都要做一个数据块来保存,不管是gdi对象还是gdi+对象都可以。
然后每次改变大小的时候重新计算每个图的区域并往上贴图。

如果是把所有的图片都绘制到一个CBitmap对象上,那随着listctrl的大小改变,这个CBitmap对象还是每次删除并根据当前listctrl大小重新创建好。

还是那句话 想怎么画怎么画
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
是啊
M_S_D_N 2009-12-23
  • 打赏
  • 举报
回复
那就是说不是继承于MFC的CListCtrl咯?

[Quote=引用 15 楼 hnzlk 的回复:]
不是,就是想用实现类似windows的缩略图功能,可能拖动,而且是透明的。想全部绘到m_bitmap上面,而且clistctrl的大小是随时会改变的,而且缩略图的大小也会跟着变。
[/Quote]
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
不是,就是想用实现类似windows的缩略图功能,可能拖动,而且是透明的。想全部绘到m_bitmap上面,而且clistctrl的大小是随时会改变的,而且缩略图的大小也会跟着变。
M_S_D_N 2009-12-23
  • 打赏
  • 举报
回复
没看明白帖子意思。。。
莫非楼主想在m_bitmap上自绘listctrl?
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
顶,
hnzlk 2009-12-23
  • 打赏
  • 举报
回复
顶。
加载更多回复(12)

15,979

社区成员

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

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