📄 subject_55163.htm
字号:
<p>
序号:55163 发表者:凌仕晓 发表日期:2003-10-07 12:00:10
<br>主题:为何借助DC绘制出的CBitmap对象不能加到CImageList中去?
<br>内容:如:<BR>CBitmap bmp1,bmp2;<BR>bmp1.LoadBitmap(IDB_BITMAP1);<BR>pDC1=new CDC;<BR>pDC1->CreateCompatibleDC(pMain->GetDC());<BR>bmp2.CreateCompatibleBitmap(pMain->GetDC(),150,150);<BR>pDC1->SelectObject(bmp2);<BR>然后是一系列地绘制pDC1,再<BR><BR>m_imageList.Add(&bmp1, RGB(0, 0, 0));//可以看到图象;<BR>而<BR>m_imageList.Add(&bmp2, RGB(0, 0, 0));//看到的是一片黑;<BR><BR>我测试了下面这些;<BR>bigview->GetDC()->BitBlt(50,50,120,120,pDC1,0,0,SRCCOPY);<BR>AfxMessageBox("");<BR>pDC1->SelectObject(bmp1);<BR>bigview->GetDC()->BitBlt(50,50,120,120,pDC1,0,0,SRCCOPY);<BR>AfxMessageBox("");<BR>pDC1->SelectObject(bmp2);<BR>bigview->GetDC()->BitBlt(50,50,120,120,pDC1,0,0,SRCCOPY);<BR><BR>可以看到两个图象交替,中间把bmp2换下了,后又换上,仍可以看到图像,说明bmp2里是有图像的,但bmp2加<BR><BR>到m_imageList时却不正常,而bmp1正常显示,它们创建时的区别仅仅是一个直接用LoadBitmap载入位图,一<BR><BR>个CreateCompatibleBitmap后画图像.同样地用/*CButton*/m_Button.SetBitmap()也是一个行,一个不行.<BR><BR>不知哪位仁兄研究过,还望告之小弟,需之甚急,不胜感谢.
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-10-07 12:28:32
<br>内容:bmp2绘制时画笔用的什么颜色?我想不应该用黑色画笔.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:黑羽 回复日期:2003-10-07 12:43:05
<br>内容:CClientDC dc(this); <BR>CBitmap bmp;<BR>HBITMAP hbitmap;<BR>hbitmap=(HBITMAP)::LoadImage(NULL,"face/"+Icon+".bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);<BR>BITMAP bm;<BR>bmp.DeleteObject(); <BR>bmp.Attach(hbitmap);<BR>bmp.GetObject(sizeof(BITMAP),&bm);<BR>CDC* pDC=new CDC;<BR>pDC->CreateCompatibleDC(&dc);<BR>pDC->SelectObject(bmp);<BR>dc.BitBlt(60,2,bm.bmWidth,bm.bmHeight,pDC,0,0,SRCCOPY);<BR>delete pDC;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凌仕晓 回复日期:2003-10-07 18:34:09
<br>内容:哦,可能是我说和不清楚,我要做的是一个图片浏览模块,要支持很多格式,所以就<BR><BR>用GDI+来实现,用Image image(.....)来载入图片,这很简单,但我要把这些图片<BR><BR>的缩略图都存到一个CImageList中去,以便可以在CListView中看<BR><BR>到,但CImage::Add(.....)中只接受 CBitmap* ,所以我就<BR>pDC1=new CDC;<BR>pDC1->CreateCompatibleDC(pMain->GetDC());<BR>bmp1.CreateCompatibleBitmap(pMain->GetDC(),150,150);<BR>pDC1->SelectObject(bmp1);<BR><BR>Image image(ToWChar(filename.GetBuffer(filename.GetLength())));<BR>//载入filename这个图片;<BR>Graphics graphics(pDC1->m_hDC); <BR>graphics.DrawImage(&image, pdestPoints/*已定义*/, 3);<BR>//把缩略图画到pDC1 上,想借此让bmp1 上存有缩略图;<BR><BR>hImageList=ImageList_Create(100, 100, ILC_COLOR32, 0, 10);<BR>m_imageList.Add(&bmp1, RGB(0, 0, 0));<BR>GetListCtrl().SetImageList(&m_imageList, LVSIL_NORMAL);<BR>GetListCtrl().SetImageList(&m_imageList, LVSIL_SMALL);<BR>GetListCtrl().InsertItem(2,filename,0);<BR>//结果看到的缩略图是一片黑;而<BR>bigview->GetDC()->BitBlt(50,50,120,120,pDC1,0,0,SRCCOPY);<BR>//可以看到bigview上画出的缩略图;<BR><BR>但我要是一开始让bmp1不借助 pDC1来绘制,而直接<BR>bmp1.LoadBitmap(IDB_BITMAP1);<BR>再加入到上面的那个CImageList中,就可以看到真正的图片;<BR>真不知LoadBitmap来的bmp1和CreateCompatibleBitmap然后画的bmp1 有什么区<BR><BR>别,不光是加到CImageList这样,而且CButton::SetBitmap 也一样一个可以看到<BR><BR>图片,一个看不到.<BR>而我要借助GDI+来实现多种格式,就不能用<BR>hbitmap=<BR><BR>(HBITMAP)::LoadImage(NULL,"face/"+Icon+".bmp",IMAGE_BITMAP,0,0,LR_LOAD<BR><BR>FROMFILE);<BR>这种方式,<BR>用GDI+的Image读好的图片,可以把它画在屏幕上,但就是不知如何才能把它的缩<BR><BR>略图弄到CImageList(只接受CBitmap*)中去,苦闷至极,如又哪位大侠指点迷津,<BR><BR>将感激涕零.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:a dog 回复日期:2003-10-07 19:58:48
<br>内容:我试过了你在m_imageList.Add之前,要将以前的bmp选入pDC,也就是说要将bmp1选出pDC.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凌仕晓 回复日期:2003-10-08 18:45:02
<br>内容:我在 CodeProject 上找到了一个例子,解决部分大致如下,有相似问题的朋友可以参考:<BR>pathname=photoview->strPath+"\\"+photoview->strFileName;<BR> Bitmap image(photoview->ToWChar(pathname.GetBuffer(pathname.GetLength())));<BR><BR> int sourceWidth = image.GetWidth();<BR> int sourceHeight = image.GetHeight();<BR><BR> int destX = 0,<BR> destY = 0; <BR><BR> float nPercent = 0;<BR> float nPercentW = ((float)THUMBNAIL_WIDTH/(float)sourceWidth);;<BR> float nPercentH = ((float)THUMBNAIL_HEIGHT/(float)sourceHeight);<BR><BR> if(nPercentH < nPercentW)<BR> {<BR> nPercent = nPercentH;<BR> destX = (int)((THUMBNAIL_WIDTH - (sourceWidth * nPercent))/2);<BR> }<BR> else<BR> {<BR> nPercent = nPercentW;<BR> destY = (int)((THUMBNAIL_HEIGHT -(sourceHeight * nPercent))/2);<BR> }<BR><BR> int destWidth = (int)(sourceWidth * nPercent);<BR> int destHeight = (int)(sourceHeight * nPercent);<BR><BR> bmPhoto = new Bitmap( THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, PixelFormat24bppRGB );<BR> bmPhoto->SetResolution( image.GetHorizontalResolution(), image.GetVerticalResolution() );<BR><BR> Graphics *grPhoto = Graphics::FromImage( bmPhoto );<BR> Color colorW(255, 255, 255, 255);<BR> grPhoto->Clear( colorW );<BR> grPhoto->SetInterpolationMode( InterpolationModeHighQualityBicubic );<BR> grPhoto->DrawImage( &image, Rect(destX, destY, destWidth, destHeight) );<BR><BR> bmPhoto->GetHBITMAP( colorW, &hbmReturn );<BR><BR> Bmp1.Attach( hbmReturn );<BR> photoview->m_imageList.Add(&Bmp1, RGB(0, 0, 0));<BR> photoview->m_ListBox.GetText(index,name);<BR> photoview->GetListCtrl().InsertItem(index,name,index+1);<BR> delete grPhoto;<BR> delete bmPhoto;<BR> Bmp1.Detach();<BR> DeleteObject( hbmReturn );<BR><BR>谢谢各位朋友的关注.就把分给 gww 吧,也谢谢 rub.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -