使用GDI在窗口上画出一个图片

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用GDI在窗口上画出一个图片
GDI 双缓冲函数实现步骤
PAINTSTRUCT ps;
HDC hdc;
//获取屏幕显示DC
hdc = BeginPaint (hWnd,&ps);
//创建内存DC
HDC hdcMem = CreateCompatibleDC(hdc);
//创建一个bmp内存空间
HBITMAP hBmp = CreateCompatibleBitmap(hdc,SCREEN_WIDTH,SCREEN_HEIGHT);
//将bmp内存空间分配给内存DC
HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
//这是使用者需要绘制的画面,全部往内存DC绘制
Rectangle(hdcMem,0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
DrawMenuButton(hdcMem);
//将内存DC的内容复制到屏幕显示DC中,完成显示
BitBlt(hdc,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,hdcMem,0,0, SRCCOPY);
//清除资源
SelectObject(hdcMem,hOldSel);
DeleteDC(hdcMem);
EndPaint(hWnd,&ps);
====================================== ========================
dc = getdc(窗口句柄)
memhdc = createcompitabledc(dc)
selectobject(memhdc,图片句柄)
BitBlt(hDc,0,0,100,24,memdc,0,0,SRCCOPY)
====================================== ==============================
GdipLoadimagefromfile载入pNG图片?
1 首先把位图载入:
HBITMAP bmp = LoadImage(NULL, "d:/logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
2 从你的DC中创建内存DC
HDC mdc = CreateCompitableDC(hdc);
3 把位图选入内存DC
SelectObject(mdc, bmp);
4 帖图
BitBlt(hdc, 0, 0, 100, 100, mdc, 0, 0, SRCCOPY);
具体函数用法,可以具体再查
====================================== ========================================= ==========
VB6 GDI+ 入门教程[6] 图片
VB自己的绘图语句都需要用LoadPicture载入图片,同样,GDI+中也需要。

1.载入(初始化)图片资源
(1)来自文件:GdipLoadImageFromFile
我们先来看看这个最简单基本的载入图片来自文件(只能看不能运行呵呵):
Dim img As Long, img_W As Long, img_H As Long
GdipLoadImageFromFile StrPtr("C:\T estImage.png"), img
GdipGetImageWidth img, img_W
GdipGetImageHeight img, img_H
'GdipDisposeImage img
当然这里面载入长宽是可选的。

最后呢别忘记释放Image,否则内存突然没了可不要找我~
(2)来自资源文件:GdipLoadImageFromStream
这个函数主要是用来从资源文件(RES)载入图像的,怎么载入呢?我们来看函数,函数是从Stream载入,但是我们VB6没有集成Stream对象,从RES读取出来(LoadResData)也只是返回Byte()。

不过很好,OLE提供了一个函数能够将Byte()变为一个IStream对象——我们需要这个API
Declare Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnRelease As Long, ByRef ppstm
As Any)
示例代码:
Dim img As Long
Dim ResData() As Byte, IStream As Object
ResData = LoadResData(101, "CUSTOM")
CreateStreamOnHGlobal ResData(0), False, IStream
GdipLoadImageFromStream IStream, img
Set IStream = Nothing
'GdipDisposeImage img
2.绘制图片
(
1)GdipDrawImage(I) 【不推荐使用】
这是最普通的画法,不需要长宽设置注意:它貌似不按原大小绘制!不推荐使用!。

我们初始化GDI+省略……图片资源也省略(支持32位),来看这种GdipDrawImage(I)。

(技巧:有I的记住了坐标、长宽都是Long型没有I的一般都是Single)
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\T estImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImage graphics, img, 0, 0
(2)GdipDrawImageRect(I)【推荐】
这是第二高级的画法,我们可以对图片的大小进行改变(拉伸)
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\T estImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImageRect graphics, img, 0, 0, 100, 200 '拉伸到100*200
(3)GdipDrawImageRectRect(I)
不要以为微软脑残了。

这个可是很高级的画法。

首先通过它我们可以画一个图的一个部分并且同样可以改变大小(好处:我们可以把所有的图片资源综合到一个图片中)
第二呢这个支持ImageAttribs图片“滤镜”:我们可以改变图片透明度和各种属性
接下来来看看这个的画法:
Dim img As Long
GdipLoadImageFromFile StrPtr("C:\T estImage.png"), img
'此处请初始化GDI+以及graphics
GdipDrawImageRectRectI graphics, img, 20, 20, 10, 10, 0, 0, 100, 200, UnitPixel
注意咯第三~第六个参数是原来图片中要截取的部分;第七~第十呢则是画到哪里以及画出来多大的设置。

(4)贴图刷
贴图刷子跟其它刷子一样我们需要创建刷子另外我们需要先初始化图片:)
来看代码:
Dim img As Long, textureBrush As Long
GdipLoadImageFromFile StrPtr("C:\T estImage.png"), img
'此处请初始化GDI+以及graphics
GdipCreateTexture img, WrapModeTileFlipX, textureBrush GdipFillRectangle graphics, textureBrush, 0, 0, 100, 100
贴图刷子跟其它刷子有什么区别呢?普通画法(DrawImage)支持的是拉伸,贴图刷则是平铺。

另外贴图刷还要注意定位问题。

因为贴图刷纹理起始点是0,0。

因此不代表从任何位置画都可以画到正好的图片。

相关文档
最新文档