3.3.4 借助兼容DC加载DIB位图

创建一个与设备环境相兼容的DC,通过将位图暂时导入至兼容DC,然后利用CDC::BitBlt 或者CDC::StretchBlt函数将位图绘制到设备环境中。

示例代码如下:

void CFDlg::OnLoadbitmap()
{
// TODO: Add your control notification handler code here
HBITMAP hbitmap;
BITMAP bitmapinfo;
CBitmap cbitmap;
RECT rc;
//获取指定ID号的窗口指针
CWnd* mywnd = GetDlgItem(IDC_BITMAPAREA);
//定义一个与指定窗口相关的设备环境(DC)
CClientDC dc(mywnd);
//定义一个与dc向兼容的内存DC
CDC memdc;
//获取指定窗口的尺寸
mywnd->GetClientRect(&rc);
//导入位图句柄
hbitmap = (HBITMAP) ::LoadImage(NULL , "D:\\wanghui1.bmp" , IMAGE_BITMAP , , , LR_LOADFROMFILE ) ;
//将位图句柄附贴至位图类对象中
cbitmap.Attach(hbitmap);
//获取位图信息,包括位图宽、高等参数
cbitmap.GetBitmap(&bitmapinfo);
//创建一个与指定窗口dc兼容的内存DC
memdc.CreateCompatibleDC(&dc);
//将位图加载到内存DC
CBitmap *oldbitmap = memdc.SelectObject(&cbitmap);
//将内存DC中的位图导入到指定窗口的实际DC中
// dc.StretchBlt(0, 0, (rc.right-rc.left), (rc.bottom-rc.top), &memdc, 0, 0, bitmapinfo.bmWidth, bitmapinfo.bmHeight, SRCCOPY);
dc.BitBlt(, , (rc.right-rc.left), (rc.bottom-rc.top), &memdc, , , SRCCOPY);
//将位图从内存DC中移出
memdc.SelectObject(oldbitmap);
//删除位图句柄,位图类对象在程序结束后调用其析构函数来释放内存
cbitmap.DeleteObject();
}

就上述示例代码,详细解释几个函数:

HANDLE  LoadImage(

  HINSTANCE hinst,       // handle of the instance containing the image

  LPCTSTR lpszName,      // name or identifier of image

  UINT uType,            // type of image

  int cxDesired,         // desired width

  int cyDesired,         // desired height

  UINT fuLoad            // load flags

);

该函数可以导入一个图标、光标及位图。

hinst:指向应用程序的一个实例,可以通过AfxGetInstanceHandle( )函数来获取,

lpszName: 指向图像的文件名或者资源标识符,当fuLoad=LR_LOADFROMFILE时,lpszName指向文件名,hinst可取值NULL。

uType:图像类型,取值有:

value                          meaning

IMAGE_BITMAP            导入位图

IMAGE_CURSOR          导入光标

IMAGE_ICON               导入图标

cxDesired、cyDesired:光标或图标的宽度、高度,单位:像素。

fuLoad:当fuLoad = LR_LOADFROMFILE时,表示从lpszName指向的文件加载图像,如果LR_LOADFROMFILE未指定,lpszName指向的是资源名称。

3.3.5 利用SetDIBitsToDevice来加载位图

首先解释SetDIBitsToDevice:

int SetDIBitsToDevice(

HDC hdc,              // handle to device context

int XDest,             // x-coordinate of upper-left corner of dest. rect.

int YDest,             // y-coordinate of upper-left corner of dest. rect.

DWORD dwWidth,        // source rectangle width

DWORD dwHeight,       // source rectangle height

int XSrc,                     // x-coordinate of lower-left corner of source rect.

int YSrc,                    // y-coordinate of lower-left corner of source rect.

  UINT uStartScan,      // first scan line in array

UINT cScanLines,      // number of scan lines

CONST VOID *lpvBits,  // address of array with DIB bits

CONST BITMAPINFO *lpbmi,  // address of structure with bitmap info.

UINT fuColorUse       // RGB or palette indexes

);

示例代码:

