VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2579|回复: 34

[原创] 在对话框显示片图的多种方法 w

[复制链接]
79_avatar_middle
在线会员 发表于 2016-3-16 11:31:50 | 显示全部楼层 |阅读模式
我们先从简单的开始吧.先分一个类:

(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)

(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)



为方便说明,我们已经建好一个基于对话框的工程,名为Ttest.

对话框类为CTestDlg

(一)    非动态载入图片.



方法1.先从最简单的开始,用picture 控件来实现.

步骤:

先在资源里Import一张图片,ID为IDB_BITMAP2

然后在对话框上添加一个picture控件,右键点击打开属性,

将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框,

拉开就会看到所有已经载入好的图片,

选择你要的图片.运行程序即可看到.



方法2.通过背景图

同样如上,先载入一张图片,ID为IDB_BITMAP2

TestDlg.h中

CBrush m_brBk;//在public中定义



TestDlg.cpp中



在初始化函数OnInitDialog()中加入:

BOOL CTestDlg::OnInitDialog()

{

               CDialog::OnInitDialog();

CBitmap bmp;

bmp.LoadBitmap(IDB_BITMAP2);

m_brBk.CreatePatternBrush(&bmp);

bmp.DeleteObject();

          return TRUE;  // return TRUE  unless you set the focus to a control

}



在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:

HBRUSH  CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

               HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if (pWnd == this)

{

    return m_brBk;

}

       return hbr;

}



(二)    动态载入图片.

方法3 图像控件(本例用KoDak 图像编辑控件)

1.    首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows\system目录下,然后用regsvr32.exe将它们分别注册。

2.    打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control… 选择Kodak图象编辑控件,大小任意。

3.    在对话框上选中该控件,为其添加变量:m_ctrlPicture。。

4.    在BOOL CTestDlg::OnInitDialog()添加如下:

BOOL CTestDlg::OnInitDialog()

{

     CDialog::OnInitDialog();

     m_ctrlPicture.SetImage("aa.jpg");  //保证图像在工程目录下,也可以写绝对路径

     m_ctrlPicture.Display();

      return TRUE;  // return TRUE unless you set the focus to a control

                   // EXCEPTION: OCX Property Pages should return FALSE

}

编译运行就OK了,此种方法的好处就是可能针对多种图像格式.



方法4 通过CBitmap,HBITMAP,直接用OnPaint()绘制

首先在CTestDlg类中声明一个变量:   CBitmap  m_bmp;

然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1

然后:

BOOL CDisplayPic::OnInitDialog()

{

       CDialog::OnInitDialog();

    if( m_bmp.m_hObject != NULL )//判断

        m_bmp.DeleteObject();

/////////载入图片

    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),

        "c:\\aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

    if( hbmp == NULL )

        return FALSE;

///////////////////////该断程序用来取得加载的BMP的信息////////////////////////

    m_bmp.Attach( hbmp );

    DIBSECTION ds;

    BITMAPINFOHEADER &bminfo = ds.dsBmih;

    m_bmp.GetObject( sizeof(ds), &ds );

    int cx=bminfo.biWidth;  //得到图像宽度

    int cy=bminfo.biHeight; //得到图像高度

    /////////////////// ////////////////////////////////

/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////

    CRect rect;

    GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);

    ScreenToClient(&rect);

    GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小



    return TRUE;  // return TRUE unless you set the focus to a control

                  // EXCEPTION: OCX Property Pages should return FALSE

}

图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了,打开类向导,重载WM_PAINT消息

void CDisplayPic::OnPaint()

{

//////////////以下三种情况任选一种会是不同效果(只能一种存在)///////////

    //CPaintDC dc(this);      //若用此句,得到的是对话框的DC,图片将被绘制在对话框上.

    CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上

    //  CDC dc;

    //  dc.m_hDC=::GetDC(NULL);  //若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///////////////////////////////////////////////////////

    CRect rcclient;

    GetDlgItem(IDC_STATIC1)->GetClientRect(&rcclient);

    CDC memdc;

    memdc.CreateCompatibleDC(&dc);

    CBitmap bitmap;

    bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());

    memdc.SelectObject( &bitmap );



    CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

