超級哄女孩工具之一千枝會動的玫瑰實現

相信有好多朋友都知道這個程序  但是沒給源碼  呵呵  其實我們可以自己實現的  代碼很簡單(另外這裏 玫瑰並不止1000朵 而是無數朵 因爲簡單起見 沒加玫瑰的統計代碼  呵呵)

現簡單介紹實現過程
首先打開VC++ 6.0  新建個 “Win32 Application” 工程  工程名就叫“Roses”吧
然後要做的是 下載原來的那個“一千枝會動的玫瑰” 然後我們用“eXeScope”提取裏面的6張位圖 和相應的6張掩碼位圖  加入到我們的工程
分別給6張位圖的ID 命名爲:"BM_I0"、"BM_I1"、...、"BM_I5"
給6張位圖對應的掩碼位圖ID 命名爲:"BM_M0"、"BM_M1"、...、"BM_M5"
OK

因爲那個“一千枝會動的玫瑰”運行後按鼠標左鍵 或者 鍵盤退出
所以個人覺得 此程序運行後是最大化的 並且程序的窗口是透明的,
但是窗口透明的話,畫上去的位圖不就看不到了,這個問題也是想了比較久。
最後想了個投機取巧的辦法,給GetDC函數傳NULL,以檢索整個屏幕的設備上下文環境
不知道原程序是如何實現的
這樣再畫圖就沒問題了

