您的位置:首页 > 其它

在多文档中分割窗口添加滚动条并载入图片

2015-10-10 11:14 399 查看
首先创建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;

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