此程序基于vs2013下开发的:
创建MFC基于对话框程序 MFCApplication2;然后新增加对话框程序 m_NewDlg_Info;把对话框样式设置成Chlid,ID为IDD_M_NEWDLG_INFO在 MFCApplication2对话框加载一个图片控件 把ID改为IDC_STATIC_ChildArea
我们需要把新建的子窗口在图片的位置显示,并且大小就是图片的大小,
//将新建的子窗口移动到主窗口图片的位置
在MFCApplication2.h
中定义CRect m_DialogChlid;//来获取当前图片的窗口大小
MFCApplication2.cpp
首先需要添加头文件
#include "m_NewDlg_Info.h"
在BOOL CMFCApplication2Dlg::OnInitDialog()函数添加如下代码
m_NewDig_Info m_NewDlg_Info;
m_NewDlg_Info.Create(IDD_M_NEWDLG_INFO, this);
//读取嵌入位置,IDC_STATIC_ChildArea是刚才的PictureControl的ID,m_Dialog 是一个CRect的变量,需要在头文件进行声明。
GetDlgItem(IDC_STATIC_ChildArea)->GetWindowRect(&m_DialogChild);
ScreenToClient(m_DialogChild);
//以下的功能是显示m_NewDlg_Info的内容。为了显示m_NewDlg_Enqiure,可以在相应的处理函数中放入这行代码,并隐藏
//m_NewDialog_Info即可。
m_NewDlg_Info.MoveWindow(m_DialogChild);//将子窗口移动到图片位置
m_NewDlg_Info.ShowWindow(SW_SHOW);//显示子窗口
GetDlgItem(IDC_STATIC_ChildArea)->ShowWindow(FALSE);//将图片窗口隐藏
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
m_NewDlg_Info.h文件
class m_NewDlg_Info : public CDialog
{
DECLARE_DYNAMIC(m_NewDlg_Info)
public:
m_NewDlg_Info(CWnd* pParent = NULL); // 标准构造函数
virtual ~m_NewDlg_Info();
CBrush m_brush;
// 对话框数据
enum { IDD = IDD_M_NEWDLG_INFO };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
BOOL m_NewDlg_Info::OnInitDialog();
DECLARE_MESSAGE_MAP()
BOOL m_NewDlg_Info::loadbmp(CString cc);
public:
afx_msg void OnPaint();
};
m_NewDlg_Info.cpp文件
#include "stdafx.h"
#include "MFCApplication2.h"
#include "m_NewDlg_Info.h"
#include "afxdialogex.h"
#include "afx.h"
// m_NewDlg_Info 对话框
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNAMIC(m_NewDlg_Info, CDialog)
m_NewDlg_Info::m_NewDlg_Info(CWnd* pParent /*=NULL*/)
: CDialog(m_NewDlg_Info::IDD, pParent)
{
}
m_NewDlg_Info::~m_NewDlg_Info()
{
}
void m_NewDlg_Info::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BOOL m_NewDlg_Info::OnInitDialog()
{
CDialog::OnInitDialog();
/// TODO: Add your control notification handler code here
return true;
}
BEGIN_MESSAGE_MAP(m_NewDlg_Info, CDialog)
ON_WM_CTLCOLOR()
ON_WM_PAINT()
END_MESSAGE_MAP()
// m_NewDlg_Info 消息处理程序
HBITMAP bit;
HDC MemDC;
int w, h;
CString cc;
BOOL m_NewDlg_Info::loadbmp(CString cc){
DeleteObject(bit);
bit = (HBITMAP)LoadImage(AfxGetInstanceHandle(), cc, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (bit == NULL)
return FALSE;
DIBSECTION ds;
BITMAPINFOHEADER &bm = ds.dsBmih;
GetObject(bit, sizeof(ds), &ds);
w = bm.biWidth;
h = bm.biHeight;
return TRUE;
}
void m_NewDlg_Info::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
m_NewDlg_Info bmpw;
MemDC = CreateCompatibleDC(dc.m_hDC);
cc = "F:/bitmap1.bmp";//图片路径
if (bmpw.loadbmp(cc) == FALSE){
AfxMessageBox(cc+" not finding!");
return;
}
SelectObject(MemDC,bit);
BitBlt(dc.m_hDC,0,0,w,h,MemDC,0,0,SRCCOPY);
DeleteDC(MemDC);
HPEN pen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
dc.SelectObject(&pen);
dc.MoveTo(0, 0);
dc.LineTo(100, 100);
}