小闹钟程序课题设计报告_第1页
小闹钟程序课题设计报告_第2页
小闹钟程序课题设计报告_第3页
小闹钟程序课题设计报告_第4页
小闹钟程序课题设计报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业小闹钟VC程序设计报告一 课题内容和要求【问题描述】编一个小闹钟程序,运行后可以在指定的时间到时,在屏幕上显示提醒时间到的语句,并使得电脑发出了悠扬的乐声。二 需求分析1显示时间功能,即时显示当前时间2闹钟功能,能够根据用户设置的时间来提醒用户,可以通过声音或者文字提醒3时间设置功能,提供菜单设置时钟的当前时间和提醒的闹钟时间4界面设计,可模拟真实钟表界面,也可用数字界面显示,要求美观,实用和个性化三 详细设计该程序拥有四个源文件,分别为AlarmClock.cpp A

2、larmClockDlg.cpp RingDlg.cpp stdafx.cpp 如下图所示:其作用分别为AlarmClock.cpp : 定义应用程序的类行为AlarmClockDlg.cpp : 实现文件RingDlg.cpp : 实现文件另外stdafx.cpp : 只包括标准包含文件的源文件AlarmClock.pch 将作为预编译头stdafx.obj 将包含预编译类型信息 在闹钟设置面板上添加当前时间,通过文本框和标签设置需要设置的闹钟的时,分,秒。设置列表框提供闹钟的音乐供以选择。设置开关按钮决定闹钟的开始和结束另外于MFC播放背景音乐的问题解决如下:1.建立一个MFC的程序2.插

3、入资源(插入-资源-定制-(输入WAVA)3.在resources中找到WAVA文件,打开有个IDR_WAVA14.右键-import-浏览后缀名为.wav的音频文件5.在CMainFrame中的OnCreate函数中加入语句PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP); 6.在该文件的上方,添加头文件#include mmsystem.h7.(工程-设置-连接-库模板添加winmm.lib)8.编译运行即可程序源代码#inc

4、lude stdafx.h#include AlarmClock.h#include AlarmClockDlg.h#include afxdialogex.h#include RingDlg.h#include #ifdef _DEBUG#define new DEBUG_NEW#endif/ CAlarmClockDlg 对话框CAlarmClockDlg:CAlarmClockDlg(CWnd* pParent /*=NULL*/): CDialogEx(CAlarmClockDlg:IDD, pParent), m_hour(0), m_minute(0), m_second(0),

5、m_prompt(_T(时间到,闹钟响!)/载入图标m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);/默认响铃时长60秒iLast = 60;/试听状态标识为FALSEisListening = FALSE;/响铃状态标识为FALSE/isRinging = FALSE;/用不到void CAlarmClockDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);DDX_Control(pDX, IDC_STATIC_NOW, m_static_now);DDX_Con

6、trol(pDX, IDC_STATIC_LEFT, m_static_left);DDX_Text(pDX, IDC_EDIT_H, m_hour);DDV_MinMaxUInt(pDX, m_hour, 0, 23);DDX_Text(pDX, IDC_EDIT_M, m_minute);DDV_MinMaxUInt(pDX, m_minute, 0, 59);DDX_Text(pDX, IDC_EDIT_S, m_second);DDV_MinMaxUInt(pDX, m_second, 0, 59);DDX_Control(pDX, IDC_SPIN_H, m_spin_h);DDX_

