大家好,小福来为大家解答以上的问题。stretchblt 花屏,stretchblt这个很多人还不知道,现在让我们一起来看看吧!
1、具体要看你是怎么载入图片的,一般有2种做法:1是用Windows的API直接读取位图文件,这需要你清楚位图文件的构成。
2、位图文件有3部分构成: 1位图文件头--BITMAPFILEHEADER, 2位图信息头--BITMAPINFOHEAD, 3是位图数据。
3、 你要的东西就在位图信息头里,这里面有着位图详细的信息(位图大小,高和度都在里面),详细见MSDN,读取时用CFile类的Read函数就可以,读取位图文件的3部分后用StretchDIBits把位图写到你指定的用来做源的CDC设备上下文中,以后你调用StretchBlt时就有源矩形的宽度及高度了,这个方法做起来好麻烦的!2创建一个与显示窗口兼容的DC,是用LoadImage函数载入位图得到一个HBITMAP的句柄,创建一个CBitmap类对象,用对象绑定前面的句柄,设置一个BITMAP变量bm,CMitmap类有个函数GetBitmap可以获得你要的信息(放入了bm中),把CBitmap对象放入到你创建的与显示窗口兼容的DC里,你就可以用StretchBlt函数了,注意源就是你创建的与窗口兼容的DC,这个方法比前面那个稍为简单点。
4、但也麻烦!最好的方法是用GDI+,建2个对象,一个Graphics对象,一个Imgae对象,你要的宽度和高度信息用Image对象的获取宽度和高度信息的函数就能得到,最主要的是建立Image对象超简单:Image myImage("你的位图文件名");把对象myImage传给Graphics对象,一下就能按你想的缩放来显示图片了!最后给你一个方法2的代码,你变通下可以用的:ShowBMP(CDC* pDC){//注意pDC是指你的显示窗口的设备上下文CDC * pMemDC = new CDC;// 内存显示DCpMemDC->CreateCompatibleDC(pDC);// 创建与当前DC兼容的DC// 从位图文件中载入位图数据,并返回位图的句柄 //m_strFileName注意是你的位图文件名HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), m_strFileName,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);CBitmap bitmap;// CBitmap类对象bitmap.Attach(hBitmap);// 绑定位图数据BITMAP bm; // 到下面你要的信息已经放入变量bm中了bitmap.GetBitmap(&bm);pMemDC->SelectObject(&bitmap); //这是把位图对象放入源DC中去CRect rect;GetClientRect(rect); //这里是获取你的显示窗口的客户区pMemDC->SetStretchBltMode(COLORONCOLOR); // 绘制位图 pDC->StretchBlt(0,0,rect.x,rect.y,pMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//delete pMemDC;}代码我没验证,具体应用到你的工程要看你的理解了函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
5、x:逻辑单元x轴左上角坐标; y:逻辑单元y轴左上角坐标; nWidth: 设备矩形宽度; nHeight:设备矩形高度; pSrcDC: 源设备上下文; xSrc :源矩形 x轴左上角坐标; ySrc: 源矩形y 轴左上角坐标; Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle. nSrcWidth:源矩形宽度; nSrcHeight:源矩形高度 dwRop:指定要进行的光栅操作。
本文到此分享完毕,希望对大家有所帮助。