本文由BlueCoder编写 转载请说明出处:
http://blog.csdn.net/crocodile__/article/details/10077625
我的邮箱:bluecoder@yeah.net 欢迎大家和我交流编程心得
我的微博: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,因为大部分技术都是之前讲过的,例如:贴位图、计时器、子窗口==,因此就这样初略地讲一下吧……
希望我的程序能给程序员们带来灵感,愿天下有情人终成眷属^_^
点击下载程序和源代码