p@Blog

一坨等待回溯的灵魂

用户操作
[即时聊天] [发私信] [加为好友]
p-spriteID:psprite
25822次访问,排名5000,好友0人,关注者3人。
胆小,脸薄,总无聊
psprite的文章
原创 26 篇
翻译 0 篇
转载 15 篇
评论 31 篇
p-sprite的公告
p、范嵩、p-sprite、psprite、小p我不是唯心主义者,但我相信意识的力量,它具有无与伦比的魅力,当人们为物质所束缚时,你是否尝试超越思想的桎梏在脑海中尽情欣赏你所存在的这个世界!!
  个人特点:胆小,脸薄,总无聊。个人特长:装登,拆台,整景。 QQ:P-Sprite(20331724)


最近评论
hebe:这个图像是在变的,有时候左脚支撑,有时候右脚支撑
angel_heart_cn:我成功了,呵呵!!!
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
mi:Happiness will be always with you
wangjj_016:网站:http://blog.csdn.net/wangjj_016/注册被拒了,google不让在博客里加广告了
文章分类
收藏
相册
友情链接
P@百度
pudn联合开发网
The Code Project
专业电脑电子书库(RSS)
新水木社区
玉山天空
珍藏Blog
陆其明的专栏(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 显示大位图时滚动条应用的小技巧收藏

新一篇: 把qq信息用语音读出的几个问题 | 旧一篇:  梦 邃

在向指定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);

 

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

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

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

发表于 @ 2004年09月13日 20:36:00|评论(loading...)|收藏

新一篇: 把qq信息用语音读出的几个问题 | 旧一篇:  梦 邃

评论:没有评论。

发表评论  


登录
Csdn Blog version 3.1a
Copyright © p-sprite