CDC maskdc;

    maskdc.CreateCompatibleDC(&dc);

    CBitmap maskbitmap;

    maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);

    maskdc.SelectObject( &maskbitmap );

    maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,

        rcclient.left, rcclient.top, SRCCOPY);



    CBrush brush;

    brush.CreatePatternBrush(&m_bmp);

    dc.FillRect(rcclient, &brush);     

    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),

             &memdc, rcclient.left, rcclient.top,SRCPAINT);

    brush.DeleteObject();



    // Do not call CDialog::OnPaint() for painting messages

}

以上四种方法唯有KoDak可以支持多种图像,其它的只支持BMP

评分

参与人数 4驿站币 +6 热心值 +6 收起 理由
16_avatar_small 阳光 + 1 + 1 很给力!
65_avatar_small 编程者 + 2 + 2 感谢分享!
88_avatar_small 寂寞江湖 + 2 + 2 继续努力啊
11_avatar_small 饮水机 + 1 + 1 很给力!

查看全部评分





上一篇:MFC中的_T宏
下一篇:win32,win64编程永恒;语言编程需要注意的64位和32机器的区别
56_avatar_middle
在线会员 发表于 2016-3-16 21:54:25 | 显示全部楼层
i want known
56_avatar_middle
在线会员 发表于 2016-3-16 21:54:40 | 显示全部楼层
I want known
12_avatar_middle
在线会员 发表于 2016-3-16 22:35:38 | 显示全部楼层
怎么个做法。,学学。。
47_avatar_middle
在线会员 发表于 2016-3-17 15:07:38 | 显示全部楼层
学习一些,谢谢分享
11_avatar_middle
在线会员 发表于 2016-3-17 16:08:27 | 显示全部楼层
谢谢分享啊
83_avatar_middle
在线会员 发表于 2016-3-17 21:54:07 | 显示全部楼层
一般都用CIMAGE这个类我
89_avatar_middle
online_vip 发表于 2016-3-17 22:36:09 | 显示全部楼层
xiexiefenxiang
32_avatar_middle
online_vip 发表于 2016-3-18 08:04:34 | 显示全部楼层
i want known
49_avatar_middle
online_vip 发表于 2016-3-18 14:16:23 | 显示全部楼层
看看是什么情况的东西
51_avatar_middle
在线会员 发表于 2016-3-19 17:02:23 | 显示全部楼层
学习来了
09_avatar_middle
online_vip 发表于 2016-3-19 19:27:50 | 显示全部楼层
我想看看是啥
49_avatar_middle
在线会员 发表于 2016-3-21 00:37:14 | 显示全部楼层
看看 效果不知道怎么样
95_avatar_middle
在线会员 发表于 2016-3-21 10:05:54 | 显示全部楼层

支持看看了
92_avatar_middle
online_vip 发表于 2016-3-21 10:33:34 | 显示全部楼层
瞅自爆,微瞅一下。
92_avatar_middle
online_vip 发表于 2016-3-21 10:35:05 | 显示全部楼层
原以为是个原创,其实还是个搬砖的
99_avatar_middle
在线会员 发表于 2016-3-22 16:59:09 | 显示全部楼层
取取经,哈哈哈
61_avatar_middle
在线会员 发表于 2016-3-22 19:45:23 | 显示全部楼层
study more...................................
59_avatar_middle
在线会员 发表于 2016-4-15 10:06:52 | 显示全部楼层
谢谢分享
18_avatar_middle
online_vip 发表于 2016-4-16 16:32:22 | 显示全部楼层
在对话框显示片图的多种方法 w
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-19 13:00

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表