之前我也寫了一篇用滾動窗口類顯示圖片的博客:
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 };
};
效果圖如下:
缺點:調整窗口大小時,圖片會有閃爍。已經阻止了擦除背景,爲什麼還會有閃爍呢?