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

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 , 0 , 0 , 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(0, 0, (rc.right-rc.left), (rc.bottom-rc.top), &memdc, 0, 0, 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=0;

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

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

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

1. 创建对话框类 (1)打开VC++6.0环境,点击:文件→新建: (2)在弹出的新建对话框中选择:工程→MFC AppWizard (exe)→输入工程名称(例如:功能调试)→工程保存路径名→确定(其他勾选项一律默认): (3)在弹出的MFC AppWizard- Step1对话框中选择:(你喜爱创建的应用程序类型?)点击基本对话框→(使用语言?)选择中文→点击下一个: (4)在弹出的MFC AppWizard- Step2 of 4对话框中选择:这里基本保持默认选择,比较有用的一项是输入标

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

3. 绘图 3.1 对话框资源编辑 首先通过添加控件的方式来创建一个简单的绘图对话框如图所示,创建步骤为: 第一.在VC++6.0软件环境的灰色空白区域右击,选中Controls,然后会弹出一个控件对话框: 第二.点击需要的控件,鼠标箭头类型就会变成十字形,然后在主对话框里通过点击.拖拽绘制出需要的控件,这里也可以通过鼠标调整控件大小直到满意为止. 第三.在主对话框里右击打开属性对话框(一般情况下可以点击属性对话框左上角的形如大头针样式的小按钮来锁定属性对话框,解锁也是点击同样的按钮,只是按钮样

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

弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMDDDlg类.在主对话框上我放置了一个标签页(Tab Control)控件,其实现的功能是当单击标签提示A时进入页面A,即对话框A(所对应的类为CDialogChild1),单击B时进入对话框B(CDialogChild2). 整个工程的框架已经设计好了,在对话框A和对话框B上放置了许多控件,现在我想

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

原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++6.0

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

创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++ 6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDia

MFC中文件对话框类CFileDialog详解及文件过滤器说明

当前位置?:?首页???文章分类?:? 开发 ??? MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为图表生成目录 域名迁移公告 2017年12月20日起,本博客迁移到新域名madaimeng.com,旧域名masikkk.com不再更新内容,但将永久保持可访问! 阅读 大专栏  MFC中文件对话框类CFileDialog详解及文件过滤器说明busuanzi_value_page_pv"> 评

基于MFC的单文档,多文档,对话框应用程序

从类的角度区分: 基于对话框(3个类): CAboutDlg 程序名App 程序名Dlg 单文档(5个类): CAboutDlg CMainFrame 程序名App 程序名Doc 程序名View 多文档(6个类): CAboutDlg CMainFrame 程序名App 程序名Doc 程序名View CChildFrame ------------------------------------------------------------------------------- 多文档 CAb

基于MFC对话框程序中添加菜单栏 (CMenu)

vs2013MFC对话框程序中添加菜单栏的过程,我大致分了这五步. 一.将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在任意一个文件夹图标上,右击选择Insert(插入)选项,在弹出的对话框中选择Menu以后,再点击,new按钮,菜单就会添加成功了,但是现在还没有完成,还不能进行编译,因为现在的菜单时空的,在编译的时候会被清除的. 二.用菜单编辑器添加菜单栏及菜单项 菜单添加成功后,菜单编辑器自动打开,可以在其中添加菜单栏及菜单项,比较简单. 三.将菜单加

MFC 调用默认对话框类对象成员和方法

这个功能其实并不常用,然而在多线程和回调函数中要调用默认对话框类的对象成员或方法还是可能要用到的,所以做下记录. 首先声明一个全局变量用以存储默认对话框类对象指针: LPVOID pParam;//对话框对象指针 在默认对话框类的初始化函数中给该指针进行赋值: pParam = (void *)this; 在需要调用默认对话框类对象成员或方法处,通过如下代码实现调用: CPanoramicPlayerDlg *dlg = (CPanoramicPlayerDlg *)lpParam;//其中CP