您的位置:首页 > 其它

MFC对话框显示图片

2016-01-19 15:43 316 查看
我们先从简单的开始吧.先分一个类:

(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定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中

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
}
编译运行就OK了,此种方法的好处就是可能针对多种图像格式。

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

首先在CTestDlg类中声明一个变量: CBitmap m_bmp。然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1

<pre name="code" class="cpp">BOOL CTestDlg::AddPicture()
{

Cstring strBmp;
 HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 

strBmp,

IMAGE_BITMAP,

0,

0,

LR_CREATEDIBSECTION|LR_LOADFROMFILE);

if( hbmp == NULL )
return FALSE;

    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);//调整大小

m_bmp.SetBitmap(hbmp);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: