在WTL中利用滚动窗口类CScrollWindowImpl显示BMP图片

1 篇文章 0 订阅
1 篇文章 0 订阅

之前我也写了一篇用滚动窗口类显示图片的博客:

http://blog.csdn.net/zhoujielunzhimi/article/details/7899735

本文与之不同,上面的这个滚动窗口具有通用性,比如滚动窗口可以装载控件,但是比较繁琐的是滚动参数需要自己去控制。

下面要介绍的是利用WTL的类CScrollWindowImpl来完成,这个类只是用来显示图片,对于控件暂不知(个人觉得不支持)。

#pragma once
#include "stdafx.h"
#include <atlscrl.h>

class BmpView : public CScrollWindowImpl<BmpView>
{
protected:
	BEGIN_MSG_MAP(BmpView)
		CHAIN_MSG_MAP(CScrollWindowImpl<BmpView>)
		MSG_WM_ERASEBKGND(OnEraseBkgnd)
	END_MSG_MAP()
public:
	BOOL OnEraseBkgnd(CDCHandle)
	{
		return TRUE;
	}
	void DoPaint(CDCHandle dc)
	{
		RECT rc = { 0,0,m_sizeAll.cx,m_sizeAll.cy };	
		if(bmp.IsNull())
		{
			CBrush br;
			br.CreateSolidBrush(RGB(215,240,215));
			dc.FillRect(&rc,br);
		}
		else
		{
			CDC mem;
			mem.CreateCompatibleDC(dc);
			CBitmap old = mem.SelectBitmap(bmp);
			dc.BitBlt(0,0,rc.right,rc.bottom,mem,0,0,SRCCOPY);
			mem.SelectBitmap(old);
		}
	}
	void SetBmp(HBITMAP bit)
	{
		bmp = bit;
		SIZE sz;
		bmp.GetSize(sz);
		SetScrollSize((int)sz.cx,(int)sz.cy);
	}
private:
	CBitmapHandle bmp;
};

class CMainDlg : public CDialogImpl<CMainDlg>
{
protected:
	BEGIN_MSG_MAP(CMainDlg)
		MSG_WM_INITDIALOG(OnInitDialog)
		MSG_WM_CLOSE(OnClose)
		MSG_WM_GETMINMAXINFO(OnMinMaxInfo)	//限制窗口的大小
		MSG_WM_SIZE(OnSize)
	END_MSG_MAP()
public:
	BOOL OnInitDialog(CWindow,LPARAM)
	{
		CenterWindow();

		CIcon icon;
		icon.LoadIcon(IDI_ICON_NTES);
		SetIcon(icon,TRUE);
		SetIcon(icon,FALSE);

		CRect rc;
		GetClientRect(&rc);
		bv.Create(m_hWnd,rc,NULL,WS_CHILD|WS_VISIBLE);
		bmp.LoadBitmap(IDB_BMP_ANGLE);
		bv.SetBmp(bmp.m_hBitmap);

		return TRUE;
	}
	void OnClose()
	{
		EndDialog(0);
	}
	void OnMinMaxInfo(LPMINMAXINFO lp)
	{
		lp->ptMinTrackSize = CPoint(300,300);
	}
	void OnSize(UINT,CSize sz)
	{
		bv.MoveWindow(0,0,sz.cx,sz.cy);
	}
private:
	BmpView bv;
	CBitmap bmp;
public:
	enum { IDD = IDD_MAINDLG };
};

效果图如下:

缺点:调整窗口大小时,图片会有闪烁。已经阻止了擦除背景,为什么还会有闪烁呢?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值