前段时间,我编写了一个创意程序,并用于向自己目前的女朋友表白,结果效果还不错,得到了她的芳心。

于是我将自己的创意程序共享到csdn资源上,大多数网友认为创意不错,就是简单了些——呵呵,其实我个人也这么觉得,只不过当时时间和能力的限制,也就那样将就了

……

点击下载第一次的程序

……

而今呢,我在七夕节时再次为我的女朋友写了一个程序,这次算是上次的升级版吧,功能多了一些、界面效果也好多了

下面,我们就来欣赏一下它的效果吧

(这次的目的和上次一样,只是做一个模本,所以我仅仅是使用了上次的诗歌和一首最近比较火的歌曲<<谁>>(吴佳唱的,电视剧<<生死相依>>的主题曲),留给大家创作的空间^_^)

*************************************************程序及源代码欣赏******************************************************

(1)开始弹出一个消息框,点击"是"继续,点击"否"直接退出

(2)选择"是"之后2秒钟,显示主窗口的界面

(3)这里在主窗口中建立了三个子窗口,这个一眼就能看见,就不言而喻了——我还是将三个子窗口的窗口回调函数代码贴出来,内涵注释

a)诗歌子窗口(左边长方形的那个)

//诗歌子窗口回调函数(动态显示诗歌、播放音乐(音乐可自行选择))
LRESULT CALLBACK PoemChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBmp;
static HFONT hFont;
static int cxBitmap, cyBitmap;
static HWND hwndMci;
BITMAP bmp;
LOGFONT lf;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
TEXTMETRIC tm; switch(message)
{
case WM_CREATE:
//开始加载并播放音乐(使用MCI控件)
hwndMci = MCIWndCreate(hwnd, ((LPCREATESTRUCT)lParam)->hInstance,
MCIWNDF_SHOWNAME,TEXT("谁.mp3")); ShowWindow(hwndMci, SW_HIDE);
MCIWndPlay(hwndMci); //加载位图
hBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDB_BMPPOEM));
GetObject(hBmp, sizeof(BITMAP), &bmp); cxBitmap = bmp.bmWidth;
cyBitmap = bmp.bmHeight; /**********************获取系统文本参数*************************/
hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight; ReleaseDC(hwnd, hdc); //设定计时器
SetTimer(hwnd, ID_TIMER_POEM, 400, NULL); //创建字体
ZeroMemory(&lf, sizeof(LOGFONT)); lf.lfHeight = -15;
lf.lfUnderline = 1; hFont = CreateFontIndirect(&lf); //打开诗歌文件
if((fp = fopen("res\\Poem.txt", "r")) == NULL)
{
MessageBox(hwnd, TEXT("不好意思,我找不到优美的诗歌了o(╯□╰)o"), TEXT("提示"), MB_OK);
exit(1);
}
row = col = 0;
return 0 ; //绘制背景位图
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); hdcMem = CreateCompatibleDC(hdc);
SelectObject(hdcMem, hBmp); BitBlt(hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY); DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return 0; //通过响应鼠标消息来控制MCI播放器的显示和隐藏
case WM_LBUTTONDOWN:
if(IsWindowVisible(hwndMci))
{
ShowWindow(hwndMci, SW_HIDE);
} else
{
ShowWindow(hwndMci, SW_NORMAL);
}
return 0; //通过定时器来驱动诗歌的显示
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; case WM_DESTROY:
MCIWndDestroy(hwndMci);//关闭MCI控件
DeleteObject(hFont);
DeleteObject(hBmp);
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

b)右上角子窗口

//动画位图子窗口回调函数
LRESULT CALLBACK LoveChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBmp[NUM];
static POINT bmpPos[NUM];
static int moveIndex[NUM] = {5, 5, 5};
static WORD bmpID[] = {IDB_BMPI, IDB_BMPLOVE, IDB_BMPYOU};
static int cxClient, cyClient, cxBitmap, cyBitmap;
BITMAP bmp;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
int i; switch(message)
{
case WM_CREATE:
//设置计时器
SetTimer(hwnd, ID_TIMER_LOVE, 100, NULL); //加载位图
for(i=0; i<NUM; i++)
{
hBmp[i] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(bmpID[i]));
bmpPos[i].x = bmpPos[i].y = -10;
} GetObject(hBmp[0], sizeof(BITMAP), &bmp); cxBitmap = bmp.bmWidth;
cyBitmap = bmp.bmHeight;
return 0; case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam); //修改位图位置
for(i=0; i<NUM; i++)
{
bmpPos[i].x = cxClient * i / 3;
if(bmpPos[i].x == -10)
{
bmpPos[i].y = rand() % (cyClient - cyBitmap);
}
}
return 0; 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);
return 0; case WM_TIMER:
InvalidateRect(hwnd, NULL, FALSE);//设置无效区域 但是不重绘背景(FALSE)
return 0; case WM_DESTROY:
KillTimer(hwnd, ID_TIMER_LOVE); for(i=0; i<NUM; i++)
{
DeleteObject(hBmp[i]);
} PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

