-
打开VC++6.0,新建一个MFC工程,工程取名【ShowPic】;步骤:【文件】--【工程】--【MFC Appwizard[exe]】--【工程名】--【位置】--【确定】
-
选择【基本对话框】,然后直接点击【完成】,这里我们全部默认MFC应用程序向导的剩余步骤
-
MFC向导直接给我们生成了一个对话框,这个对话框是可以编译运行的,不过没有什么功能而已
-
在对话框上单击鼠标右键,选择【属性】,默认对话框ID,更改标题为:百度经验图片秀,在更改的同时,对话框的标题就及时的更改了
-
在控件里选择【图片控件】,拖放到对话框里,并拖拽为需要的大小
-
在图片控件上单击鼠标右键,选择【属性】,ID改为:IDC_Showing,标题默认为位图
-
继续点选属性里的【样式】标签,选取【凹陷】、【图像居中】、【真实大小图像】
-
在控件里选择【按钮控件】,在对话框中添加一个按钮控件,在其属性页更改ID为:IDC_Open,标题改为:打开位图
-
编译,运行程序,此时的图片秀还没有具体功能,不过所需资源已经就位
-
第一个关键点到了,为按钮控件绑定函数。打开【MFC ClassWizard】,在Class name下选择CShowPicDlg类,Object IDs下选择按钮控件的ID:IDC_Open,在Message下选择BN_CLICKED,然后点击Add Function按钮,在弹出的对话框内填写OnBtnOpenBmp(这个是函数名),点击OK,然后点击EditCode编辑函数
-
在打开的ShowPicDlg.cpp文件中OnBtnOpenBmp()位置添加以下代码:
CFileDialog dlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp||");
if(dlg.DoModal() != IDOK)
{
return;
}
m_path = dlg.GetPathName(); //获得图片路径
UpdateData(false); //更新路径公共变量
ShowPic(); //调用显示图片函数 -
在头文件ShowPicDlg.h添加CShowPicDlg类需要的函数和成员变量声明
public:
void CShowPicDlg::ShowPic();
private:
CString m_path;
RECT rect;
BITMAP bm;
HBITMAP hBitmap;
HDC hSrcDC;
HDC hDesDC;
CWnd *hwnd; -
继续转回ShowPicDlg.cpp文件中,编写ShowPic()函数体,代码如下:
oid CShowPicDlg::ShowPic()
{
if(m_path=="") //判断图片路径是否存在
{
return;
}
hwnd = GetDlgItem(IDC_ShowImg);
hDesDC = hwnd->GetDC()->m_hDC;
hSrcDC = CreateCompatibleDC(hDesDC);
hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hBitmap, sizeof(BITMAP), &bm);
SelectObject(hSrcDC, hBitmap);
hwnd->GetClientRect(&rect);
::SetStretchBltMode(hDesDC,COLORONCOLOR);
::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC,
0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);
UpdateData(false);
} -
编译,运行,打开图片,显示图片都正常,但是当程序被覆盖或者拖拽到屏幕边缘再恢复时,被覆盖的部位图片消息了?
-
这是因为在控件恢复的时候没有重绘图片,我们需要在OnPaint()内添加负责重绘图片控件的代码,如下:
//更新windows窗口,如果无这步调用,图片显示还会出现问题
CDialog::UpdateWindow();
ShowPic(); //重绘图片函数 -
再次编译,运行,一切正常,至此,百度经验图片秀编写完成了