本文由BlueCoder編寫 轉載請說明出處:
http://blog.csdn.net/crocodile__/article/details/10077625
我的郵箱:[email protected] 歡迎大家和我交流編程心得
我的微博:BlueCoder_黎小華 歡迎光臨^_^
前段時間,我編寫了一個創意程序,並用於向自己目前的女朋友表白,結果效果還不錯,得到了她的芳心。
於是我將自己的創意程序共享到csdn資源上,大多數網友認爲創意不錯,就是簡單了些——呵呵,其實我個人也這麼覺得,只不過當時時間和能力的限制,也就那樣將就了
……
……
而今呢,我在七夕節時再次爲我的女朋友寫了一個程序,這次算是上次的升級版吧,功能多了一些、界面效果也好多了
下面,我們就來欣賞一下它的效果吧
(這次的目的和上次一樣,只是做一個模本,所以我僅僅是使用了上次的詩歌和一首最近比較火的歌曲<<誰>>(吳佳唱的,電視劇<<生死相依>>的主題曲),留給大家創作的空間^_^)
*************************************************程序及源代碼欣賞******************************************************
(1)開始彈出一個消息框,點擊"是"繼續,點擊"否"直接退出
這個就是一個消息框,代碼很簡單:
在主窗口回調函數的WM_CREATE消息中響應:
case WM_CREATE:
if(IDYES == MessageBox(hwnd, TEXT("準備好傾聽我的心聲了嗎?"), TEXT("LoveWindow"), MB_YESNO))
{
Sleep(2000);
}
else//選擇否 直接發送窗口銷燬消息,退出窗口
{
SendMessage(hwnd, WM_DESTROY, wParam, lParam);
}
(2)選擇"是"之後2秒鐘,顯示主窗口的界面
(3)這裏在主窗口中建立了三個子窗口,這個一眼就能看見,就不言而喻了——我還是將三個子窗口的窗口回調函數代碼貼出來,內涵註釋
a)詩歌子窗口(左邊長方形的那個)功能及其代碼介紹,均在子窗口PoemChild回調函數中響應
1. 使用MCI控件來播放音樂(基本上可以播放所有的音頻文件,這裏默認選擇了了一首"誰.mp3"這首歌,還比較好聽)
case WM_CREATE://在創建消息中響應 //開始加載並播放音樂(使用MCI控件) hwndMci = MCIWndCreate(hwnd, ((LPCREATESTRUCT)lParam)->hInstance, MCIWNDF_SHOWNAME,TEXT("誰.mp3")); ShowWindow(hwndMci, SW_HIDE); MCIWndPlay(hwndMci);
同時通過響應鼠標左鍵消息來控制它的顯示或隱藏//通過響應鼠標消息來控制MCI播放器的顯示和隱藏 case WM_LBUTTONDOWN: if(IsWindowVisible(hwndMci))//如果可視就隱藏,否則顯示 { ShowWindow(hwndMci, SW_HIDE); } else { ShowWindow(hwndMci, SW_NORMAL); } return 0;
2. 修改了字體
//在WM_CREATE消息中創建字體 ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = -15; lf.lfUnderline = 1; hFont = CreateFontIndirect(&lf);
3. 在WM_PAINT消息中繪製位圖,在定時器消息WM_TIMER中顯示詩歌(這個基本上次相同)
//通過定時器來驅動詩歌的顯示 case WM_TIMER: hdc = GetDC(hwnd); //設定文本顏色 SetTextColor(hdc, RGB(rand() % 255, rand() % 205, rand() % 255)); SetBkMode(hdc,TRANSPARENT);//設定文本的背景透明 SelectObject(hdc, hFont);//選擇創建好的字體 //如果文件讀取完了 , 計時器也應該關閉 , 免得浪費資源 if(ShowWord(hdc) == EOF) { KillTimer(hwnd, ID_TIMER_POEM); } ReleaseDC(hwnd, hdc); return 0;
b)右上角子窗口,均在LoveChild窗口回調函數中響應主要就是通過上下移動三種位圖,分別標記"我"、"愛"、"你",感覺比較溫馨
這裏着重看一下WM_PAINT消息中的代碼,其餘的沒什麼特別的,大家可以下載資源以查看完整代碼
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hdcMem = CreateCompatibleDC(hdc); for(i=0; i<NUM; i++) { //判斷位圖的位置 並作相應的運動方向的改變 if(bmpPos[i].y < 0)//上邊界 { moveIndex[i] = rand() % 10 + 5;//通過隨機數來控制移動速度,所以你會發現它們有時快、有時慢 } if(bmpPos[i].y >= (cyClient - cyBitmap))//下邊界 { moveIndex[i] = - (rand() % 10 + 5); } bmpPos[i].y += moveIndex[i];//修改位圖縱向的位移 SelectObject(hdcMem, hBmp[i]); BitBlt(hdc, bmpPos[i].x, bmpPos[i].y, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY);//貼位圖 } DeleteDC(hdcMem); EndPaint(hwnd, &ps);
c)右下角子窗口,這個子窗口主要就是按時變換位圖在WM_TIMER消息中,使窗口無效而重繪
case WM_TIMER: InvalidateRect(hwnd, NULL, TRUE); return 0;
在WM_PAINT消息中變換背景
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hdcMem = CreateCompatibleDC(hdc); SelectObject(hdcMem, hBmp[curBmpIndex]); BitBlt(hdc, 3, 8, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY); curBmpIndex = (curBmpIndex + 1) % 10;//通過修改位圖索引,來控制下一張背景的顯示,總共10張 DeleteDC(hdcMem); EndPaint(hwnd, &ps); return 0;
(4)另外,本次使用了Win32的MCI控件,基本上可以播放任意格式的音頻文件
(點擊左邊長方形子窗口,可以控制這個控件的顯示和隱藏)
至於這個控件的使用方法,相信大家能很快了解到,不需要我贅述了
從這個方面來講,本次的程序還是一個簡易的背景音樂播放器
ok,因爲大部分技術都是之前講過的,例如:貼位圖、計時器、子窗口==,因此就這樣初略地講一下吧……
希望我的程序能給程序員們帶來靈感,願天下有情人終成眷屬^_^