C++實(shí)現(xiàn)新年賀卡程序
用c++應(yīng)用程序編寫的雪花賀卡,逢年過(guò)節(jié)送給你自己身邊的親友吧
snow.cpp
///////////////////////////////////////////////////////////////////////////////
// Snow.cpp
// Date: 2009-2-5 21:16
// A moving ball.
//
///////////////////////////////////////////////////////////////////////////////
#include <assert.h>
#include "Snow.h"
TCHAR strForWin1[] = "時(shí)間過(guò)得好快啊!";
TCHAR strForWin2[] = "開學(xué)已經(jīng)十周了..." ;
TCHAR strForWin3[] = "你學(xué)的怎么樣了?";
TCHAR strForWin4[] = "有問(wèn)題一定要及時(shí)讓我知道";
TCHAR strForWin5[] = "祝大家“小光棍節(jié)”快樂(lè)";
TCHAR strForWin6[] = " CJ Wang 2011.11.1";
const int nMaxHeight = 450;
#define ID_TIMER 1
///////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow )
{
char className[] = "Snow";
MovingBall MovingBallClass( WindowsProcedure, className, hInst );
MovingBallClass.Register();
WinMaker win( "-- Have a joy here!", className, hInst );
win.Show( cmdShow );
MSG msg;
int status;
while( ( status = ::GetMessage( & msg, NULL, 0, 0 ) ) != 0 )
{
if ( status == -1 )
return -1;
::TranslateMessage( & msg );
::DispatchMessage( & msg );
}
return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////
MovingBall::MovingBall( WNDPROC wndProc, const char* className, HINSTANCE hInstance )
{
_class.style = 0;
_class.lpfnWndProc = wndProc; // Windows procedure: mandatory
_class.cbClsExtra = 0;
_class.cbWndExtra = 0;
_class.hInstance = hInstance;
_class.hIcon = 0; // Owner of class: mandatory
_class.hCursor = ::LoadCursor( 0, IDC_ARROW );
_class.hbrBackground = (HBRUSH) ( COLOR_WINDOW + 1 ); // Optional
_class.lpszMenuName = 0;
_class.lpszClassName = className; // Mandatory
}
WinMaker::WinMaker( const char* szCaption, const char* className, HINSTANCE hInstance )
{
DWORD dwStyle = WS_OVERLAPPEDWINDOW;
dwStyle &= ~WS_SIZEBOX;
dwStyle &= ~WS_MAXIMIZEBOX;
dwStyle &= ~WS_MINIMIZEBOX;
_hWnd = ::CreateWindow(
className, // Name of a registered window class
szCaption, // Window caption
dwStyle, // Window style
CW_USEDEFAULT, // x position
CW_USEDEFAULT, // y position
787, // width
590, // height
0, // Handle to parent window
0, // Handle to menu
hInstance, // Application instance
0 ); // Window creation data
}
/*:: -- 作用域標(biāo)識(shí)符!如果是在MFC下編程的話,因?yàn)镸FC封裝了API函數(shù),但是參數(shù)有的和API函數(shù)不一樣,
比如MFC封裝的函數(shù)一般都沒(méi)有句柄這個(gè)參數(shù),但是API函數(shù)都有,
所以在MFC編程中,如果你調(diào)用的是全局的API函數(shù)的話就要加::符號(hào),
來(lái)通知編譯器你調(diào)用的是全局的API函數(shù),而不是MFC封裝的API函數(shù)!
當(dāng)然有的函數(shù)比如參數(shù)是個(gè)布爾型的,MFC封裝的函數(shù)和全局的API函數(shù)的參數(shù)相同,
編譯器默認(rèn)的是調(diào)用MFC封裝的函數(shù),所以你加不加::作用域標(biāo)識(shí)符都是一樣的!!
控制臺(tái)下編寫的程序用的就是API函數(shù)所以沒(méi)必要加::作用域標(biāo)識(shí)符的。
*/
///////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowsProcedure( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam )
{
static HBITMAP hbmpBkground = NULL,
hbmpSnow = NULL,
hbmpMask = NULL;
static Snow snowFlakes[ 80 ];
static int countSnow = 0;
static int cxClient, cyClient;
static int nHeightY = nMaxHeight;
COLORREF clrBk;
PAINTSTRUCT ps;
HDC hdc = NULL,
hdcMem = NULL;
HINSTANCE hInst = NULL;
switch( uMessage )
{
case WM_CREATE:
hInst = ( (LPCREATESTRUCT) lParam )->hInstance;
assert( hInst );
hbmpBkground = ::LoadBitmap( hInst, TEXT( "bground" ) );
assert( hbmpBkground );
hbmpSnow = ::LoadBitmap( hInst, TEXT( "snow" ) );
assert( hbmpSnow );
hbmpMask = ::LoadBitmap( hInst, TEXT( "mask" ) );
assert( hbmpMask );
::SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
//設(shè)置定時(shí)器
::SetTimer( hWnd, ID_TIMER, 160, NULL );
return 0;
case WM_SIZE:
cxClient = LOWORD( lParam );
cyClient = HIWORD( lParam );
return 0;
case WM_PAINT:
hdc = ::BeginPaint( hWnd, & ps );
assert( hdc );
hdcMem = ::CreateCompatibleDC( hdc );
assert( hdcMem );
::SelectObject( hdcMem, hbmpBkground );
::BitBlt(
hdc,
0, 0,
cxClient, cyClient,
hdcMem,
0, 0,
SRCCOPY );
::DeleteDC( hdcMem );
::EndPaint( hWnd, & ps );
return 0;
case WM_TIMER:
::FlashWindow( hWnd, TRUE );
if ( countSnow < 80 )
{
snowFlakes[ countSnow ].xPos = rand() % cxClient;
snowFlakes[ countSnow ].yPos = 0;
snowFlakes[ countSnow ].bIsExist = TRUE;
countSnow++;
}
if ( countSnow == 80 )
countSnow = 0;
hdc = ::GetDC( hWnd );
assert( hdc );
hdcMem = ::CreateCompatibleDC( hdc );
assert( hdcMem );
::SelectObject( hdcMem, hbmpBkground );
::BitBlt(
hdc,
0, 0,
cxClient, cyClient,
hdcMem,
0, 0,
SRCCOPY );
clrBk = ::GetBkColor( hdc );
::SetTextColor( hdc, RGB( 0, 11, 255 ) );
::SetBkColor( hdc, clrBk );
::TextOut( hdc, 100, nHeightY, strForWin1, lstrlen( strForWin1 ) );
::TextOut( hdc, 100, nHeightY + 18, strForWin2, lstrlen( strForWin2 ) );
::TextOut( hdc, 100, nHeightY + 36, strForWin3, lstrlen( strForWin3 ) );
::TextOut( hdc, 100, nHeightY + 54, strForWin4, lstrlen( strForWin4 ) );
::TextOut( hdc, 100, nHeightY + 70, strForWin5, lstrlen( strForWin5 ) );
::TextOut( hdc, 100, nHeightY + 88, strForWin6, lstrlen( strForWin6 ) );
//
// The redraw area for the text
//
nHeightY -= 10;
if ( nHeightY <= -88 )
{
nHeightY = nMaxHeight;
}
int i;
for ( i = 0; i < 80; i++ )
{
if ( snowFlakes[ i ].bIsExist )
{
::SelectObject( hdcMem, hbmpMask );
::BitBlt(
hdc,
snowFlakes[ i ].xPos, snowFlakes[ i ].yPos,
20, 20,
hdcMem,
0, 0,
SRCAND );
::SelectObject( hdcMem, hbmpSnow );
::BitBlt(
hdc,
snowFlakes[ i ].xPos, snowFlakes[ i ].yPos,
20, 20,
hdcMem,
0, 0,
SRCPAINT );
if ( rand() % 2 == 0 )
snowFlakes[ i ].xPos += 3;
else
snowFlakes[ i ].xPos -= 3;
snowFlakes[ i ].yPos += 10;
if ( snowFlakes[ i ].yPos > cyClient )
{
snowFlakes[ i ].xPos = rand() % cxClient;
snowFlakes[ i ].yPos = 0;
}
}
}
::ReleaseDC( hWnd, hdc );
::DeleteDC( hdcMem );
return 0;
case WM_DESTROY:
::DeleteObject( hbmpBkground );
::DeleteObject( hbmpSnow );
::DeleteObject( hbmpMask );
::KillTimer( hWnd, ID_TIMER );
::PostQuitMessage( 0 );
return 0;
}
return ::DefWindowProc( hWnd, uMessage, wParam, lParam );
}
源碼下載:賀卡程序
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C++中rapidjson組裝map和數(shù)組array的代碼示例
- 用C/C++代碼檢測(cè)ip能否ping通(配合awk和system可以做到批量檢測(cè))
- c++文件監(jiān)控之FileSystemWatcher
- C++獲取MD5算法實(shí)現(xiàn)代碼
- C++獲取特定進(jìn)程CPU使用率的實(shí)現(xiàn)代碼
- C++ 獲取進(jìn)程CPU占用率
- C++ 設(shè)置控制臺(tái)(命令行)窗口 光標(biāo)位置,及前背景顏色
- C++11獲取線程返回值的實(shí)現(xiàn)代碼
- C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼
- C++中rapidjson將map轉(zhuǎn)為json的方法
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡檢測(cè)精簡(jiǎn)版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)linux網(wǎng)卡檢測(cè)的精簡(jiǎn)版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C語(yǔ)言模擬實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
C語(yǔ)言控制臺(tái)實(shí)現(xiàn)打飛機(jī)小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言控制臺(tái)實(shí)現(xiàn)打飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C語(yǔ)言數(shù)據(jù)類型轉(zhuǎn)換實(shí)例代碼
本文主要介紹C 語(yǔ)言數(shù)據(jù)類型轉(zhuǎn)換,這里通過(guò)代碼實(shí)例進(jìn)行詳解,這是C語(yǔ)言基礎(chǔ)部分,需要的朋友可以參考下2016-07-07
C++聚合體初始化aggregate initialization詳細(xì)介紹
這篇文章主要介紹了C++聚合體初始化aggregate initialization,C++有很多初始化對(duì)象的方法。其中之一叫做 聚合體初始化(aggregate initialization) ,這是聚合體專有的一種初始化方法2023-02-02
Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓盤進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12

