找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 244|回复: 0

Windows界面编程第十三篇 位图显示特效合集

[复制链接]

52

主题

62

回帖

0

积分

版主

积分
0
发表于 2013-10-11 17:24:45 | 显示全部楼层 |阅读模式
[bgcolor=#ffffff]转载请标明出处,原文地址:[/bgcolor][bgcolor=#ffffff]http://blog.csdn.net/morewindows/article/details/8696730[/bgcolor]
[bgcolor=#ffffff]前面的四篇已经介绍了位图的[/bgcolor]交错效果[bgcolor=#ffffff][/bgcolor]百叶窗效果[bgcolor=#ffffff][/bgcolor]随机积木效果[bgcolor=#ffffff][/bgcolor]飞入效果与伸展效果[bgcolor=#ffffff][/bgcolor]
[bgcolor=#ffffff]下面用一个程序将展示这些效果。这里给出主要代码[/bgcolor]
[bgcolor=#ffffff]代码中的DragAcceptFiles可以参考《Windows界面编程第七篇文件拖拽(文件拖放)》.[/bgcolor][bgcolor=#ffffff]主要是为了能将位图文件拖入到窗口中。[/bgcolor]
[bgcolor=#ffffff][/bgcolor]
  1. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.     static int   s_nShow;
  4.     static HDC   s_hdcMem;
  5.     static int   s_nWidth, s_nHeight;
  6.     switch (message)
  7.     {
  8.     case WM_CREATE:
  9.         {
  10.             DragAcceptFiles(hwnd, TRUE);   
  11.             // 加载位图
  12.             HBITMAP hBitmap;  
  13.             hBitmap = (HBITMAP)LoadImage(NULL, "107.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);  
  14.             if (hBitmap == NULL)  
  15.             {  
  16.                 MessageBox(hwnd, "LoadImage failed", "Error", MB_ICONERROR);  
  17.                 exit(0);  
  18.             }
  19.             // 位图HDC
  20.             HDC hdc = GetDC(hwnd);
  21.             s_hdcMem = CreateCompatibleDC(hdc);
  22.             SelectObject(s_hdcMem, hBitmap);
  23.             ReleaseDC(hwnd, hdc);
  24.             // 计算位图宽高
  25.             BITMAP bm;
  26.             GetObject(hBitmap, sizeof(bm), &bm);
  27.             s_nWidth = bm.bmWidth;
  28.             s_nHeight = bm.bmHeight;
  29.             
  30.             s_nShow = 0;
  31.         }
  32.         return 0;
  33.     case WM_KEYDOWN:   
  34.         switch (wParam)  
  35.         {  
  36.         case VK_ESCAPE: //按下Esc键时退出   
  37.             SendMessage(hwnd, WM_DESTROY, 0, 0);  
  38.             return 0;  
  39.         }  
  40.         break;
  41.     case WM_PAINT:
  42.         {
  43.             HDC             hdc;  
  44.             PAINTSTRUCT     ps;  
  45.             hdc = BeginPaint(hwnd, &ps);
  46.             switch (s_nShow)
  47.             {
  48.             case 0:
  49.                 BitBlt(hdc, 0, 0, s_nWidth, s_nHeight, s_hdcMem, 0, 0, SRCCOPY);
  50.                 break;
  51.             
  52.                 // 水平交错
  53.             case 1:
  54.                 AnimateDraw_StaggeredHorizontal(hdc, s_hdcMem, s_nWidth, s_nHeight);
  55.                 break;
  56.                 // 垂直交错
  57.             case 2:
  58.                 AnimateDraw_StaggeredVertical(hdc, s_hdcMem, s_nWidth, s_nHeight);
  59.                 break;
  60.                
  61.                 // 水平百叶窗
  62.             case 3:
  63.                 AnimateDraw_JalousieHorizontal(hdc, s_hdcMem, s_nWidth, s_nHeight);
  64.                 break;
  65.                 // 垂直百叶窗
  66.             case 4:
  67.                 AnimateDraw_JalousieVertical(hdc, s_hdcMem, s_nWidth, s_nHeight);
  68.                 break;
  69.                
  70.                 // 随机积木
  71.             case 5:
  72.                 AnimateDraw_RandomBlocks(hdc, s_hdcMem, s_nWidth, s_nHeight);
  73.                 break;
  74.                
  75.                 // 飞入 从上往下
  76.             case 6:
  77.                 AnimateDraw_FlyingTopToBottom(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);
  78.                 break;
  79.                 // 飞入 从下往上
  80.             case 7:
  81.                 AnimateDraw_FlyingBottomToTop(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);
  82.                 break;
  83.                 // 飞入 从左往右        
  84.             case 8:
  85.                 AnimateDraw_FlyingLeftToRight(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);
  86.                 break;
  87.                 // 飞入 从右往左
  88.             case 9:
  89.                 AnimateDraw_FlyingRightToLeft(hdc, s_hdcMem, s_nWidth, s_nHeight, 2, FALSE);
  90.                 break;
  91.                 // 伸展 从上往下
  92.             case 10:
  93.                 AnimateDraw_FlyingTopToBottom(hdc, s_hdcMem, s_nWidth, s_nHeight);
  94.                 break;
  95.                 // 伸展 从下往上
  96.             case 11:
  97.                 AnimateDraw_FlyingBottomToTop(hdc, s_hdcMem, s_nWidth, s_nHeight);
  98.                 break;
  99.                 // 伸展 从左往右        
  100.             case 12:
  101.                 AnimateDraw_FlyingLeftToRight(hdc, s_hdcMem, s_nWidth, s_nHeight);
  102.                 break;
  103.                 // 伸展 从右往左
  104.             case 13:
  105.                 AnimateDraw_FlyingRightToLeft(hdc, s_hdcMem, s_nWidth, s_nHeight);
  106.                 break;
  107.             }
  108.             if (s_nShow != 0)
  109.             {
  110.                 s_nShow = 0;
  111.                 InvalidateRect(hwnd, NULL, FALSE);
  112.             }
  113.             EndPaint(hwnd, &ps);
  114.         }
  115.         return 0;
  116.     case WM_COMMAND:
  117.         if (LOWORD(wParam) >= 40001 && LOWORD(wParam) <= 40013)
  118.         {
  119.             s_nShow = LOWORD(wParam) - 40000;
  120.             InvalidateRect(hwnd, NULL, TRUE);
  121.             return 0;
  122.         }
  123.         break;
  124.         // 文件拖拽第三步 DragQueryFile and DragQueryFile
  125.     case WM_DROPFILES:
  126.         {
  127.             HDROP hDrop = (HDROP)wParam;
  128.             UINT nFileNum = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); // 拖拽文件个数
  129.             char strFileName[MAX_PATH];
  130.             DragQueryFile(hDrop, 0, strFileName, MAX_PATH);//获得拖曳的文件名
  131.             DragFinish(hDrop);      //释放hDrop
  132.             DeleteDC(s_hdcMem);
  133.             // 加载位图
  134.             HBITMAP hBitmap;  
  135.             hBitmap = (HBITMAP)LoadImage(NULL, strFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);  
  136.             // 位图HDC
  137.             HDC hdc = GetDC(hwnd);
  138.             s_hdcMem = CreateCompatibleDC(hdc);
  139.             SelectObject(s_hdcMem, hBitmap);
  140.             ReleaseDC(hwnd, hdc);
  141.             
  142.             // 计算位图宽高
  143.             BITMAP bm;
  144.             GetObject(hBitmap, sizeof(bm), &bm);
  145.             s_nWidth = bm.bmWidth;
  146.             s_nHeight = bm.bmHeight;
  147.             
  148.             InvalidateRect(hwnd, NULL, TRUE);
  149.         }
  150.         return 0;
  151.     case WM_DESTROY:
  152.         DeleteDC(s_hdcMem);
  153.         PostQuitMessage(0);
  154.         return 0;
  155.     }
  156.     return DefWindowProc(hwnd, message, wParam, lParam);
  157. }
复制代码
[bgcolor=#ffffff]下面是程序所展示的一种显示效果[/bgcolor]
[bgcolor=#ffffff][p_w_upload=1159]
[/bgcolor]

[bgcolor=#ffffff]更多显示效果可以参考前面的[/bgcolor]交错效果[bgcolor=#ffffff][/bgcolor]百叶窗效果[bgcolor=#ffffff][/bgcolor]随机积木效果[bgcolor=#ffffff][/bgcolor]飞入效果与伸展效果[bgcolor=#ffffff]中的示例。[/bgcolor]

[bgcolor=#ffffff]完整的程序在[/bgcolor][bgcolor=#ffffff]http://www.hifyl.com/read.php?tid=2763[/bgcolor]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:41 , Processed in 0.140360 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表