最近我总是在想如何在程序中添加gif动画使其看起来像QQ邮箱中的贺卡一样即会动又会播放音乐,功夫不负有心人,我终于在网上找到了一些相关的博客,就是上一篇转载的博客位图的应用,看了一下也跟着博客做出了数字时钟,做完后我就想将代码移到DialogBasedApplication上居然成功了,我就利用这篇博客中不停的加载位图的方法,居然成功了,做成了像QQ邮箱中那样的贺卡
在制作前还是老规矩需要准备几张位图和图标文件以及一个WAV格式的音乐文件
位图还要有点特色,最好是一个动画的动作图,我是在网上找了一个简单的gif动画,用暴风影音中自带的截图工具将每个动作截图,然后将图片转换成位图
图片
程序代码:
#include "stdafx.h" #include <windows.h> #include <windowsx.h> #include <mmsystem.h> #include "resource.h" #include "MainDlg.h" HBITMAP hBitmap;//位图句柄 int x,y;//位图的位置 int cxBitmap, cyBitmap;//位图的宽度和位图的高度 BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose); } return FALSE; } //回调函数 void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { BITMAP bitmap;//位图结构 //得到数字时钟的实例句柄 HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); for(int i=1;i<=6;i++) { if(1 == i) { //加载位图 hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); } else if(2 == i) { hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2)); } else if(3 == i) { hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3)); } else if(4 == i) { hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP4)); } else if(5 == i) { hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP5)); } else if(6 == i) { hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP6)); } //得到位图的信息 GetObject(hBitmap, sizeof(BITMAP), &bitmap); cxBitmap = bitmap.bmWidth;//位图的宽度 cyBitmap = bitmap.bmHeight;;//位图的高度 HDC hdc;//设备环境句柄 hdc = GetDC(hwnd);//得到设备环境句柄 HDC hdcMem;//设备环境句柄 //创建一个与DC兼容的设备环境 hdcMem = CreateCompatibleDC(hdc); //选择位图 SelectObject(hdcMem,hBitmap); //处理位图 BitBlt(hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRCCOPY); /* hdc:表示设备环境句柄 0:表示时间显示区在矩形框中的位置的横坐标 0:表示时间显示区在矩形框中的位置的纵坐标 cxBitmap:位图的宽度 cyBitmap:每个数字的高度 hdcMem:设备环境句柄 0:位图中的X坐标 0:位图中的Y坐标 */ Sleep(1000);//停顿1秒钟 DeleteDC(hdcMem);//释放环境句柄 ReleaseDC(hwnd, hdc);//释放环境句柄 } } BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { /*在窗口的标题栏上显示图标*/ SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))); //设定定时器 SetTimer(hwnd, 1,1,TimerProc); //得到程序的实例句柄 HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); //播放音乐 PlaySound(MAKEINTRESOURCE(IDR_WAVE1),hinstance,SND_RESOURCE|SND_ASYNC | SND_LOOP); return TRUE; } void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch(id) { case IDC_OK: { } break; default: break; } } void Main_OnClose(HWND hwnd) { exit(0); }
执行结果
原文:http://blog.csdn.net/u010105970/article/details/19613079