100分求一关于获得当前窗体位图的简单问题,内详,在线等~~

1982pc 2006-11-22 02:47:17
本人刚接触vc编程,想实现一个这样的功能.
CBitmap bitmap;

void onPaint()
{
CPaintDC dc(this);
CDC bitmapDC;
bitmapDC.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
dc.BitBlt(0, 0, bmpInfo.bmWidth - 100, bmpInfo.bmHeight - 100,&bitmapDC, 0, 0, SRCCOPY);
}
void onButton()
{
//在这里面得到当前窗体位图
bitmap = ```````````//这里要该怎么做?

}

其实我就是想实现:我本来在窗提画了很多东西,但一刷新就不在了,现在就需要在刷新前保存以前画的,在刷新的时候在把以前画的东西画上去.各位大虾帮忙看看,我才学很多不知道,请各位不吝赐教,分数好说.
...全文
350 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
1982pc 2006-11-25
  • 打赏
  • 举报
回复
谢谢大家帮忙.问题已经解决,思路就是直接在内存中画,然后在贴出来:)散分
一分之千 2006-11-22
  • 打赏
  • 举报
回复
这个你写的有点问题啊,你可以定义一个MemDC,把所有的东西在memdc里画,最后dc.bitblt(..,..,..,..,&MemDC,..)。意思就是你前边的所有的东西都是在内存里画的,知道最后才把内存贴出来,这样有一个好处就是还可以防止闪烁。
如果你想要保存变量的画得在DOC里操作。看看文档操作一章!
asdwwe2004 2006-11-22
  • 打赏
  • 举报
回复
顶下
1982pc 2006-11-22
  • 打赏
  • 举报
回复
楼上的你这个可行性太差了:(
xyh2007 2006-11-22
  • 打赏
  • 举报
回复
你画的东西有自己的属性,定义几个变量保存属性,再定义一个动态数组保存你所画的内容。在OnDraw()里绘制。
1982pc 2006-11-22
  • 打赏
  • 举报
回复
楼上的什么意思?SelectObject(&bitmap);不是设置位图到DC中去么?
我现在做的是
在这个
CPaintDC dc(this);
CRect rectClient;
GetClientRect(&rectClient);


//draw cpu free usges

memBitmap.CreateCompatibleBitmap(&dc, rectClient.right, rectClient.bottom);

//得到位图
-------------------------------------------------------

void CDrawTest12Dlg::test()
{
CPaintDC dc(this); // device context for painting

CRect rectClient;

memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&memBitmap);
dc.BitBlt(rectClient.left, rectClient.top, rectClient.right, rectClient.bottom,
&memDC, 0, 0, SRCCOPY);
}
画位图
但不对:(
@@鹏~~~ 2006-11-22
  • 打赏
  • 举报
回复
这样说吧,你的操作是在对象与窗体之间建立的,所以说在OnPaint后会出现图像消失。我上面的意思是将你的图片放到内存中(SDK中我是CreateCompatibleDC,CreateCompatibleBitmap,SelectObject,BitBlt,一步步的做下去),这样图片信息保存在内存中,就可以对图像进行任意操作(包括BitBlt进其它任意设备中),其中最关键的是对BitBlt的理解,建议搂主看看SDK中关于位图的操作,那里介绍的最详细了,呵呵!
CreateCompatibleBitmap是创建与设备内容兼容的位图,它只创建了一个模版,其中并没有位图信息
mynamelj 2006-11-22
  • 打赏
  • 举报
回复
CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
------------------------------
bitmap申明成成员变量就行了.
1982pc 2006-11-22
  • 打赏
  • 举报
回复
要画的时候才用拷贝到内存中去吧?我现在刚才做的只是得到对么?我把memBitmap声明成了一个成员变量.但好象画的时候还是不行.
@@鹏~~~ 2006-11-22
  • 打赏
  • 举报
回复
用BitBlt将你的当前位图拷贝到内存中
1982pc 2006-11-22
  • 打赏
  • 举报
回复
楼楼上的,什么是序列化?要怎么做?~~~~~
wzbhbb() :
GetClientRect(&rectClient);
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, rectClient.right, rectClient.bottom);
memBitmap就是得到的位图么?但好像得不到呢?!
@@鹏~~~ 2006-11-22
  • 打赏
  • 举报
回复
创建一个内存DC,我记得在SDK中好像是CreateCompatibleDC(CreateCompatibleBitmap),这俩个函数看看,我觉得是将你的图像BitBlt到内存中,然后用的时候再从内存中还原(OnPaint后再BitBlt)
yzcurry 2006-11-22
  • 打赏
  • 举报
回复
那你直接序列化一下,不就行了
1982pc 2006-11-22
  • 打赏
  • 举报
回复
可能是我表述不够清楚,大家可以把代码copy来试试就知道情况了.现在是可以在上面画很多东西了,但只要一全屏刷新上面的东西就没有了:(
1982pc 2006-11-22
  • 打赏
  • 举报
回复
怎么把已经画的东西保存下来呢?难道我画了100条直线就要用100对point值把他们保存下来?我的想法就把画的窗体位图保存下来,不怎么做,当然也不知道行不:(
qiujian5628 2006-11-22
  • 打赏
  • 举报
回复
什么时候触发OnPaint()事件不用你教
以前做过实时曲线 历史曲线方面的 只是没太明白楼主意思 想的有点简单
high2003376320 2006-11-22
  • 打赏
  • 举报
回复
直接放在OnPaint()函数里面

楼上的真牛啊,你知道什么时候会触发OnPaint()事件吗??
xyh2007 2006-11-22
  • 打赏
  • 举报
回复
应该定义一个成原变量,把画的东西保存下来,然后在OnDraw里重绘,因为窗口重绘OnPaint()里会调用OnDraw()。
qiujian5628 2006-11-22
  • 打赏
  • 举报
回复
你是在哪画的那些东西?
直接放在OnPaint()函数里面
这样重画的时候也会画上你画的东西
巨巨 2006-11-22
  • 打赏
  • 举报
回复
要想使你画的内容能够恢复,最好是在画的时候将它保存!
可以使用CArchive类进行处理,也可以使用CObList进行处理!
加载更多回复(2)

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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