Memory DC 与hBitmap

2016-02-19 16:52 1 1 收藏

下面这个Memory DC 与hBitmap教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

  DC 即Device Context,是GDI内部的一个资料结构,一个DC会和某个特定的显示设备(如打印机、屏幕等)产生关联。我们如果能取得该DC的handle 那我们便可以在这显示设备上写字、画图。

  在Form 或Picturebox中都有一个hdc的属性,指的便是这东西,但是,怎麽又会有一个Memory DC呢?这是一个存在记忆体内的 dc ,它除了不像form picturebox能将图形、文字显示出来之外,其他的几乎都相同,它也可以用在所有的 GDI API 呼叫之上,其实我们在VB中早就有使用上这 Memory DC 了,只是没有自觉。当我们设 form picturebox的AutoRedraw = True时, hdc所指的便是Momoory DC,这时我们在其上作绘图动作,都没有显示在form上,这便是先前说的,它只是在记忆体中,不会真的画出图。而我们下refresh指令时,便是将这MemoryDC上的图,copy到 form/PictureBox上。

  另外我们也可以使用

  CreateCompatibleDC() API 它传入一个 hDc ,代表产生的 Memory DC和 hdc相容,若传0则是与屏幕相容的 Memory DChMemDC = CreateCompatibleDC(0)

  这时候,该hMemDC所指的绘图区有多大呢?其实只有一个单色Pixel,直到我们使用SelectObject( hMemDC, hBitmap)

  那hMemDC显示区就会有和hBitmap一样的宽度、高度、颜色选择等。 而且我们在hMemDC上的任何绘图,也都会反映在 hBitMap上,也就是说,原本hBitMap所指的图,於SelectObject(hMemDC, hBitMap)後,我们使用gdi函式在hMemDC上画一条线,那麽该hBitmap所指的图也会有一条线了。

  接下来令人心烦的是hBitmap如何取得,在vb可以使用以下的两个方式:

  1.使用Form/PictureBox上Image属性(它是个物件),不管我们放入Form/PictureBox中Picture属性的图是否是Bitmap图,Image所指的,是一份存在记忆体中的Bitmap图,(这是我的想法,因我查了一下,Image.Type 永远说是BitMap图,而不管Picture属性的图是那一种类型),而Image.Handle所指,便是这bitmap图的hBitmap。但是,不要高兴太早,这hBitmap的范围可比你想像中的大,如果有一个PictureBox大小100*100而设定一个50*50 的图於其上, 那PictureBox.Image的大小是100*100,因为它所指的是整个PictureBox的图,而刚好PictureBox上有图形显示於其上。而如何才能取得50*50的hBitMap呢,我会用"偷吃部",指定 PictureBox比50*50小(如:1*1)而且设定AutoSize = True,BorderStyle = 0 当我们用LoadPicture把图形放进来时,

  PictureBox会放大成与该图的大小相同,那麽,PictureBox.Image的大小也会随之放大

  2.使用StdPicture物,而後用LoadPicture将图放进来,但是这一定只能使用BitMap图,

  要不然StdPicture.Handle不会是hBitmap,而是其他Handle( 如:hIcon)如果使用api,可以使用hBitMap = CreateCompatibleBitmap(hDc, Height, Width)那会产生一个高Height * 宽 Width大小(Pixels)的BitMap图,而且该BitMap图和Hdc所指的物件有相同的颜色数,且Bits Per Pixels也相同。然而该BitMap图里什麽也没有,一般我们接着使用SelectObject(hdc, hBitMap) 而利用hDc来绘图,这一切的绘图就会反映在hBitMap上,而我们一般会以MemoryDC来当作hdc的传入值,等绘图动作完了,我们便可以把这Memory DC删除(DeleteDC()),而只单纯的留下hBitmap。如:

  hMemDc = CreateCompatibleDc(0)

  hBitMap = CreateCompatibleBitMap(Screen.ActiveForm.hDc, 100,100)

  Call SelectObject(hMemDc, hBitMap)

  '执行一些绘图指令,如:Textout() StretchBltStretchBlt() BitBlt()DeleteDC hMemDc

  

  当然,如果我们不知道图形的大小时,CreateCompatibleBitMap就不是那麽方便了,要知道图形的大小我们也可以由PictureBox.Picture中Width/Height这两个属性来做,但是还得经过一下转换,因为这两个值的单位是HiMetric,要使用ScaleX() ScaleY()来转成Pixels即ScaleX(picture1.Picture.Width, vbHiMetric, vbPixels)才是我们想要的宽度,ScaleY(picture1.Picture.Height, vbHiMetric, vbPixels)才是我们想要的高度。另外也可以使用以下的方式来取得hBitmap'假设有一个PictureBox而我们事先已Load一个图进来了。

  Dim bm As Bitmap, hBmp as Long

  GetObject Picture1.Picture, Len(bm), bm '取得PictureBox内图形的的BitMap结构hBmp = CreateBitmapIndirect(bm) '产生一个Bitmap图,该图的大小颜色数由bm所控制hmemDC = CreateCompatibleDC(Picture1.hDC)SelectObject hmemDC, hBmp 'hmemDC的大小和hBmp相同了

  picture1.AutoRedraw = True'将Picture1的图画在hmemDc上,如此,hBmp便是我们所要的。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  BitBlt hmemDC, 0, 0, bm.bmWidth, bm.bmHeight, picture1.hDC, 0, 0, vbSrcCopy

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1613399.html

延伸阅读
充满童趣拍摄功能 儿童概念DC   根据国外网站报道,一位设计师最近提出了关于儿童专用数码相机的最新型构想,名为Dolli概念相机。 (图老师整理) Dolli儿童概念DC 如图所示,这款产品是以三星品牌作为整体构想的。它是一款非常智能化的产品,内置了若干资料库。小朋友们在外出玩耍时,如果拍摄到对应的景物、植物或者动物...
标签: PS PS教程
  在传统暗房制作中,我们可以将彩色图像制作成黑白图像或者制作成单色调图像,例如具有仿古韵味的棕色调。目前很多DC在功能上都具有不同的色调模式,例如黑白模式、棕褐色模式、正负片模式。不同的色调模式在特定环境中,图像画面会产生非常奇妙的特殊感觉,视觉上给予人极大的冲击。如果你的相机与笔者一样属于低端产品...
标签: PS PS教程
    优秀的DC照片,除了要求较强的摄影技术外,后期加工也是必不可少的。大多数DC用户或多或少应该掌握一些基础的DC后期处理技艺。其中照片的边框处理是必不可少的,漂亮的边框一定能为你的照片锦上添花。下面看看在Photoshop(以下简称PS)中,如何制作各类艺术边框效果。 ★ 最简单的勾边效果    ...
《尘埃3》dc compound 80个mission模式视频 会员:wake-up 杂谈 180度旋转跳 新增七个内容包 《尘埃3 完全版》3月初上市     Codemasters日前宣布,《尘埃3 完全版》(DiRT 3 Complete Edition)预定将于3月9日在美国上市,售价39.99美元。      本作登陆PC、Xbox360、PS3平...
《尘埃3》第一次dc漂移 新增七个内容包 《尘埃3 完全版》3月初上市     Codemasters日前宣布,《尘埃3 完全版》(DiRT 3 Complete Edition)预定将于3月9日在美国上市,售价39.99美元。      本作登陆PC、Xbox360、PS3平台。游戏获得了世界拉力锦标赛组委会的授权,许多赛车明星...

经验教程

249

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部