首先创建MFC多文档项目XXX,在“用户界面功能”处勾中“拆分窗口”,在”生成的类“处选择“CScrollView”作为基类。
在ChildFrm.cpp文件中,修改OnCreateClient函数
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
//return m_wndSplitter.Create(this,
// 2, 2,// TODO: 调整行数和列数
// CSize(10, 10),// TODO: 调整最小窗格大小
// pContext);
CRect rc;
// 获取框架窗口客户区的CRect对象
GetClientRect(&rc);
// 创建静态分割窗口,两行一列
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
// 创建上面窗格中的视图
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDrawOnPicView), CSize(4 * rc.Width()/5, rc.Height()/2), pContext))
return FALSE;
// 创建下面窗格中的视图
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CDrawOnPicView), CSize(rc.Width()/5, rc.Height()/2), pContext))
return FALSE;
return TRUE;
}
在ChildFrm.cpp文件中添加#include "XXXView.h",在XXXView.h文件中添加#include "XXXDoc.h"。
在资源视图中的Menu文件夹里的IDR_XXXTYPE,添加“载入”菜单,并在该菜单下添加“位图”子菜单,在“属性”中将“位图“子菜单的ID改为ID_BITMAP,右键“位图”子菜单,添加事件处理程序:
void CDrawOnPicView::OnBitmap()
{
Filename = BootOpenDialog();
if(Filename != "")
isLoaded = true;
Invalidate(true);
}
XXXView.h中添加变量:
public:
CString Filename;
BITMAP bmp;
HDC MemDC;//一个环境设备
int BmpWidth;
int BmpHeight;
bool isLoaded;
CString BootOpenDialog();
在XXXView.cpp文件中添加:
构造函数:
CDrawOnPicView::CDrawOnPicView()
{
// TODO: 在此处添加构造代码
isLoaded = false;
}
OnDraw函数:
void CDrawOnPicView::OnDraw(CDC* pDC)
{
CDrawOnPicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rect;
GetClientRect(&rect);
MemDC = CreateCompatibleDC(0);//得到一个兼容设备句柄
if(isLoaded == true)
{
HBITMAP bit;//一个位图
bit = (HBITMAP)LoadImage(AfxGetInstanceHandle(), Filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);//导入图片
GetObject(bit, sizeof(BITMAP), &bmp);
BmpWidth = bmp.bmWidth;
BmpHeight = bmp.bmHeight;
TRACE("BmpWidth:%d\n", BmpWidth);
TRACE("BmpHeight:%d\n", BmpHeight);
CSize sizeTotal;
sizeTotal.cx = BmpWidth;
sizeTotal.cy = BmpHeight;
TRACE("sizeTotal.cx = %d, sizeTotal.cy = %d\n", sizeTotal.cx, sizeTotal.cy);
SetScrollSizes(MM_TEXT, sizeTotal);
SelectObject(MemDC, bit);//把图片选择设备
}
CClientDC dc(this);//取得dc
int VertPos = this->GetScrollPos(SB_VERT);
TRACE("VertPos is %d\n", VertPos);
int HorzPos = this->GetScrollPos(SB_HORZ);
TRACE("HorzPos is %d\n", HorzPos);
BitBlt(dc.m_hDC, 0, 0, BmpWidth, BmpHeight, MemDC, HorzPos, VertPos, SRCCOPY);
}
OnInitialUpdate函数:
void CDrawOnPicView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
添加新函数:BootOpenDialog()
CString CDrawOnPicView::BootOpenDialog() //返回选择的文件名称
{
CString strFile = _T("");
CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe bmp files (*.bmp)|*.bmp||"), NULL);
if (dlgFile.DoModal())
{
strFile = dlgFile.GetPathName();
}
return strFile;
}