在WTL中利用滾動窗口類CScrollWindowImpl顯示BMP圖片

之前我也寫了一篇用滾動窗口類顯示圖片的博客:

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 };
};

效果圖如下:

缺點:調整窗口大小時,圖片會有閃爍。已經阻止了擦除背景,爲什麼還會有閃爍呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章