void CFDlg::OnLoadbitmap()
{
unsigned char* ImageBuffer= NULL;
unsigned char* ImageData = NULL;
BITMAPFILEHEADER m_bitmapfileheader;
BITMAPINFOHEADER* infoheader;
RGBQUAD* palette;
BITMAPINFO *bmi;;
FILE *ImageFile;
unsigned int BytesSize=; if (NULL==(ImageFile=fopen("D:\\wanghui1.bmp","rb")))
{
printf("can not open the image file!");
return ;
}
else
{
//读取位图文件头
fread(&m_bitmapfileheader,sizeof(BITMAPFILEHEADER),,ImageFile);
//为位图信息头和调色板开辟内存
ImageBuffer = new unsigned char[m_bitmapfileheader.bfOffBits-sizeof(BITMAPFILEHEADER)];
//读取信息头与调色板数据块
fread(ImageBuffer,m_bitmapfileheader.bfOffBits-sizeof(BITMAPFILEHEADER),,ImageFile);
//将ImageBuffer强制转化成BITMAPINFO类型,然后将信息头指针和调色板指针指向对应地址位置
bmi = (BITMAPINFO*)ImageBuffer;
infoheader = &(bmi->bmiHeader);
palette = bmi->bmiColors;
//计算文图数据字节大小
BytesSize = (infoheader->biWidth * infoheader->biHeight * (infoheader->biBitCount/));
//开辟位图数据内存块
ImageData = new unsigned char[BytesSize];
//读取位图数据块
fread(ImageData,BytesSize,,ImageFile);
//获取指定窗口
CWnd* mywnd = GetDlgItem(IDC_BITMAPAREA);
//创建指定窗口关联的DC
CClientDC dc(mywnd);
RECT rc;
//获取指定窗口区域大小
mywnd->GetClientRect(&rc);
//将位图绘制到指定窗口的DC上
SetDIBitsToDevice(dc.m_hDC, , , infoheader->biWidth, infoheader->biHeight, , , , infoheader->biHeight, ImageData, bmi, DIB_RGB_COLORS);
}
//释放动态开辟的内存
delete[] ImageBuffer;
delete[] ImageData;
}

MFC技术积累——基于MFC对话框类的那些事儿4的更多相关文章

  1. MFC技术积累——基于MFC对话框类的那些事儿

    1. 创建对话框类 (1)打开VC++6.0环境,点击:文件→新建: (2)在弹出的新建对话框中选择:工程→MFC AppWizard (exe)→输入工程名称(例如:功能调试)→工程保存路径名→确定 ...

  2. MFC技术积累——基于MFC对话框类的那些事儿5

    4. 菜单 4.1 弹出菜单 本节主要讲解如何在主对话框的指定区域内通过鼠标右击来弹出一个菜单选项.最终效果图如图4.1. 如图4.1鼠标只能在指定区域(图中深色区域)内右击时弹出菜单,在指定区域外点 ...

  3. MFC技术积累——基于MFC对话框类的那些事儿2

    3. 绘图 3.1 对话框资源编辑 首先通过添加控件的方式来创建一个简单的绘图对话框如图所示,创建步骤为: 第一.在VC++6.0软件环境的灰色空白区域右击,选中Controls,然后会弹出一个控件对 ...

  4. MFC技术积累——基于MFC对话框类的那些事儿3

    3.3.2 创建图形画刷来实现位图加载 1.首先在Resource View中导入一幅位图,位图大小96×96像素: 2.其次在主对话框中添加一个静态文本资源,ID号是IDC_BITMAPAREA,添 ...

  5. MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

    ////////////////////////////////////////////////////////////////////////////////////                 ...

  6. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  7. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  8. 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...

  9. VS2010/MFC对话框三:创建对话框类和添加控件变量

    创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...

随机推荐

  1. damon

    不管是否有-f参数,最终程序都会进入 fuse_loop_mt 循环中,在helper.c的fuse_main_common函数中. 1. 有-f参数.这种情况下fuse_setup_common函数 ...

  2. java回调机制及其实现

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...

  3. 机器学习 Hidden Markov Models 1

    Introduction 通常,我们对发生在时间域上的事件希望可以找到合适的模式来描述.考虑下面一个简单的例子,比如有人利用海草来预测天气,民谣告诉我们说,湿漉漉的海草意味着会下雨,而干燥的海草意味着 ...

  4. [Selenium] Selenium find Element Examples

    ---> 1. By.id  以百度主页为例 <span classs = "bg s_ipt_wr"> <input type = "text& ...

  5. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  6. 「LuoguP1145」 约瑟夫(打表

    Description n 个人站成一圈,从某个人开始数数,每次数到 m 的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人, k 个好人站在一起, k 个坏人站在一起.从第一个好 ...

  7. return break contiune

    return 会直接跳出当前作用域,继续执行下面的方法:在js中for循环没有局部作用域的概念,所以如果是多级循环会直接跳出所有的循环: demo for(var i=0; i<10; i++) ...

  8. UVaLive 7454 Parentheses (水题,贪心)

    题意:给定一个括号序列,改最少的括号,使得所有的括号匹配. 析:贪心,从左到右扫一下,然后统计一下左括号和右括号的数量,然后在统计中,如果有多了的右括号,那么就改成左括号,最后如果两括号数量不相等, ...

  9. SCUT - 261 - 对称与反对称 - 构造 - 简单数论

    https://scut.online/p/261 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几里得求逆元,而不是费马小定理! 由于M不是质数,要用扩展欧几 ...

  10. 洛谷P3209 [HNOI2010]平面图判定(2-SAT)

    传送门 看到哈密顿回路就被吓傻了……结果没有好好考虑性质…… 首先,平面图有个性质:边数小于等于$3n-6$(我也不知道为啥),边数大于这个的直接pass 然后考虑原图,先把哈密顿回路单独摘出来,就是 ...