• 在位图上写字


    文章内容来自:http://www.codeproject.com/gdi/gdionbitmaps.asp

    介绍:
    本文描述了如何在位图上画线、图形或者文字。要求很简单,可以给初学者的一个方便快速的参考。

    用HBITMAP操作位图
    首先我们需要一个背景位图,这个位图是通过一个hbitmap句柄引用的。至于hbitmap是如何得到,可以有多种方法:先前操作得到的hbitmap;用CreateBitmap函数创建返回的;或者是通过资源导入的:
    HBITMAP hbitmap = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
    //LoadBitmap从工程的资源里装载位图,位图的ID为IDB_BITMAP1

    然后通过hbitmap句柄,我们可以得到一些关于位图的基本信息:
    BITMAP bm;                  //位图对象结构
    GetObject(hbitmap,sizeof(BITMAP),&bm);      //返回hbitmap所指位图的基本信息到结构对象bm里
    long width=bm.bmWidth;
    long height=bm.bmHeight;         //得到位图的高度、宽度

    接着创建一个内存DC,同时选入一个新的位图

    BITMAPINFO bmInfo; //定义位图头结构对象
    memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
    bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    bmInfo.bmiHeader.biWidth=width;
    bmInfo.bmiHeader.biHeight=height;
    bmInfo.bmiHeader.biPlanes=1;
    bmInfo.bmiHeader.biBitCount=24;
    //创建临时的内存DC对象
    HDC pDC = ::GetDC(0);
    HDC TmpDC=CreateCompatibleDC(pDC);

    //利用位图头结构对象bmInfo创建一个新的位图,同时选入创建的内存DC
    BYTE *pbase;
    HBITMAP TmpBmp=CreateDIBSection(pDC,&bmInfo,DIB_RGB_COLORS,(void**)&pbase,0,0);
    HGDIOBJ TmpObj=SelectObject(TmpDC,TmpBmp);

    在创建的TmpDC上我们就可以画线、写文字或者画图。下面的代码就是如何在一个背景位图上写文字:

    //把背景位图选入DC设备
    HDC dcBmp=CreateCompatibleDC(TmpDC);
    HGDIOBJ TmpObj2 = SelectObject(dcBmp,hbitmap); //把hbitmap选入内存DC
    BitBlt(TmpDC,0,0,width,height,dcBmp,0,0,SRCCOPY);//复制图片到内存DC
    SelectObject(TmpDC,TmpObj2);
    DeleteDC(dcBmp);

    //选择创建字体
    CFont m_Font;
    LOGFONT* m_pLF;
    m_pLF=(LOGFONT*)calloc(1,sizeof(LOGFONT));
    strncpy(m_pLF->lfFaceName,"Times New Roman",31);
    m_pLF->lfHeight=64;
    m_pLF->lfWeight=600;
    m_pLF->lfItalic=1;
    m_pLF->lfUnderline=0;
    m_Font.CreateFontIndirect(m_pLF);
    //用LOGFONT结构创建一种字体

    //把创建的字体对象选入DC
    CDC dc;
    dc.Attach(TmpDC);
    CFont* pOldFont=NULL;
    if(m_Font.m_hObject) //判断字体创建是否成功
    {
        //如果创建成功就选入DC
        pOldFont = dc.SelectObject(&m_Font);
    }
    else
    {
        //如果创建没成功则选入默认的字体
        dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));
    }

    //设置文本颜色
    dc.SetTextColor(RGB(60,120,240));
    //设置添加文字的位置
    RECT pos = {40,40,0,0};
    //添加文字
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText("Test",4,&pos,DT_CALCRECT);
    dc.DrawText("Test",4,&pos,0);

    //释放和清除
    if (pOldFont)
    {
        dc.SelectObject(pOldFont);
    }
    m_Font.DeleteObject();
    dc.Detach();
    free(m_pLF);

    这里有两个两个位图对象:hbitmap和TmpBmp,就能同时保存新旧两个图象,或者用TmpBmp替代
    hbitmap:
    DeleteObject(hbitmap);
    hbitmap=TmpBmp;

    最后,我们就能删除临时DC。此时不要删除hbitmap和TmpBmp,否则就可能丢失位图。

    //最后的资源清除
    SelectObject(TmpDC,TmpObj);
    DeleteDC(TmpDC);

    结论:
    文章开始用一个保存在HBITMAP里的背景图象,最后形成一个新图象,保存在一个新的HBITMAP里。这在操作过程中给了我们很大的灵活性: 可以利用所有的GDI函数创建图象,比如CBitmap,象FreeImage和CxImage这些图形处理库,还可以给图片添加效果或者保存图片到文件。

  • 相关阅读:
    Oracle 18c新特性一览
    iOS xcode缓存问题
    预编译头文件
    iOS 限制UITextField输入字符
    网络通信之 字节序转换原理与网络字节序、大端和小端模式
    iOS 库文件制作
    iOS 全屏布局
    内存问题 动态加载地址和运行时地址
    申请工作居住证政策解答
    phpsession配置
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330137.html
Copyright © 2020-2023  润新知