如何在画面上绘制多张bmp图呢??(用内存dc) 我想做一个可以让用户自己设计界面的软件,就需要用户自己画图。但是遇到一个问题,如何才能通过内存dc在画面上显示多个图呢?我现在是把图的信息存在数组中,改变位置什么的就改变数组的信息,用ontimer来不断绘制。但是就是在ontimer中不能绘制出来,求解 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接在OnPain里画就好了嘛位置,大小等要用变量x,y,w,h才行OnTimer仅仅只是计算x,y,w,h等的变化然后发送WM_PAINT消息而已 CBitmap bitmap[10];for(int i=0; i<10; i++){ VERIFY(bitmap[i].LoadBitmap(IDB_BITMAP1 + i));}void CXXXDlg::OnPaint() { CPaintDC dc(this); CDC memDC; VERIFY(memDC.CreateCompatibleDC(&dc)); CRect rect; GetClientRect(&rect); BITMAP bmp; CRect rc = rect; for(int i=0; i<10; i++) { CBitmap* pOldBitmap = (CBitmap*)memDC.SelectObject(&bitmap[i]); bitmap[i].GetBitmap(&bmp); if(rc.top + bmp.bmHeight <= rect.bottom) { dc.BitBlt(rc.left, rc.top, bmp.bmWidth, bmp.bmHeight, &memDC, 0, 0, SRCCOPY); rc.top += bmp.bmHeight; } } memDC.DeleteDC();} 怎么我用兔子党的代码的时候,会在m_bitmap2[i].GetBitmap(&bmp);这里出错的.....(我把bitmap改为了m_bitmap2,作为一个成员变量)。谢谢你们的回答,但是因为我是新手。我原来的想法是在ontimer里面画,每隔1毫秒画一次(因为我画的内容不多),然后画出一些位图是可以移动的。麻烦大家详细点,最好有源代码~~ 对于1楼的回答,我想问是用哪个函数呢?在哪里有可以设置x,y,w,h的?因为我看很多都是只是载入的...我还有个问题就是,把图画画到内存dc里面,怎么显示到屏幕上。我看也有很多人问这个问题,但是有点我看不懂。我想再粗俗的问问,应该解决2点。1,怎么确定图已经画到了内存dc;2,怎么再画到屏幕??谢谢 如果你的图片是一样大小的可以考虑CImageListCImageList xx;xx.Create(宽,高,ILC_COLOR24|ILC_MASK,1,1);bmp.LoadBitmap(IDB_1);xx.Add(&bmp,RGB(255,255,255));........xx.LoadBitmap(IDB_n);xx.Add(&bmp,RGB(255,255,255));然后在OnTimer里CDC *xDC=GetDC();xx.Draw(&xDC,iIndex,CPoint(x,y),ILD_BLEND50);iIndex就是第几幅图片CPoint(x,y)就是显示的开始坐标 x,y,w,h是你自己定义的,就是说你不要用20啊30啊这种死位置1.内存dc.或者内存dc-> 就一定是画到了内存dc2.在OnPain()里画系统自己会送到屏幕至于,你要实例嘛,等一下我上传一个源代码然后给你地址自己去下 请别说我灌水,因为真的比较多问题原谅无知的新手吧~~现在我的代码如下,但是真的很闪。请问怎么才是用了内存dc,怎么修改,请指正,谢谢void Ctese2View::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CBitmap bmpDraw; BITMAP bmpInfo; CDC cdc; CRect rect; GetClientRect(&rect); CClientDC dc(this); cdc.CreateCompatibleDC(&dc); dc.FillSolidRect(&rect,RGB(255,255,255)); for(int i=0;i<10;i++) { if(butdata[i].position.x!=-1&&butdata[i].position.y!=-1) { if(bmpDraw.m_hObject)bmpDraw.DeleteObject(); bmpDraw.LoadBitmap(IDB_BOTTUN); bmpDraw.GetBitmap( &bmpInfo ); cdc.SelectObject(&bmpDraw); dc.BitBlt(butdata[i].position.x,butdata[i].position.y,rect.Width(),rect.Height(),&cdc, 0, 0, SRCCOPY ); } }} 范例传上来了,你去下吧http://download.csdn.net/source/3495311 1张图多个部分和多张图没区别的这样吧,重新给你个多张图的,等你看明白你就知道了http://download.csdn.net/source/3495676这个是多张图片的我敢肯定,将来你绝对不会用这种低级的方式的 http://download.csdn.net/source/3495676 我覺得我的問題應該是和以下這個差不多的,但是我用了他那裡一個代碼卻不行...http://topic.csdn.net/t/20040102/16/2627205.html http://topic.csdn.net/t/20040102/16/2627205.html 好了。。十分谢谢gz_qmc(二农戏猪) 的一直帮助,也谢谢回答问题的朋友。谢谢大家~~ 用什么类可以把位图放在指定的区域啊,新手不知道啊 关于控件的license的问题 关于BCG的CBCGPToolBar中放入进度条的问题!(高分相送) w98服务停止,有没有响应的API函数启动? 请问如何生成静态链接库,并在工程中引用它? 如何表示<'>?? 急问问题,关于win2000中用程序删除进程。 请问那里有英文有下载,十分感谢! 非高手莫入!!!!!!!! 有谁能给出一段CDialog::OnSetFont()的源代码! 请问如何在对话框一角显示一个自己加载的图标 知道文件的全路径名称,怎样得到这个文件的纯文件名
位置,大小等要用变量x,y,w,h才行OnTimer仅仅只是计算x,y,w,h等的变化
然后发送WM_PAINT消息而已
CBitmap bitmap[10];for(int i=0; i<10; i++)
{
VERIFY(bitmap[i].LoadBitmap(IDB_BITMAP1 + i));
}void CXXXDlg::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
VERIFY(memDC.CreateCompatibleDC(&dc));
CRect rect;
GetClientRect(&rect);
BITMAP bmp;
CRect rc = rect;
for(int i=0; i<10; i++)
{
CBitmap* pOldBitmap = (CBitmap*)memDC.SelectObject(&bitmap[i]);
bitmap[i].GetBitmap(&bmp);
if(rc.top + bmp.bmHeight <= rect.bottom)
{
dc.BitBlt(rc.left, rc.top, bmp.bmWidth, bmp.bmHeight, &memDC, 0, 0, SRCCOPY);
rc.top += bmp.bmHeight;
}
}
memDC.DeleteDC();
}
这里出错的.....(我把bitmap改为了m_bitmap2,作为一个成员变量)。谢谢你们的回答,但是因为我是新手。我原来的想法是在ontimer里面画,每隔1毫秒画一次(因为我画的内容不多),然后画出一些位图是可以移动的。麻烦大家详细点,最好有源代码~~
我还有个问题就是,把图画画到内存dc里面,怎么显示到屏幕上。我看也有很多人问这个问题,但是有点我看不懂。我想再粗俗的问问,应该解决2点。1,怎么确定图已经画到了内存dc;2,怎么再画到屏幕??谢谢
可以考虑CImageListCImageList xx;
xx.Create(宽,高,ILC_COLOR24|ILC_MASK,1,1);bmp.LoadBitmap(IDB_1);
xx.Add(&bmp,RGB(255,255,255));
........
xx.LoadBitmap(IDB_n);
xx.Add(&bmp,RGB(255,255,255));然后在OnTimer里
CDC *xDC=GetDC();
xx.Draw(&xDC,iIndex,CPoint(x,y),ILD_BLEND50);iIndex就是第几幅图片
CPoint(x,y)就是显示的开始坐标
x,y,w,h是你自己定义的,就是说你不要用20啊30啊这种死位置
1.内存dc.或者内存dc->
就一定是画到了内存dc
2.在OnPain()里画系统自己会送到屏幕至于,你要实例嘛,等一下我上传一个源代码
然后给你地址自己去下
现在我的代码如下,但是真的很闪。请问怎么才是用了内存dc,怎么修改,请指正,谢谢
void Ctese2View::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CBitmap bmpDraw;
BITMAP bmpInfo;
CDC cdc;
CRect rect;
GetClientRect(&rect);
CClientDC dc(this);
cdc.CreateCompatibleDC(&dc);
dc.FillSolidRect(&rect,RGB(255,255,255));
for(int i=0;i<10;i++)
{
if(butdata[i].position.x!=-1&&butdata[i].position.y!=-1)
{
if(bmpDraw.m_hObject)bmpDraw.DeleteObject();
bmpDraw.LoadBitmap(IDB_BOTTUN);
bmpDraw.GetBitmap( &bmpInfo );
cdc.SelectObject(&bmpDraw);
dc.BitBlt(butdata[i].position.x,butdata[i].position.y,rect.Width(),rect.Height(),&cdc, 0, 0, SRCCOPY );
}
}
}
http://download.csdn.net/source/3495311
http://download.csdn.net/source/3495676
这个是多张图片的我敢肯定,将来你绝对不会用这种低级的方式的