好了下面代碼:

  1. /*==============================
  2. Roses.cpp -- 一千朵玫瑰
  3.   (c) Snow-dream, 2008
  4.   QQ:529698939
  5.   E-mail:[email protected]
  6.   編寫日期:2008-12-3
  7.   VC 6.0環境下編譯通過
  8. ===============================*/
  9. #include <windows.h>
  10. #include <stdlib.h>
  11. #include "resource.h"
  12. #define WS_EX_LAYERED 0x00080000
  13. #define LWA_ALPHA     0x00000002
  14. #define LWA_COLORKEY  0x00000001
  15. #define ID_TIMER      1
  16. #define IMGCOUNT      6  //圖片數
  17. //因爲沒有導出SetLayeredWindowAttributes API 所以要我們自己到user32.dll裏搜索
  18. typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)
  19. (HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags) ;
  20. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;
  21. //設置窗口的透明度 hwnd是被設置的窗口 byAlpha是指示了透明度(0完全透明 255完全不透明)
  22. BOOL TransparentWnd(HWND hwnd, BYTE byAlpha)
  23. {
  24.         long lStyle;
  25.         HMODULE hModule;
  26.         BOOL bRet;
  27.         LPFNSETLAYEREDWINDOWATTRIBUTES lpSetLayeredWindowAttributes;
  28.         if(FALSE == IsWindow(hwnd))
  29.         {
  30.                 MessageBox(NULL, TEXT("窗口句柄無效!"), NULL, 0) ;
  31.                 return FALSE ;
  32.         }
  33.         hModule = (HMODULE)LoadLibrary(TEXT("user32.dll")) ;
  34.         if(hModule)
  35.         {
  36.                 lpSetLayeredWindowAttributes = (LPFNSETLAYEREDWINDOWATTRIBUTES)
  37.                         GetProcAddress(hModule, TEXT("SetLayeredWindowAttributes")) ;
  38.                 if(!lpSetLayeredWindowAttributes)
  39.                 {
  40.                         MessageBox(hwnd, TEXT("未找到API SetLayeredWindowAttributes的地址!"),
  41.                                 NULL, MB_OK) ;
  42.                         return FALSE ;
  43.                 }
  44.         }
  45.         lStyle = GetWindowLong(hwnd, GWL_EXSTYLE) ;
  46.         if(!lStyle)
  47.         {
  48.                 MessageBox(hwnd, TEXT("獲取窗口擴展樣式失敗!"), NULL, MB_OK) ;
  49.                 return FALSE ;
  50.         }
  51.         lStyle = lStyle | WS_EX_LAYERED ;
  52.         bRet = SetWindowLong(hwnd, GWL_EXSTYLE, lStyle) ;
  53.         if(!bRet)
  54.         {
  55.                 MessageBox(hwnd, TEXT("設置窗口擴展樣式失敗!"), NULL, MB_OK) ;
  56.                 return FALSE ;
  57.         }
  58.         bRet = lpSetLayeredWindowAttributes(hwnd, 0, byAlpha, LWA_ALPHA) ;
  59.         if(!bRet)
  60.         {
  61.                 MessageBox(hwnd, TEXT("設置窗口透明度失敗!"), NULL, MB_OK) ;
  62.                 return FALSE ;
  63.         }
  64.         RedrawWindow(hwnd, NULL, NULL,
  65.                 RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN) ;
  66.         FreeLibrary(hModule) ;
  67.         return TRUE ;
  68. }
  69. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  70.                     PSTR szCmdLine, int iCmdShow)
  71. {
  72.         static TCHAR szAppName[] = TEXT ("Roses") ;
  73.         HWND     hwnd ;
  74.         MSG      msg ;
  75.         WNDCLASS wndclass ;
  76.         BOOL     bRet ;
  77.         
  78.         wndclass.style          = CS_HREDRAW | CS_VREDRAW ;
  79.         wndclass.lpfnWndProc    = WndProc ;
  80.         wndclass.cbClsExtra     = 0 ;
  81.         wndclass.cbWndExtra     = 0 ;
  82.         wndclass.hInstance      = hInstance ;
  83.         wndclass.hIcon          = LoadIcon (hInstance, szAppName) ;
  84.         wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
  85.         wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  86.         wndclass.lpszMenuName   = NULL ;
  87.         wndclass.lpszClassName  = szAppName ;
  88.         
  89.         if(!RegisterClass (&wndclass))
  90.         {
  91.                 MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;
  92.                 return 0;
  93.         }
  94.         
  95.         srand ((int)GetTickCount()) ; //初始化隨機數發生器
  96.         // 創建主窗口 讓窗口最大化
  97.         hwnd = CreateWindow (szAppName, TEXT ("玫瑰花"),
  98.                 WS_DLGFRAME | WS_POPUP,
  99.                 0, 0,
  100.                 GetSystemMetrics(SM_CXSCREEN),
  101.                 GetSystemMetrics(SM_CYSCREEN),
  102.                 NULL, NULL, hInstance, NULL) ;
  103.     
  104.         TransparentWnd(hwnd, 1) ; //設置窗口透明度
  105.         SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW) ; //窗口置頂
  106.         ShowWindow (hwnd, iCmdShow) ;
  107.         UpdateWindow (hwnd) ;
  108.         
  109.         while ( (bRet = GetMessage (&msg, NULL, 0, 0) ) != 0 )
  110.         {
  111.                 if (bRet == -1)
  112.                 {
  113.                         MessageBox (hwnd, TEXT ("Such code can lead to fatal application errors"),
  114.                                 szAppName, MB_ICONERROR) ;
  115.                         return -1 ;
  116.                 }
  117.                 else
  118.                 {
  119.                         TranslateMessage (&msg) ;
  120.                         DispatchMessage (&msg) ;
  121.                 }
  122.         }
  123.         return msg.wParam ;
  124. }
  125. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  126. {
  127.         static      HBITMAP hBmpI[IMGCOUNT], hBmpM[IMGCOUNT] ;
  128.         HINSTANCE   hInstance = NULL ;
  129.         HDC         hdc, hdcMemImag, hdcMemMask ;
  130.         BITMAP      bmp ;
  131.         int         i, x, y ;
  132.         
  133.         switch (message)
  134.         {
  135.         case WM_CREATE:
  136.                 hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
  137.                 for(i=0; i<IMGCOUNT; i++)
  138.                 {
  139.                         TCHAR szBmpName[16] ;
  140.                         wsprintf(szBmpName, TEXT("BM_I%d"), i) ;
  141.                         hBmpI[i] = LoadBitmap (hInstance, szBmpName) ; //載入位圖
  142.                         wsprintf(szBmpName, TEXT("BM_M%d"), i) ;
  143.                         hBmpM[i] = LoadBitmap (hInstance, szBmpName) ; //載入相應的屏蔽位圖
  144.                 }
  145.                 SetTimer(hwnd, ID_TIMER, 100, NULL) ; //設置定時器100毫秒
  146.                 return 0 ;
  147.         
  148.                 //按鼠標左鍵 或者 鍵盤  退出程序
  149.         case WM_LBUTTONDOWN:
  150.         case WM_KEYDOWN:
  151.                 SendMessage(hwnd, WM_CLOSE, 0, 0) ;
  152.                 return 0;
  153.         case WM_TIMER: //最主要的部分 顯示透明位圖
  154.                 hdc = GetDC(hwnd) ;
  155.                 i = rand()%IMGCOUNT ;
  156.                 // 創建一個與指定設備兼容的內存設備上下文環境(DC)
  157.                 hdcMemImag = CreateCompatibleDC (hdc) ;
  158.                 DeleteObject(SelectObject (hdcMemImag, hBmpI[i])) ;
  159.                 GetObject (hBmpI[i], sizeof (BITMAP), &bmp) ;
  160.                 hdcMemMask = CreateCompatibleDC (hdc) ;
  161.                 DeleteObject(SelectObject (hdcMemMask, hBmpM[i])) ;
  162.                 ReleaseDC(hwnd, hdc) ; //釋放設備上下文環境(DC)
  163.                 //x、y爲位圖顯示的座標
  164.                 x = rand()%GetSystemMetrics(SM_CXSCREEN) - bmp.bmWidth/2 ;
  165.                 y = rand()%GetSystemMetrics(SM_CYSCREEN) - bmp.bmHeight/2 ;
  166.                 hdc= GetDC(NULL) ;
  167.                 //畫出位圖
  168.                 BitBlt (hdc, x, y, bmp.bmWidth, bmp.bmHeight, hdcMemMask, 0, 0, SRCAND) ;
  169.                 BitBlt (hdc, x, y, bmp.bmWidth, bmp.bmHeight, hdcMemImag, 0, 0, SRCPAINT) ;
  170.                 //刪除指定的設備上下文環境(DC)
  171.                 DeleteDC (hdcMemMask) ;
  172.                 DeleteDC (hdcMemImag) ;
  173.                 ReleaseDC(NULL, hdc) ;
  174.                 return 0 ;
  175.                 
  176.         case WM_DESTROY:
  177.                 // 刪除定時器
  178.                 KillTimer(hwnd, ID_TIMER) ;
  179.                 // 刪除位圖、屏蔽位圖
  180.                 for(i=0; i<IMGCOUNT; i++)
  181.                 {
  182.                         DeleteObject (hBmpI[i]) ;
  183.                         DeleteObject (hBmpM[i]) ;
  184.                 }
  185.                 InvalidateRect(NULL, NULL, TRUE) ; //更新整個屏幕
  186.                 PostQuitMessage (0) ;
  187.                 return 0 ;
  188.         }
  189.         return DefWindowProc (hwnd, message, wParam, lParam) ;
  190. }

 

 

