在向指定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) { Pos2 = restW; } Pos2 = 0;
} |
另一个方向滚动条,可以模仿上述代码来填写
另外对于图象的刷新还可以辅助以消息触发机制,或者定时重刷指定区域,这样可以得到细腻的转变效果。
代码写的很粗糙,主要就是希望大家把一些小技巧拿出来一起讨论,希望大家一同进步。希望各位老师多多指教。