我在前两篇博客中介绍了如何制作音乐贺卡,分别用了嵌入式和链接式实现播放音乐,在此就不做介绍,想了解相关信息,请参考我前面写的关于音乐贺卡的博客
在看这篇博客时,需要将位图,图标,音乐文件都插入到了音乐贺卡中,插入后的界面
完成了上面的工作后,就是写代码
在写代码前先介绍几个函数
函数名: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);
}
运行结果:
点击下载生日贺卡
217

被折叠的 条评论
为什么被折叠?



