设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> 网络编程 >> VB.NET >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
捕捉 MouseExit 事件
有 BitMap 之Menu
在设计时使用 Microsoft…
Microsoft .NET Compact…
用于 Microsoft .NET Co…
谈谈.NET Framework中的…
在.NET Framework 2.0中…
用.NET Compact Framewo…
.NET Compact Framework…
.NET Compact Framework…
  Memory DC 与hBitmap           
Memory DC 与hBitmap
 

p>  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 DC hMemDC= 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。但是,不要高 颂?纾??Bitmap的范围可比你想像中的大,如果有一个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便是我们所要的。
  BitBlt hmemDC, 0, 0, bm.bmWidth, bm.bmHeight, picture1.hDC, 0, 0,vbSrcCopy

>

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-1-23 1:20:07
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持