7、Control(pDX, IDC_SPIN_M, m_spin_m);DDX_Control(pDX, IDC_SPIN_S, m_spin_s);DDX_Text(pDX, IDC_EDIT_PROMPT, m_prompt);DDV_MaxChars(pDX, m_prompt, 18);DDX_Control(pDX, IDC_COMBO_RING, m_combo_ring);BEGIN_MESSAGE_MAP(CAlarmClockDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_CTLCOLOR()ON_WM_TIMER(

8、)ON_NOTIFY(NM_CLICK, IDC_SYSLINK1, &CAlarmClockDlg:OnNMClickSyslink1)ON_BN_CLICKED(IDC_BUTTON_RESET, &CAlarmClockDlg:OnBnClickedButtonReset)ON_EN_CHANGE(IDC_EDIT_H, &CAlarmClockDlg:SetAlarmTime)ON_EN_CHANGE(IDC_EDIT_M, &CAlarmClockDlg:SetAlarmTime)ON_EN_CHANGE(IDC_EDIT_S, &CAlarmClockDlg:SetAlarmTim

9、e)ON_BN_CLICKED(IDC_BUTTON_LISTEN, &CAlarmClockDlg:OnBnClickedButtonListen)ON_CBN_SELCHANGE(IDC_COMBO_RING, &CAlarmClockDlg:OnCbnSelchangeComboRing)ON_MESSAGE(WM_NC, &CAlarmClockDlg:OnNotifyIcon)ON_WM_SYSCOMMAND()ON_WM_CLOSE()/ON_WM_DESTROY()END_MESSAGE_MAP()/ CAlarmClockDlg 消息处理程序BOOL CAlarmClockDl

10、g:OnInitDialog()CDialogEx:OnInitDialog();/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码/ 获得当前系统时间timeNow = CTime:GetCurrentTime();m_static_now.SetWindowTextW(timeNow.Format(_T(%H : %M : %S);/ 设置默认闹钟时间timeAlarm = timeNow ;m_sta

11、tic_left.SetWindowTextW(_T(00 : 00 : 00);m_hour = timeAlarm.GetHour();m_minute = timeAlarm.GetMinute();m_second = timeAlarm.GetSecond();m_spin_h.SetBuddy(GetDlgItem(IDC_EDIT_H);m_spin_h.SetRange(0,23);/m_spin_h.SetPos(m_hour);m_spin_m.SetBuddy(GetDlgItem(IDC_EDIT_M);m_spin_m.SetRange(0,59);/m_spin_m

12、.SetPos(m_minute);m_spin_s.SetBuddy(GetDlgItem(IDC_EDIT_S);m_spin_s.SetRange(0,59);/m_spin_s.SetPos(m_second);/试听铃声选第1组m_combo_ring.SetCurSel(0);/声音资源选第1组pszSound = MAKEINTRESOURCE(IDR_WAVE0);/设置字体LOGFONT logFont;fontBig = new CFont;GetDlgItem(IDC_STATIC_LEFT)-GetFont()-GetLogFont(&logFont);logFont.

13、lfHeight *= 1.5;logFont.lfWidth *= 1.5;logFont.lfWeight = FW_BOLD;fontBig-CreateFontIndirectW(&logFont);GetDlgItem(IDC_STATIC_LEFT)-SetFont(fontBig, FALSE);GetDlgItem(IDC_STATIC_BIG)-SetFont(fontBig, FALSE);fontSmall = new CFont;GetDlgItem(IDC_STATIC_INFO)-GetFont()-GetLogFont(&logFont);logFont.lfHe

14、ight *= 0.9;logFont.lfWidth *= 0.9;fontSmall-CreateFontIndirectW(&logFont);GetDlgItem(IDC_STATIC_INFO)-SetFont(fontSmall, FALSE);GetDlgItem(IDC_SYSLINK1)-SetFont(fontSmall, FALSE);/设置托盘NotifyIcon.hWnd = GetSafeHwnd();NotifyIcon.cbSize = sizeof(NOTIFYICONDATA);NotifyIcon.hIcon = AfxGetApp()-LoadIcon(

15、IDR_MAINFRAME);lstrcpy(NotifyIcon.szTip, _T(小小闹钟);NotifyIcon.uCallbackMessage = WM_NC;NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;Shell_NotifyIcon(NIM_ADD,&NotifyIcon);/ 刷新显示UpdateData(FALSE);/ 开启计时器,以1000ms为时间间隔SetTimer(1, 1000, NULL);return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CAlarmClockDlg:

16、OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (r

17、ect.Height() - cyIcon + 1) / 2;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/当用户拖动最小化窗口时系统调用此函数取得光标显示HCURSOR CAlarmClockDlg:OnQueryDragIcon()return static_cast(m_hIcon);HBRUSH CAlarmClockDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)HBRUSH hbr = CDialogEx:OnCtlColor(pDC, pWnd, nCtl

18、Color);/ TODO: 在此更改 DC 的任何特性switch (pWnd-GetDlgCtrlID()case IDC_STATIC_BIG:pDC-SetBkMode(TRANSPARENT);pDC-SetTextColor(RGB(255, 0, 0);break;case IDC_STATIC_NOW:pDC-SetBkMode(TRANSPARENT);pDC-SetTextColor(RGB(0, 0, 0);/pDC-SetBkColor(RGB(0,0,255);hbr = CreateSolidBrush(RGB(0,0,255);break;case IDC_STA

19、TIC_LEFT:pDC-SetBkMode(TRANSPARENT);pDC-SetTextColor(RGB(255, 255, 255);hbr = CreateSolidBrush(RGB(0,0,0);break;/ TODO: 如果默认的不是所需画笔,则返回另一个画笔return hbr;void CAlarmClockDlg:OnNMClickSyslink1(NMHDR *pNMHDR, LRESULT *pResult)/ TODO: 在此添加控件通知处理程序代码PNMLINK pNMLink = (PNMLINK) pNMHDR;if (wcslen(pNMLink-ite

20、m.szUrl)ShellExecuteW(NULL, Lopen, pNMLink-item.szUrl, NULL, NULL, SW_SHOWNORMAL); /打开主页*pResult = 0;void CAlarmClockDlg:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息处理程序代码和/或调用默认值switch(nIDEvent)case 1:/每隔1秒更新一下显示数值timeNow = CTime:GetCurrentTime();timeLeft = timeAlarm - timeNow;m_static_now.SetWindowTex

21、tW(timeNow.Format(_T(%H : %M : %S);if(timeLeft DeleteObject();fontSmall-DeleteObject();delete fontBig;delete fontSmall;/删除托盘图标Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);return CDialogEx:DestroyWindow();void CAlarmClockDlg:SetAlarmTime()/ 以当前各文本框内容设置闹钟时间UpdateData(TRUE);tm alarm;timeNow.GetLocalTm(&al

22、arm);alarm.tm_hour = m_hour;alarm.tm_min = m_minute;alarm.tm_sec = m_second;timeAlarm = _mktime64(&alarm);/如果定时时间小于当前时间,将之推迟一天if(timeAlarm timeNow)timeAlarm += CTimeSpan(1,0,0,0);timeLeft = timeAlarm - timeNow;/设置闹钟定时if(timeLeft = 0)KillTimer(2);/取消闹钟定时elseSetTimer(2, timeLeft.GetTotalSeconds()*1000

23、, NULL);/设置闹钟定时m_static_left.SetWindowTextW(timeLeft.Format(_T(%H : %M : %S);void CAlarmClockDlg:SetAlarmTime(const CTime &tAlarm)/ 以tAlarm设置闹钟时间UpdateData(TRUE);timeAlarm = tAlarm;m_hour = timeAlarm.GetHour();m_minute = timeAlarm.GetMinute();m_second = timeAlarm.GetSecond();/m_spin_h.SetPos(m_hour)

24、;/m_spin_m.SetPos(m_minute);/m_spin_s.SetPos(m_second);timeLeft = timeAlarm - timeNow;if(timeLeft SetFocus();/CDialogEx:OnOK();void CAlarmClockDlg:OnBnClickedButtonReset()/ TODO: 在此添加控件通知处理程序代码SetAlarmTime(timeNow);void CAlarmClockDlg:OnCbnSelchangeComboRing()/ TODO: 在此添加控件通知处理程序代码/ 根据列表框选择铃声switch(

25、m_combo_ring.GetCurSel()case 1:pszSound = MAKEINTRESOURCE(IDR_WAVE1);break;case 2:pszSound = MAKEINTRESOURCE(IDR_WAVE2);break;case 0:default:pszSound = MAKEINTRESOURCE(IDR_WAVE0);void CAlarmClockDlg:OnBnClickedButtonListen()/ TODO: 在此添加控件通知处理程序代码if(isListening)/ 如果当前处于试听状态/关闭试听状态isListening = FALSE;

26、/改按钮标签为“试听”GetDlgItem(IDC_BUTTON_LISTEN)-SetWindowTextW(_T(试听);/改下拉框状态为可选m_combo_ring.EnableWindow(TRUE);/关闭声音PlaySound(NULL,AfxGetResourceHandle(),SND_PURGE);else/ 如果当前不在试听状态/打开试听状态isListening = TRUE;/改按钮标签为“停止”GetDlgItem(IDC_BUTTON_LISTEN)-SetWindowTextW(_T(停止);/改下拉框状态为不可选m_combo_ring.EnableWindow

27、(FALSE);/打开声音PlaySound(pszSound,AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);void CAlarmClockDlg:Ring()/如果当前处于试听状态,关闭试听状态if(isListening)OnBnClickedButtonListen();/响铃对话框RingDlg dlg;/响铃对话框数据设置dlg.SetData(pszSound, iLast, m_prompt);INT_PTR nResponse = dlg.DoModal();if (nRespons

28、e = IDOK)/ 如选择“好了,我知道了!退下吧。”PostQuitMessage(0);/完成任务,退出else if (nResponse = IDCANCEL)/ 如选择“xx分钟后再提醒我!”UINT delay = dlg.GetDelay();timeNow = CTime:GetCurrentTime();SetAlarmTime(timeNow + CTimeSpan(0,0,delay,0);/设置延时afx_msg LRESULT CAlarmClockDlg:OnNotifyIcon(WPARAM wParam, LPARAM lParam)/if(wParam !=

29、 IDR_MAINFRAME)/return 1;switch(lParam)case WM_RBUTTONUP:/右键起来时弹出快捷菜单LPPOINT lpoint=new tagPOINT;:GetCursorPos(lpoint);/得到鼠标位置CMenu menu;menu.CreatePopupMenu();/声明一个弹出式菜单/增加菜单项“退出”,点击则发送消息WM_DESTROY给主窗口,将程序结束。menu.AppendMenu(MF_STRING,WM_DESTROY,_T(退出);/托盘弹出控制菜单后,单击其他地方或者按ESC键使托盘菜单消失SetForegroundWindow();/确定弹出式菜单的位置menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint-x,lpoint-y,this);/资源回收HMENU hmenu = menu.Detach();menu.DestroyMenu();delete lpoint;break;case WM_LBUTTONDOWN:/按下左键的处理Sho

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论