位图的应用(七夕情人节贺卡)

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

执行结果


点击下载贺卡

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值