在对话框中显示bmp图片

来源:互联网 发布:php培训机构达内教育 编辑:程序博客网 时间:2024/04/23 14:55
以前写的图像处理软件不是从头写的,这次从头写个图像处理软件,遇到的第一个难题竟然是无法在对话框工程中打开一幅新的图片,以前短短的几行代码现在被无限扩展,琢磨N久,终于成功.拿出来和大家分享菜鸟的成果...回去好好补补对话框指针的知识
注意:这个程序不是文档视类中实现的,也不是.net实现的..net中只要用CImage类的方法就可以了,而这是VC6
如何在对话框MFC中点击按钮打开并显示bmp位图,关键代码及流程如下:
1 在 CHuffmanBmpDlg::OnOpenImage() 中打开文件,获取文件路径
CFileDialog file_open_dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,"BMPFiles(*.bmp)|*.bmp|All Files(*.*)|*.*||");
file_open_dlg.m_ofn.lpstrTitle ="Open Image File";

if(file_open_dlg.DoModal() != IDOK)
return;
CString file_name = file_open_dlg.GetPathName();
2创建CDialog类的子类CBitmapDialog,注意工程的文件头要包含#include"BitmapDialog.h"

3 回到CHuffmanBmpDlg::OnOpenImage()中,添加新对话框类的实例
CBitmapDialog *source_dlg = new CBitmapDialog;
source_dlg->Create(IDD_Source_Bitmap,NULL);
其中IDD_Source_Bitmap是对话框的ID号
4 在对话框BitmapDialog类中添加公有成员函数CStringimage_name;
5回到CHuffmanBmpDlg::OnOpenImage()中,添加如下代码
source_dlg->image_name = file_name;
source_dlg->ShowWindow(SW_SHOW);
6在对话框BitmapDialog中添加事件响应消息为WM_PAINT,这样MFC会自动添加成员函数
void CBitmapDialog::OnPaint() 
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here

// Do not call CDialog::OnPaint() for painting messages
}
7 在OnPaint()中添加如下代码
CBitmap SourceImage;
HBITMAP OldBitmap;
CDC mDC;
//SourceImage.LoadBitmap(image_name);
SourceImage.Attach((HBITMAP)LoadImage(NULL,image_name,IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(&dc);
OldBitmap =(HBITMAP)dcCompatible.SelectObject(&SourceImage);
CRect rect;
GetClientRect(&rect);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
mDC.SelectObject(&OldBitmap);
8回到CHuffmanBmpDlg::OnOpenImage()中添加Invalidate();重绘窗口(这一步也可不做)
上述过程用文字描述为:
1 在父对话框中添加按钮响应函数
2 打开文件,获取bmp位图的路径名
3 创建子对话框类用于显示bmp位图
4 在父对话框中创建子对话框实例,并将bmp位图路径名传递进去
5 父对话框发送消息,子对话框接收到消息,响应OnPaint函数
6 子对话框中创建CBitmap对象并用Attach和LoadImage函数装载当前位图
7 创建一个CDC对象用于在内存中兼容dc
8 用CDC的SelectObject方法将CBitmap对象中的位图内容拷贝到内存中
9 用BitBlt方法将内存中的信息复制到当前dc中显示出来
10 还原mDC对象,并重绘窗口(这一步可不做)

注意点:
非常重要:不能使用CBitmap::LoadBitmap方法来装载图像,因为MSDN中LoadBitmap的定义为
BOOL LoadBitmap (
LPCTSTR lpszResourceName );
BOOL LoadBitmap (
UINT nIDResource ); 
Parameters
lpszResourceName 
Points to a null-terminated string that contains the name of thebitmap resource. 
nIDResource 
Specifies the resource ID number of the bitmapresource. 
因此,LoadBitmap只能用于装载工程rc中的资源位图ID或其名称.要装载外部图像必须用LoadImage()方法
现在几乎所有的书和网上的论坛都是用的LoadBitmap方法,实在是一大误导

0 0
原创粉丝点击