转自:http://blog.csdn.net/zhoujielunzhimi/article/details/7963421
之前我也写了一篇用滚动窗口类显示图片的博客:
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 };
- };
效果图如下:
缺点:调整窗口大小时,图片会有闪烁。已经阻止了擦除背景,为什么还会有闪烁呢?