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

首先创建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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值