显示大位图时滚动条应用的小技巧

原创 2004年09月13日 20:36:00

在向指定dc动态打开一位图文件时,经常会遇到图片大小超过指定区域的问题,在保持位图文件不失真的情况下,最好的方式是使用滚动条进行指定区域的显示处理。根据位图的大小不同会出现四中情况,即:图片长和宽是否小于指定区域的长宽。处理的代码如下:

 CWnd *hwnd = GetDlgItem(IDC_WIN);
  hDesDC = hwnd->GetDC()->m_hDC;
  hSrcDC = CreateCompatibleDC(hDesDC);
  hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),dlg.GetPathName          (),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
  
  GetObject(hBitmap, sizeof BITMAP, &bm);
  SelectObject(hSrcDC, hBitmap);
  hwnd->GetClientRect(&rect);
  bm.bmHeight,+SRCCOPY);
   if(bm.bmWidth>rect.right)
   {
        if(bm.bmHeight >rect.bottom )
       {
            restH=bm.bmHeight-rect.bottom ;
            restW=bm.bmWidth-rect.right ;
       }
       else
       {
            restW=bm.bmWidth-rect.right ;
            restH=0;   
       }
   }
  else
  {
         if(bm.bmHeight >rect.bottom )
         {
         restH=bm.bmHeight-rect.bottom ;
         restW=0;
         }
        else
        {
        restW=0;
        restH=0;
        }
   }
   m_ScrollBar2.SetScrollRange(0,restW);
   m_ScrollBar1.SetScrollRange(0,restH);

 然后在相应的OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

                以及OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

加入

 

switch(nSBCode)

{
     case SB_LINERIGHT:
     {
     if(Pos2      {
         Pos2+=5;
         m_ScrollBar2.SetScrollPos(Pos2);
         BitBlt(hDesDC, 0, 0,rect.right,rect.bottom,hSrcDC,
            0+Pos2, 0+Pos1,SRCCOPY);
      }
      else if(Pos2 != restW)//位移不到5的距离
      {
          m_ScrollBar2.SetScrollPos(restW-Pos2+5);
          BitBlt(hDesDC, 0, 0,rect.right,rect.bottom,hSrcDC,
          0+Pos2, 0+Pos1,SRCCOPY);

         Pos2 = restW;
       }
   
       }
       break;
      case SB_LINELEFT:
      {
      if(Pos2 >0)
      {
         Pos2-=5;
         m_ScrollBar2.SetScrollPos(SB_HORZ,Pos2);
         BitBlt(hDesDC, 0, 0,rect.right,rect.bottom,hSrcDC,
           0+Pos2, 0+Pos1,SRCCOPY);

      }
      else if(Pos2 != 0)
      {
         m_ScrollBar2.SetScrollPos(restW-Pos2-5);
         BitBlt(hDesDC, 0, 0,rect.right,rect.bottom,hSrcDC,
            0+Pos2, 0+Pos1,SRCCOPY);

         Pos2 = 0;
       }
       }
       break;
       case SB_THUMBTRACK:
       {
       Pos2 = nPos;
       m_ScrollBar2.SetScrollPos(Pos2);
       BitBlt(hDesDC, 0, 0,rect.right,rect.bottom,hSrcDC,
       0+Pos2, 0+Pos1,SRCCOPY);


       }
       break;

}
 
 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

 

另一个方向滚动条,可以模仿上述代码来填写

另外对于图象的刷新还可以辅助以消息触发机制,或者定时重刷指定区域,这样可以得到细腻的转变效果。

代码写的很粗糙,主要就是希望大家把一些小技巧拿出来一起讨论,希望大家一同进步。希望各位老师多多指教。

MFC使用滚动条显示大图片

本文提供两种方法来解决MFC中使用滚动条来显示大图片的问题
  • yushitou27
  • yushitou27
  • 2016年01月04日 16:40
  • 2263

VC/MFC加滚动条显示大图片SetScrollRange()、SetScrollInfo()两种思路实现及其两者优劣比较

OnHScroll和OnVScroll只提供16位的位置数据。GetScrollInfo和SetScrollInfo提供32位的滚动条位置数据。因此,一个应用程序在处理GetScrollInfo或Se...
  • Vivid_Song
  • Vivid_Song
  • 2015年11月18日 13:52
  • 2168

大数据常用技巧之位图法

大数据常用技巧之位图法介绍位图的基本概念是用一个位(bit)来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间。举个具体的例子,在Java中一般一个int数字要占用32位,如...
  • u013291394
  • u013291394
  • 2015年12月07日 21:27
  • 2920

大数据之位图法简单实现

所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 举个栗子,给定40亿个整型数据,现在给一个整数,要求判断这个数在不...
  • Korey_sparks
  • Korey_sparks
  • 2016年09月12日 13:55
  • 378

Linux应用编程之图片浏览APP实现

目前只支持jpeg格式的图片,需要显示其他图片的在main函数中添加就可以。解析出图片头字节,根据字节判断是属于什么格式的图片。 有四个文件:main.c  input_manager.c   to...
  • qq_21792169
  • qq_21792169
  • 2016年05月26日 12:51
  • 14005

opencv中创建滚动条浏览大图

// Image_ScrollBar.cpp : Defines the entry point for the console application. // #include "std...
  • yexiaozi_007
  • yexiaozi_007
  • 2014年04月21日 13:52
  • 3002

全屏显示一张图片,不显示滚动条

niday html,body,.bg{                                             //此处一定要加...
  • cometwo
  • cometwo
  • 2015年12月16日 22:21
  • 2222

MFC之picture控件滚动条的实现

直接上主要代码啦
  • chongshangyunxiao321
  • chongshangyunxiao321
  • 2016年04月09日 13:12
  • 3000

MFC中位图显示函数

点击打开链接 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复扫描屏幕70次。   理解调色板 有一个长宽各...
  • rayna00
  • rayna00
  • 2016年06月20日 17:21
  • 629

MFC如何显示位图

1. 资源文件中加载 bmp 2.1. 静态加载图片  在属性下设置为如下即可 2.2 动态加载图片 其中要在控件中添加CStatic变量,并且属性设置为如下 ...
  • u011258240
  • u011258240
  • 2015年12月17日 09:51
  • 328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:显示大位图时滚动条应用的小技巧
举报原因:
原因补充:

(最多只允许输入30个字)