相信有好多朋友都知道這個程序 但是沒給源碼 呵呵 其實我們可以自己實現的 代碼很簡單(另外這裏 玫瑰並不止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,以檢索整個屏幕的設備上下文環境
不知道原程序是如何實現的
這樣再畫圖就沒問題了
好了下面代碼:
- /*==============================
- Roses.cpp -- 一千朵玫瑰
- (c) Snow-dream, 2008
- QQ:529698939
- E-mail:[email protected]
- 編寫日期:2008-12-3
- VC 6.0環境下編譯通過
- ===============================*/
- #include <windows.h>
- #include <stdlib.h>
- #include "resource.h"
- #define WS_EX_LAYERED 0x00080000
- #define LWA_ALPHA 0x00000002
- #define LWA_COLORKEY 0x00000001
- #define ID_TIMER 1
- #define IMGCOUNT 6 //圖片數
- //因爲沒有導出SetLayeredWindowAttributes API 所以要我們自己到user32.dll裏搜索
- typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)
- (HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags) ;
- LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
- //設置窗口的透明度 hwnd是被設置的窗口 byAlpha是指示了透明度(0完全透明 255完全不透明)
- BOOL TransparentWnd(HWND hwnd, BYTE byAlpha)
- {
- long lStyle;
- HMODULE hModule;
- BOOL bRet;
- LPFNSETLAYEREDWINDOWATTRIBUTES lpSetLayeredWindowAttributes;
- if(FALSE == IsWindow(hwnd))
- {
- MessageBox(NULL, TEXT("窗口句柄無效!"), NULL, 0) ;
- return FALSE ;
- }
- hModule = (HMODULE)LoadLibrary(TEXT("user32.dll")) ;
- if(hModule)
- {
- lpSetLayeredWindowAttributes = (LPFNSETLAYEREDWINDOWATTRIBUTES)
- GetProcAddress(hModule, TEXT("SetLayeredWindowAttributes")) ;
- if(!lpSetLayeredWindowAttributes)
- {
- MessageBox(hwnd, TEXT("未找到API SetLayeredWindowAttributes的地址!"),
- NULL, MB_OK) ;
- return FALSE ;
- }
- }
- lStyle = GetWindowLong(hwnd, GWL_EXSTYLE) ;
- if(!lStyle)
- {
- MessageBox(hwnd, TEXT("獲取窗口擴展樣式失敗!"), NULL, MB_OK) ;
- return FALSE ;
- }
- lStyle = lStyle | WS_EX_LAYERED ;
- bRet = SetWindowLong(hwnd, GWL_EXSTYLE, lStyle) ;
- if(!bRet)
- {
- MessageBox(hwnd, TEXT("設置窗口擴展樣式失敗!"), NULL, MB_OK) ;
- return FALSE ;
- }
- bRet = lpSetLayeredWindowAttributes(hwnd, 0, byAlpha, LWA_ALPHA) ;
- if(!bRet)
- {
- MessageBox(hwnd, TEXT("設置窗口透明度失敗!"), NULL, MB_OK) ;
- return FALSE ;
- }
- RedrawWindow(hwnd, NULL, NULL,
- RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN) ;
- FreeLibrary(hModule) ;
- return TRUE ;
- }
- int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, int iCmdShow)
- {
- static TCHAR szAppName[] = TEXT ("Roses") ;
- HWND hwnd ;
- MSG msg ;
- WNDCLASS wndclass ;
- BOOL bRet ;
- wndclass.style = CS_HREDRAW | CS_VREDRAW ;
- wndclass.lpfnWndProc = WndProc ;
- wndclass.cbClsExtra = 0 ;
- wndclass.cbWndExtra = 0 ;
- wndclass.hInstance = hInstance ;
- wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
- wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
- wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
- wndclass.lpszMenuName = NULL ;
- wndclass.lpszClassName = szAppName ;
- if(!RegisterClass (&wndclass))
- {
- MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;
- return 0;
- }
- srand ((int)GetTickCount()) ; //初始化隨機數發生器
- // 創建主窗口 讓窗口最大化
- hwnd = CreateWindow (szAppName, TEXT ("玫瑰花"),
- WS_DLGFRAME | WS_POPUP,
- 0, 0,
- GetSystemMetrics(SM_CXSCREEN),
- GetSystemMetrics(SM_CYSCREEN),
- NULL, NULL, hInstance, NULL) ;
- TransparentWnd(hwnd, 1) ; //設置窗口透明度
- SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW) ; //窗口置頂
- ShowWindow (hwnd, iCmdShow) ;
- UpdateWindow (hwnd) ;
- while ( (bRet = GetMessage (&msg, NULL, 0, 0) ) != 0 )
- {
- if (bRet == -1)
- {
- MessageBox (hwnd, TEXT ("Such code can lead to fatal application errors"),
- szAppName, MB_ICONERROR) ;
- return -1 ;
- }
- else
- {
- TranslateMessage (&msg) ;
- DispatchMessage (&msg) ;
- }
- }
- return msg.wParam ;
- }
- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- static HBITMAP hBmpI[IMGCOUNT], hBmpM[IMGCOUNT] ;
- HINSTANCE hInstance = NULL ;
- HDC hdc, hdcMemImag, hdcMemMask ;
- BITMAP bmp ;
- int i, x, y ;
- switch (message)
- {
- case WM_CREATE:
- hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
- for(i=0; i<IMGCOUNT; i++)
- {
- TCHAR szBmpName[16] ;
- wsprintf(szBmpName, TEXT("BM_I%d"), i) ;
- hBmpI[i] = LoadBitmap (hInstance, szBmpName) ; //載入位圖
- wsprintf(szBmpName, TEXT("BM_M%d"), i) ;
- hBmpM[i] = LoadBitmap (hInstance, szBmpName) ; //載入相應的屏蔽位圖
- }
- SetTimer(hwnd, ID_TIMER, 100, NULL) ; //設置定時器100毫秒
- return 0 ;
- //按鼠標左鍵 或者 鍵盤 退出程序
- case WM_LBUTTONDOWN:
- case WM_KEYDOWN:
- SendMessage(hwnd, WM_CLOSE, 0, 0) ;
- return 0;
- case WM_TIMER: //最主要的部分 顯示透明位圖
- hdc = GetDC(hwnd) ;
- i = rand()%IMGCOUNT ;
- // 創建一個與指定設備兼容的內存設備上下文環境(DC)
- hdcMemImag = CreateCompatibleDC (hdc) ;
- DeleteObject(SelectObject (hdcMemImag, hBmpI[i])) ;
- GetObject (hBmpI[i], sizeof (BITMAP), &bmp) ;
- hdcMemMask = CreateCompatibleDC (hdc) ;
- DeleteObject(SelectObject (hdcMemMask, hBmpM[i])) ;
- ReleaseDC(hwnd, hdc) ; //釋放設備上下文環境(DC)
- //x、y爲位圖顯示的座標
- x = rand()%GetSystemMetrics(SM_CXSCREEN) - bmp.bmWidth/2 ;
- y = rand()%GetSystemMetrics(SM_CYSCREEN) - bmp.bmHeight/2 ;
- hdc= GetDC(NULL) ;
- //畫出位圖
- BitBlt (hdc, x, y, bmp.bmWidth, bmp.bmHeight, hdcMemMask, 0, 0, SRCAND) ;
- BitBlt (hdc, x, y, bmp.bmWidth, bmp.bmHeight, hdcMemImag, 0, 0, SRCPAINT) ;
- //刪除指定的設備上下文環境(DC)
- DeleteDC (hdcMemMask) ;
- DeleteDC (hdcMemImag) ;
- ReleaseDC(NULL, hdc) ;
- return 0 ;
- case WM_DESTROY:
- // 刪除定時器
- KillTimer(hwnd, ID_TIMER) ;
- // 刪除位圖、屏蔽位圖
- for(i=0; i<IMGCOUNT; i++)
- {
- DeleteObject (hBmpI[i]) ;
- DeleteObject (hBmpM[i]) ;
- }
- InvalidateRect(NULL, NULL, TRUE) ; //更新整個屏幕
- PostQuitMessage (0) ;
- return 0 ;
- }
- return DefWindowProc (hwnd, message, wParam, lParam) ;
- }
//資源文件 Roses.rc
- //Microsoft Developer Studio generated resource script.
- //
- #include "resource.h"
- #define APSTUDIO_READONLY_SYMBOLS
- /////////////////////////////////////////////////////////////////////////////
- //
- // Generated from the TEXTINCLUDE 2 resource.
- //
- #include "afxres.h"
- /////////////////////////////////////////////////////////////////////////////
- #undef APSTUDIO_READONLY_SYMBOLS
- /////////////////////////////////////////////////////////////////////////////
- // Chinese (中國) resources
- #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
- #ifdef _WIN32
- LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
- #pragma code_page(936)
- #endif //_WIN32
- /////////////////////////////////////////////////////////////////////////////
- //
- // Icon
- //
- // Icon with lowest ID value placed first to ensure application icon
- // remains consistent on all systems.
- ROSES ICON DISCARDABLE "rose.ico"
- #ifdef APSTUDIO_INVOKED
- /////////////////////////////////////////////////////////////////////////////
- //
- // TEXTINCLUDE
- //
- 1 TEXTINCLUDE DISCARDABLE
- BEGIN
- "resource.h/0"
- END
- 2 TEXTINCLUDE DISCARDABLE
- BEGIN
- "#include ""afxres.h""/r/n"
- "/0"
- END
- 3 TEXTINCLUDE DISCARDABLE
- BEGIN
- "/r/n"
- "/0"
- END
- #endif // APSTUDIO_INVOKED
- /////////////////////////////////////////////////////////////////////////////
- //
- // Bitmap
- //
- BM_I0 BITMAP DISCARDABLE "BM_I0.bmp"
- BM_I1 BITMAP DISCARDABLE "BM_I1.bmp"
- BM_I2 BITMAP DISCARDABLE "BM_I2.bmp"
- BM_I3 BITMAP DISCARDABLE "BM_I3.bmp"
- BM_I4 BITMAP DISCARDABLE "BM_I4.bmp"
- BM_I5 BITMAP DISCARDABLE "BM_I5.bmp"
- BM_M0 BITMAP DISCARDABLE "BM_M0.bmp"
- BM_M1 BITMAP DISCARDABLE "BM_M1.bmp"
- BM_M2 BITMAP DISCARDABLE "BM_M2.bmp"
- BM_M3 BITMAP DISCARDABLE "BM_M3.bmp"
- BM_M4 BITMAP DISCARDABLE "BM_M4.bmp"
- BM_M5 BITMAP DISCARDABLE "BM_M5.bmp"
- #endif // Chinese (中國) resources
- /////////////////////////////////////////////////////////////////////////////
- #ifndef APSTUDIO_INVOKED
- /////////////////////////////////////////////////////////////////////////////
- //
- // Generated from the TEXTINCLUDE 3 resource.
- //
- /////////////////////////////////////////////////////////////////////////////
- #endif // not APSTUDIO_INVOKED
//頭文件 resource.h
- //{{NO_DEPENDENCIES}}
- // Microsoft Developer Studio generated include file.
- // Used by Roses.rc
- //
- // Next default values for new objects
- //
- #ifdef APSTUDIO_INVOKED
- #ifndef APSTUDIO_READONLY_SYMBOLS
- #define _APS_NEXT_RESOURCE_VALUE 114
- #define _APS_NEXT_COMMAND_VALUE 40001
- #define _APS_NEXT_CONTROL_VALUE 1000
- #define _APS_NEXT_SYMED_VALUE 101
- #endif
- #endif
//程序運行效果圖
//程序完整源碼下載地址(附加可執行文件)