zoukankan      html  css  js  c++  java
  • win32GDI函数BitBlt

    今天又充电了。

    平时输出文字一般都是用textout或者drawtext。而今天遇到绘制绘图的问题,但是这个不能顾名思义的说直接在客户区draw就可以了,win32有特俗的处理方法。

    要在一个设备环境中绘制位图,我们不能直接话,按msdn里面的说法,我们要创建一个与当前设备环境相兼容的另一个设备环境;将位图选入新创建的设备环境后,再调用bitblt函数来显示位图,bitblt就实现了将位图从新创建的设备环境中copy到当前的设备环境当中(from the specified source device context into a destination device context.这是msdn的原话)..

    我还是有疑问的因为我知道怎么显示位图了,但是还是不知道如何去得到一个位图资源(学习需要这样).

    如果在当前目录下,那好办直接loadbitmap就可以了;

    如果在dll中就比较麻烦一点,可以参考下面的代码:

    void DrawBitmap(HDC hdc,int xStart,int yStart,HBITMAP hBitmap)
    {
    	BITMAP bm;
    	HDC hMemDC;
    	POINT pt;
    
    	hMemDC = ::CreateCompatibleDC(hdc);
    	::SelectObject(hMemDC,hBitmap);
    	::GetObject(hBitmap,sizeof(BITMAP),&bm);
    
    	pt.x = bm.bmWidth;
    	pt.y = bm.bmHeight;
    
    	::BitBlt(hdc,xStart,yStart,pt.x,pt.y,hMemDC,0,0,SRCCOPY);
    
    	::DeleteDC(hMemDC);
    }

    捣乱小子

    温故而知新:

    111107光棍节的前四天,复习了BitBlt,像上面所说的位图只能从一个设备环境拷贝到另一个设备环境当中,所以我们要创建另一个DC,也就是hMemDC。创建之后,我们要往这个环境当中放置位图,也就是selectobject(hMemDC,hBitmap);它会返回一个旧的位图句柄,GetObject其实就是根据句柄来找到资源的,这在win32当中再熟悉不过了。

    传进的BITMAP就在其中更新了,于是得到了它的宽度和高度,找在BitBlt当中是要用到的。

    至于BitBlt依次是是目标设备环境,显示位置,宽高,源设备环境,SRCCOPY(一般用这个mode)。

    有两个位图显示的增强函数,一个是StretchBlt和TransparentBlt,具体的就不在这里讲解了。

    今日温故,是因为笔者踏上了VC的路,即使学习路途比较陡峭,困难多多。

    侯捷说过一句挺有意思的话,如果你没有看过MFC的源代码,那么恭喜你,你是一个快乐的程序员。

     

  • 相关阅读:
    linux进程管理类
    linux关机重启指令
    linux分区及磁盘挂载
    linux的运行级别
    property
    访问限制机制
    类的组合与封装
    继承与派生
    logging模块
    re模块
  • 原文地址:https://www.cnblogs.com/daoluanxiaozi/p/2218166.html
Copyright © 2011-2022 走看看