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

转自:http://blog.csdn.net/zhoujielunzhimi/article/details/7963421

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

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

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

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

[cpp]  view plain  copy
  1. #pragma once  
  2. #include "stdafx.h"  
  3. #include <atlscrl.h>  
  4.   
  5. class BmpView : public CScrollWindowImpl<BmpView>  
  6. {  
  7. protected:  
  8.     BEGIN_MSG_MAP(BmpView)  
  9.         CHAIN_MSG_MAP(CScrollWindowImpl<BmpView>)  
  10.         MSG_WM_ERASEBKGND(OnEraseBkgnd)  
  11.     END_MSG_MAP()  
  12. public:  
  13.     BOOL OnEraseBkgnd(CDCHandle)  
  14.     {  
  15.         return TRUE;  
  16.     }  
  17.     void DoPaint(CDCHandle dc)  
  18.     {  
  19.         RECT rc = { 0,0,m_sizeAll.cx,m_sizeAll.cy };      
  20.         if(bmp.IsNull())  
  21.         {  
  22.             CBrush br;  
  23.             br.CreateSolidBrush(RGB(215,240,215));  
  24.             dc.FillRect(&rc,br);  
  25.         }  
  26.         else  
  27.         {  
  28.             CDC mem;  
  29.             mem.CreateCompatibleDC(dc);  
  30.             CBitmap old = mem.SelectBitmap(bmp);  
  31.             dc.BitBlt(0,0,rc.right,rc.bottom,mem,0,0,SRCCOPY);  
  32.             mem.SelectBitmap(old);  
  33.         }  
  34.     }  
  35.     void SetBmp(HBITMAP bit)  
  36.     {  
  37.         bmp = bit;  
  38.         SIZE sz;  
  39.         bmp.GetSize(sz);  
  40.         SetScrollSize((int)sz.cx,(int)sz.cy);  
  41.     }  
  42. private:  
  43.     CBitmapHandle bmp;  
  44. };  
  45.   
  46. class CMainDlg : public CDialogImpl<CMainDlg>  
  47. {  
  48. protected:  
  49.     BEGIN_MSG_MAP(CMainDlg)  
  50.         MSG_WM_INITDIALOG(OnInitDialog)  
  51.         MSG_WM_CLOSE(OnClose)  
  52.         MSG_WM_GETMINMAXINFO(OnMinMaxInfo)  //限制窗口的大小  
  53.         MSG_WM_SIZE(OnSize)  
  54.     END_MSG_MAP()  
  55. public:  
  56.     BOOL OnInitDialog(CWindow,LPARAM)  
  57.     {  
  58.         CenterWindow();  
  59.   
  60.         CIcon icon;  
  61.         icon.LoadIcon(IDI_ICON_NTES);  
  62.         SetIcon(icon,TRUE);  
  63.         SetIcon(icon,FALSE);  
  64.   
  65.         CRect rc;  
  66.         GetClientRect(&rc);  
  67.         bv.Create(m_hWnd,rc,NULL,WS_CHILD|WS_VISIBLE);  
  68.         bmp.LoadBitmap(IDB_BMP_ANGLE);  
  69.         bv.SetBmp(bmp.m_hBitmap);  
  70.   
  71.         return TRUE;  
  72.     }  
  73.     void OnClose()  
  74.     {  
  75.         EndDialog(0);  
  76.     }  
  77.     void OnMinMaxInfo(LPMINMAXINFO lp)  
  78.     {  
  79.         lp->ptMinTrackSize = CPoint(300,300);  
  80.     }  
  81.     void OnSize(UINT,CSize sz)  
  82.     {  
  83.         bv.MoveWindow(0,0,sz.cx,sz.cy);  
  84.     }  
  85. private:  
  86.     BmpView bv;  
  87.     CBitmap bmp;  
  88. public:  
  89.     enum { IDD = IDD_MAINDLG };  
  90. };  

效果图如下:

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值