一个可以运动的音乐贺卡

我在前两篇博客中介绍了如何制作音乐贺卡,分别用了嵌入式和链接式实现播放音乐,在此就不做介绍,想了解相关信息,请参考我前面写的关于音乐贺卡的博客


在看这篇博客时,需要将位图,图标,音乐文件都插入到了音乐贺卡中,插入后的界面


完成了上面的工作后,就是写代码


在写代码前先介绍几个函数


函数名:TimerProc

函数功能:回调函数

函数原型: VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)

参数:

hwnd  程序的句柄

message: Windows信息

iTimerID:定时器的ID

dwTime:表示多长时间调用一次回调函数

参考文章:TimerProc函数


函数名: GetWindowDC

函数功能:获得设备环境句柄

函数原型:

HDC GetWindowDC(
  _In_  HWND hWnd
);


参数: hWnd  窗口句柄

返回值: HDC 设备环境句柄

参考文章:GetWindowDC函数


函数名:GetDeviceCaps
函数功能: 获得设备的参数

函数原型:

int GetDeviceCaps(
  _In_  HDC hdc,
  _In_  int nIndex
);

参数: hdc 设备的环境句柄     nindex  设备的项目

参考文章:GetDeviceCaps函数


函数名:ReleaseDC

函数功能:释放设备的环境句柄

函数原型:

int ReleaseDC(
  _In_  HWND hWnd,
  _In_  HDC hDC
);

参数:

hWnd: 窗口句柄

hDC : 设备环境句柄

参考文章:ReleaseDC函数


函数名:MoveWindow

函数功能:移动窗口

函数原型:

BOOL WINAPI MoveWindow(
  _In_  HWND hWnd,
  _In_  int X,
  _In_  int Y,
  _In_  int nWidth,
  _In_  int nHeight,
  _In_  BOOL bRepaint
);

参数:

x : 窗口的位置(x坐标)

y: 窗口的位置(y坐标)

nWidth : 窗口的宽度

nHeight:窗口的高度

bRepaint:是否要重画

参考文章:MoveWindow函数


函数名:SetTimer

函数功能:定义一个定时器

函数原型:

UINT_PTR WINAPI SetTimer(
  _In_opt_  HWND hWnd,
  _In_      UINT_PTR nIDEvent,
  _In_      UINT uElapse,
  _In_opt_  TIMERPROC lpTimerFunc
);


参数:

hWnd:窗口的句柄

nIDEVENT:定时器的ID

uElapse:多久调用一次回调函数

lpTimerFunC :回调函数

 

参考文章:SetTimer函数


程序代码:

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include "resource.h"
#include "MainDlg.h"


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;
}

int size_1 = -1;
int size_2 = -1;

int X = 0;
int Y = 0;

//改变贺卡左右运动的运动方向
void FuncChange_X()
{
	size_1 = -size_1;
}

//改变贺卡上下运动的运动方向
void FuncChange_Y()
{
	size_2 = -size_2;
}

//回调函数
void CALLBACK TimerProc(HWND hwnd , UINT message, UINT iTimerID, DWORD dwTime)
{
	//得到设备环境句柄
	HDC hdc = GetWindowDC(hwnd);

	//得到贺卡的宽度
	int Wide = GetDeviceCaps(hdc,HORZRES);

	//得到贺卡的高度
	int High = GetDeviceCaps(hdc,VERTRES);

	//当贺卡移动到左边界或者右边界时
	if((0 == X) || (Wide-550==X))
	{
		FuncChange_X();//改变贺卡的移动方向
	}

	//当贺卡移动到上边界或者下边界时
	if((0 == Y) || (High-430== Y))
	{
		FuncChange_Y();//改变贺卡的移动方向
	}

	//移动贺卡
	MoveWindow(hwnd,X+size_1,Y+size_2,550,400,TRUE);

	X += size_1;

	Y += size_2;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
	/*在窗口的标题栏上显示图标*/
	SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));
  
	//得到程序的实例句柄
	HINSTANCE hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);    
 
	//播放音乐
	PlaySound(MAKEINTRESOURCE(IDR_WAVE1),hinstance,SND_RESOURCE|SND_ASYNC);    

	//定时器
	SetTimer(hwnd,0,0.1,TimerProc);

    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)
{
    EndDialog(hwnd, 0);
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值