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

来源:互联网 发布:直筒和滚筒洗衣机 知乎 编辑:程序博客网 时间:2024/06/05 22:53

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

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

效果图如下:

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

原创粉丝点击