DISP.C
上传用户:s6549606
上传日期:2015-11-11
资源大小:12002k
文件大小:8k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. #include <windows.h>          
  2. ////////////////////////////////////////////////////////////////
  3. #define SCROLL_RATIO    50
  4. //---------------------------------------------------------------------
  5. void FitNewSize (HWND hWnd);
  6. void SizeProc (HWND hWnd);
  7. void ScrollProc (HWND hWnd, int message, WORD wPos, WORD wScrollType);
  8. void DisProc(HWND hWnd,HGLOBAL hbi);
  9. //---------------------------------------------------------------------
  10. extern int imgheight,imgwidth;
  11. extern BOOL HSCROLL,VSCROLL;
  12. //---------------------------------------------------------------------
  13. void FitNewSize (HWND hWnd)
  14. {
  15. RECT DeskRect,rect;
  16. int  NewX,NewY,NewWidth,NewHeight;
  17. int  HBorder,VBorder;
  18. POINT pt;
  19. int  cxWindow,cyWindow,cxRange,cyRange;
  20. GetWindowRect(GetDesktopWindow(), &DeskRect);
  21. HBorder=GetSystemMetrics (SM_CXBORDER)/2;
  22. VBorder=GetSystemMetrics (SM_CYBORDER)/2+GetSystemMetrics (SM_CYMENU)+GetSystemMetrics (SM_CYCAPTION);
  23. if((imgwidth+HBorder)<(DeskRect.right-DeskRect.left))
  24. {
  25. NewWidth=imgwidth+HBorder;
  26. NewX=( (DeskRect.right-DeskRect.left) - (imgwidth+HBorder) ) /2;
  27. HSCROLL=FALSE;
  28. }
  29. else
  30. {
  31. NewX=(DeskRect.right-DeskRect.left)/10;
  32. NewWidth=NewX*8;
  33. HSCROLL=TRUE;
  34. }
  35. if((imgheight+VBorder)<(DeskRect.bottom-DeskRect.top))
  36. {
  37. NewHeight=imgheight+VBorder;
  38. NewY=( (DeskRect.bottom-DeskRect.top) - (imgheight+VBorder) ) /2;
  39. VSCROLL=FALSE;
  40. }
  41. else
  42. {
  43. NewY=(DeskRect.bottom-DeskRect.top)/10;
  44. NewHeight=NewY*8;
  45. VSCROLL=TRUE;
  46. }
  47. if(HSCROLL)
  48. {
  49. NewHeight+= GetSystemMetrics (SM_CYHSCROLL);
  50. NewY-=GetSystemMetrics (SM_CYHSCROLL)/2;
  51. }
  52. if(VSCROLL)
  53. {
  54. NewWidth+= GetSystemMetrics (SM_CXVSCROLL);
  55. NewX-=GetSystemMetrics (SM_CXVSCROLL)/2;
  56. }
  57. SendMessage(GetDesktopWindow(),WM_PAINT,0,0);
  58. GetWindowRect(hWnd,(LPRECT)&DeskRect);
  59. pt.x=DeskRect.left-1;
  60. pt.y=DeskRect.top-1;
  61. MoveWindow(hWnd,NewX,NewY,NewWidth,NewHeight,TRUE);
  62. SendMessage(WindowFromPoint(pt),WM_PAINT,0,0);
  63. GetClientRect(hWnd,(LPRECT)&rect);
  64.    
  65.     cxWindow = rect.right - rect.left;
  66.     cyWindow = rect.bottom - rect.top;
  67.    cxRange =  imgwidth - cxWindow - 1;
  68.    cyRange =  imgheight - cyWindow - 1;
  69.   
  70. if(HSCROLL)
  71. {
  72. SetScrollRange (hWnd, SB_HORZ, 0, cxRange, FALSE);
  73. SetScrollPos(hWnd,SB_HORZ,0,TRUE);
  74. }
  75. else
  76. SetScrollRange (hWnd, SB_HORZ, 0, 0, FALSE);
  77. if(VSCROLL)
  78. {
  79. SetScrollRange (hWnd, SB_VERT, 0, cyRange, FALSE);
  80. SetScrollPos(hWnd,SB_VERT,0,TRUE);
  81. }
  82. else
  83. SetScrollRange (hWnd, SB_VERT, 0, 0, FALSE);
  84. }
  85. ////////////////////////////////////////////////////////////////////////
  86. /*
  87. void SizeProc(HWND hWnd)
  88. {
  89. RECT ClientRect;
  90. BOOL scrolled=FALSE;
  91. GetClientRect (hWnd, (LPRECT)&ClientRect);
  92. if(imgwidth<=(ClientRect.right-ClientRect.left))
  93. SetScrollRange (hWnd, SB_HORZ, 0, 0, TRUE);
  94. else
  95. {
  96. SetScrollRange (hWnd, SB_HORZ, 0, 100, TRUE);
  97. scrolled=TRUE;
  98. }
  99. if(imgheight<=(ClientRect.bottom-ClientRect.top))
  100. SetScrollRange (hWnd, SB_VERT, 0, 0, TRUE);
  101. else
  102. {
  103. SetScrollRange (hWnd, SB_VERT, 0, 100, TRUE);
  104. scrolled=TRUE;
  105. }
  106. if(scrolled)
  107. {
  108. InvalidateRect(hWnd,NULL,FALSE);
  109. UpdateWindow(hWnd);
  110. }
  111. }
  112. */
  113. ///////////////////////////////////////////////////////////////////////////
  114. void ScrollProc (HWND hWnd, int message, WORD wPos, WORD wScrollType)
  115. {
  116. int  xBar;
  117.     int  nMin;
  118.     int  nMax;
  119.     int  dx;
  120.     int  nOneUnit;
  121.     int  cxClient;
  122.     int  nHorzOrVert;
  123.     RECT rect;
  124.     
  125.     GetClientRect (hWnd, &rect);
  126.     if (message == WM_HSCROLL)
  127.      {
  128.        nHorzOrVert = SB_HORZ;
  129.        cxClient    = rect.right - rect.left;
  130.        }
  131.     else
  132.      {
  133.        nHorzOrVert = SB_VERT;
  134.        cxClient    = rect.bottom - rect.top;
  135.        }
  136.     nOneUnit = cxClient / SCROLL_RATIO;
  137.     if (!nOneUnit)
  138.      nOneUnit = 1;
  139.     xBar = GetScrollPos (hWnd, nHorzOrVert);
  140.     GetScrollRange (hWnd, nHorzOrVert, &nMin, &nMax);   
  141.     switch (wScrollType)
  142.      {
  143.        case SB_LINEDOWN:             // One line right.
  144.          dx = nOneUnit;
  145.           break;
  146.        case SB_LINEUP:               // One line left.
  147.           dx = -nOneUnit;
  148.           break;
  149.        case SB_PAGEDOWN:             // One page right.
  150.          dx = cxClient/4;
  151.           break;
  152.        case SB_PAGEUP:               // One page left.
  153.          dx = -cxClient/4;
  154.           break;
  155.        case SB_THUMBPOSITION:        // Absolute position.     
  156.           dx = wPos - xBar;
  157.           break;
  158.        default:                      // No change.
  159.          dx = 0;
  160.           break;
  161.        }
  162. if (dx)
  163.      {
  164.        xBar += dx;
  165.        if (xBar < nMin)
  166.          {
  167.           dx  -= xBar-nMin;
  168.           xBar = nMin;
  169.           }
  170.        if (xBar > nMax)
  171.          {
  172.           dx  -= xBar - nMax;
  173.           xBar = nMax;
  174.           }
  175.        if (dx)
  176.          {
  177.           SetScrollPos (hWnd, nHorzOrVert, xBar, TRUE);
  178.           if (nHorzOrVert == SB_HORZ)
  179.              ScrollWindow (hWnd, -dx, 0, NULL, NULL);
  180.           else
  181.              ScrollWindow (hWnd, 0, -dx , NULL, NULL);
  182.             
  183.           UpdateWindow (hWnd);
  184.           }
  185.        }
  186. }
  187. //---------------------------------------------------------------------
  188. void DisProc(HWND hWnd,HGLOBAL hbi)
  189. {
  190. HDC         hDC;
  191.     PAINTSTRUCT ps;
  192.     int         xScroll, yScroll;
  193.     int         dx,dy;
  194.     RECT        rectClient, rc;
  195.     LPSTR       lpDIBHdr, lpDIBBits;   
  196.     if (!hbi)
  197.      return;
  198.    hDC      = BeginPaint (hWnd, &ps);
  199.    
  200.     xScroll  = GetScrollPos  (hWnd, SB_HORZ);
  201.     yScroll  = GetScrollPos  (hWnd, SB_VERT);
  202.     GetClientRect (hWnd, &rectClient);
  203.     rc.left   = xScroll;
  204.     rc.top    = yScroll;
  205.     rc.right  = xScroll + rectClient.right - rectClient.left;
  206.     rc.bottom = yScroll + rectClient.bottom - rectClient.top;
  207.    
  208.     if (rc.right > imgwidth)
  209.        {
  210.     dx = imgwidth - rc.right;
  211.         rc.right += dx;
  212.         rectClient.right+=dx;
  213.         }
  214.     if (rc.bottom > imgheight)
  215.        {
  216.         dy = imgheight - rc.bottom;
  217.        rc.bottom += dy;
  218.         rectClient.bottom+=dy;
  219.        }
  220. lpDIBHdr  = GlobalLock (hbi);
  221.     lpDIBBits = lpDIBHdr+sizeof(BITMAPINFOHEADER);
  222. SetStretchBltMode (hDC, COLORONCOLOR);
  223.  
  224.     SetDIBitsToDevice (hDC,
  225.         rectClient.left,
  226.         rectClient.top,
  227.         rectClient.right-rectClient.left,
  228.         rectClient.bottom-rectClient.top,
  229.         rc.left,
  230.         imgheight-rc.bottom,
  231.         0,
  232.         imgheight,
  233.                        (char far *)lpDIBBits,
  234.                        (LPBITMAPINFO) lpDIBHdr,
  235.                        DIB_RGB_COLORS);
  236. GlobalUnlock (hbi);
  237.     EndPaint (hWnd, &ps);
  238. /*
  239. HDC         hDC;
  240.     PAINTSTRUCT ps;
  241.     int         xScroll, yScroll;
  242.     RECT        rectClient, rc;
  243.     LPSTR       lpDIBHdr, lpDIBBits;
  244.     int         rectw,recth;
  245.     if (!hbi)
  246.      return;
  247.     
  248. xScroll=yScroll=0;
  249. GetClientRect (hWnd, &rectClient);
  250. rectw=rectClient.right-rectClient.left;
  251. recth=rectClient.bottom-rectClient.top;
  252.    hDC      = BeginPaint (hWnd, &ps);
  253.    
  254.     if(HSCROLL)
  255.     {
  256.     xScroll  = GetScrollPos  (hWnd, SB_HORZ);
  257.     }
  258.    
  259.     if(VSCROLL)
  260.     {
  261.     yScroll  = GetScrollPos  (hWnd, SB_VERT);
  262.     }
  263.     rc.right  =  rc.left+rectw;
  264.     rc.bottom =  rc.top+recth;
  265. lpDIBHdr  = GlobalLock (hbi);
  266.     lpDIBBits = lpDIBHdr+sizeof(BITMAPINFOHEADER);
  267. SetStretchBltMode (hDC, COLORONCOLOR);
  268.  
  269.     SetDIBitsToDevice (hDC,
  270.         rectClient.left,
  271.         rectClient.top,
  272.         rectClient.right-rectClient.left,
  273.         rectClient.bottom-rectClient.top,
  274.         rc.left,
  275.         imgheight-rc.bottom,
  276.         0,
  277.         imgheight,
  278.                        (char far *)lpDIBBits,
  279.                        (LPBITMAPINFO) lpDIBHdr,
  280.                        DIB_RGB_COLORS);
  281. GlobalUnlock (hbi);
  282.     EndPaint (hWnd, &ps);
  283. */   
  284. }