最近我总是在想如何在程序中添加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);
}
执行结果