c)右下角子窗口

//动态变换位图子窗口回调函数
LRESULT CALLBACK BmpChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBmp[10];
static WORD bmpID[] = {IDB_BITMAP4, IDB_BITMAP5, IDB_BITMAP6, IDB_BITMAP7,
IDB_BITMAP8, IDB_BITMAP9, IDB_BITMAP10, IDB_BITMAP11,
IDB_BITMAP12, IDB_BITMAP13};
static int cxBitmap, cyBitmap, curBmpIndex;
BITMAP bmp;
HDC hdc, hdcMem;
PAINTSTRUCT ps;
int i; switch(message)
{
case WM_CREATE:
//设置计时器
SetTimer(hwnd, ID_TIMER_BMP, 5000, NULL); //加载位图
for(i=0; i<10; i++)
{
hBmp[i] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(bmpID[i]));
} GetObject(hBmp[0], sizeof(BITMAP), &bmp); cxBitmap = bmp.bmWidth;
cyBitmap = bmp.bmHeight;
return 0; 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; DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
return 0; case WM_TIMER:
InvalidateRect(hwnd, NULL, TRUE);
return 0; case WM_DESTROY:
KillTimer(hwnd, ID_TIMER_BMP); for(i=0; i<10; i++)
{
DeleteObject(hBmp[i]);
} PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}

(4)另外,本次使用了Win32的MCI控件,基本上可以播放任意格式的音频文件

(点击左边长方形子窗口,可以控制这个控件的显示和隐藏)

至于这个控件的使用方法,相信大家能很快了解到,不需要我赘述了

从这个方面来讲,本次的程序还是一个建议的背景音乐播放器

ok,因为大部分技术都是之前讲过的,例如:贴位图、计时器、子窗口==,因此就这样初略地讲一下吧……

希望我的程序能给程序员们带来灵感,愿天下有情人终成眷属^_^

点击下载程序和源代码

随机推荐

  1. Linux中查看进程及杀死进程命令

    Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00 ...

  2. pkusc2015

    Mex 题目大意:给出一个序列\(a\),定义\(f(l,r)\)为集合{\(a_l, a_{l+1}, -, a_r\)}的sg值,求\(\sum_i \sum_{j(i\leq j)} f(i,j ...

  3. poj 1731 Orders(暴力)

    题目链接:http://poj.org/problem?id=1731 思路分析:含有重复元素的全排列问题:元素个数为200个,采用暴力枚举法. 代码如下: #include <iostream ...

  4. How many integers can you find(容斥+dfs容斥)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. stm32之中断系统

    概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...

  6. cygwin中vim的使用方法

    vim类似Windows中的记事本,功能非常强大. vim的使用技巧 1.vim text.txt text存在则打开,不存在则类似新建一个叫text的txt文件 2.退出 按esc切换到命令模式,然 ...

  7. 【Oracle】number类型保留小数位

    SQL> SELECT TO_CHAR(, '9990.00') A, TO_CHAR(5.8, '9990.00') B, TO_CHAR(., '9990.00') C FROM dual; ...

  8. 自定制emoji替换系统的emoji键盘

    一.关于emoji表情 随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富.emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUn ...

  9. C#_会员管理系统:开发一(用户登录)

    首先创建数据库: [Vip] 创建三张表: 分别是: [VipInformation](会员信息) [Log](日志) [VipAccount](账户权限) 详细语句: --创建数据库[Vip] cr ...

  10. word排版的一些小技巧积累

    先准备好样式 编辑前,可以先根据要求,设置好样式,可以免去编辑好后,再修改格式(这样要改好多文本的格式) docx doc的样式不能通用. .docx转.doc 从word2013自带的编辑公式,编辑 ...