//資源文件 Roses.rc

  1. //Microsoft Developer Studio generated resource script.
  2. //
  3. #include "resource.h"
  4. #define APSTUDIO_READONLY_SYMBOLS
  5. /////////////////////////////////////////////////////////////////////////////
  6. //
  7. // Generated from the TEXTINCLUDE 2 resource.
  8. //
  9. #include "afxres.h"
  10. /////////////////////////////////////////////////////////////////////////////
  11. #undef APSTUDIO_READONLY_SYMBOLS
  12. /////////////////////////////////////////////////////////////////////////////
  13. // Chinese (中國) resources
  14. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
  15. #ifdef _WIN32
  16. LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
  17. #pragma code_page(936)
  18. #endif //_WIN32
  19. /////////////////////////////////////////////////////////////////////////////
  20. //
  21. // Icon
  22. //
  23. // Icon with lowest ID value placed first to ensure application icon
  24. // remains consistent on all systems.
  25. ROSES                   ICON    DISCARDABLE     "rose.ico"
  26. #ifdef APSTUDIO_INVOKED
  27. /////////////////////////////////////////////////////////////////////////////
  28. //
  29. // TEXTINCLUDE
  30. //
  31. 1 TEXTINCLUDE DISCARDABLE 
  32. BEGIN
  33.     "resource.h/0"
  34. END
  35. 2 TEXTINCLUDE DISCARDABLE 
  36. BEGIN
  37.     "#include ""afxres.h""/r/n"
  38.     "/0"
  39. END
  40. 3 TEXTINCLUDE DISCARDABLE 
  41. BEGIN
  42.     "/r/n"
  43.     "/0"
  44. END
  45. #endif    // APSTUDIO_INVOKED
  46. /////////////////////////////////////////////////////////////////////////////
  47. //
  48. // Bitmap
  49. //
  50. BM_I0                   BITMAP  DISCARDABLE     "BM_I0.bmp"
  51. BM_I1                   BITMAP  DISCARDABLE     "BM_I1.bmp"
  52. BM_I2                   BITMAP  DISCARDABLE     "BM_I2.bmp"
  53. BM_I3                   BITMAP  DISCARDABLE     "BM_I3.bmp"
  54. BM_I4                   BITMAP  DISCARDABLE     "BM_I4.bmp"
  55. BM_I5                   BITMAP  DISCARDABLE     "BM_I5.bmp"
  56. BM_M0                   BITMAP  DISCARDABLE     "BM_M0.bmp"
  57. BM_M1                   BITMAP  DISCARDABLE     "BM_M1.bmp"
  58. BM_M2                   BITMAP  DISCARDABLE     "BM_M2.bmp"
  59. BM_M3                   BITMAP  DISCARDABLE     "BM_M3.bmp"
  60. BM_M4                   BITMAP  DISCARDABLE     "BM_M4.bmp"
  61. BM_M5                   BITMAP  DISCARDABLE     "BM_M5.bmp"
  62. #endif    // Chinese (中國) resources
  63. /////////////////////////////////////////////////////////////////////////////
  64. #ifndef APSTUDIO_INVOKED
  65. /////////////////////////////////////////////////////////////////////////////
  66. //
  67. // Generated from the TEXTINCLUDE 3 resource.
  68. //
  69. /////////////////////////////////////////////////////////////////////////////
  70. #endif    // not APSTUDIO_INVOKED

 

//頭文件 resource.h

  1. //{{NO_DEPENDENCIES}}
  2. // Microsoft Developer Studio generated include file.
  3. // Used by Roses.rc
  4. //
  5. // Next default values for new objects
  6. // 
  7. #ifdef APSTUDIO_INVOKED
  8. #ifndef APSTUDIO_READONLY_SYMBOLS
  9. #define _APS_NEXT_RESOURCE_VALUE        114
  10. #define _APS_NEXT_COMMAND_VALUE         40001
  11. #define _APS_NEXT_CONTROL_VALUE         1000
  12. #define _APS_NEXT_SYMED_VALUE           101
  13. #endif
  14. #endif

 

//程序運行效果圖

 

 

 

//程序完整源碼下載地址(附加可執行文件)

http://download.csdn.net/source/837221

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章