MFC实现简单的小闹钟

合集下载

MFC时钟教程

MFC时钟教程

一、表盘设置模块1、设计表盘设置对话框:IDD_SET_SCALE,生成ScaleSetDlg类圆形ID:IDC_ELLIPSE;方形:IDC_RECT;菱形:IDC_RHOMBUS;三角形:IDC_TRIANGLE选择:IDC_OTHER反色:IDC_O金色:IDC_GLOD确定:IDOK;取消:IDCANCLE2、为圆形单选按钮通过类向导添加关联变量IDC_ELLIPSE:int m_type;反色IDC_O:int m_logColor为类添加一个颜色变量COLORREF m_color;3、重载Onpaint()函数:当windows或应用程序请求重画应用程序窗口的一部分时,调用该函数。

void ScaleSetDlg::OnPaint(){CPaintDC dc(this);//设备上下文环境描述符CPen penBorder(PS_SOLID, 1, RGB(255, 255, 255));//白色画笔CPen *ppenOld = dc.SelectObject(&penBorder);//将白色画笔选入设备CBrush brPoint(m_color);//刻度颜色的画刷CBrush* pbrOld = dc.SelectObject(&brPoint);//将刻度颜色的画刷选入设备CRect rectLogcolor;GetDlgItem(IDC_OTHER)->GetWindowRect(&rectLogcolor);//获取空间相对于屏幕位置ScreenToClient(rectLogcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectLogcolor.left + 5, rectLogcolor.top - 25, rectLogcolor.right - 5, rectLogcolor.bottom - 15), &brPoint);dc.SelectObject(ppenOld);//恢复设备最初的画笔dc.SelectObject(pbrOld);//恢复设备最初的画刷}4 为选择按钮添加OnOther()void ScaleSetDlg::OnBnClickedOther(){// TODO: 在此添加控件通知处理程序代码CColorDialog dlg;//CColorDiaDlg里面含有CHOOSECOLOR结构体,而该结构体中的rgbResult含有用户选择的颜色值dlg.m_cc.Flags |= CC_RGBINIT;//颜色对话框,CC_RGBINIT让对话框默认使用由rgbResult指定的颜色dlg.m_cc.rgbResult = m_color;//对话框属性if (IDOK == dlg.DoModal())//CColorDiaDlg::DoModal():返回值为IDOK或IDCANCLE{m_color = dlg.m_cc.rgbResult;//获取用户输入的颜色值Invalidate();}}二、表盘的绘制模块1:创建CClockScale类,添加变量:#include"DeskClock.h"#include <math.h>#define PI 3.1415926COLORREF m_color;//刻度颜色int m_logColor;CPoint m_ptMiddle;//表盘的中心点UINT m_nPointWidth;//表盘刻度之间的宽度MAJORTYPE m_style;//刻度的样式void SetScaleStyle(MAJORTYPE type);void SetScaleColor(COLORREF colorref);void SetLogColor(int color);MAJORTYPE GetScaleStyle();COLORREF GetScaleColor();int GetLogColor();在stdafx.h中定义枚举类型变量:enum MAJORTYPE{TYPE_ELLIPSE = 0,//圆形TYPE_RECT=1,//方形TYPE_RHOMBUS=2,//菱形TYPE_TRIANGLE=3//三角形};2,构造函数:m_color = 0xFF0000;m_style = TYPE_RHOMBUS;m_logColor = 0;3,为所有属性生成set 和get方法在.h中先声明方法:void CClockScale::SetScaleStyle(MAJORTYPE type){m_style = type;}void CClockScale::SetScaleColor(COLORREF colorref) {m_color = colorref;}void CClockScale::SetLogColor(int color){m_logColor = color;}MAJORTYPE CClockScale::GetScaleStyle(){return m_style;}COLORREF CClockScale::GetScaleColor(){return m_color;}int CClockScale::GetLogColor(){return m_logColor;}4,添加位图资源,IDB_LOG, IDB_LOGMASK编写表盘绘制函数void DrawScale(CDC *pDC, CPoint &ptMiddle);void CClockScale::DrawScale(CDC *pDc,CPoint &ptMiddle) {//计算钟面的中心位置m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;if (m_ptMiddle.y < 0){m_ptMiddle.y = 0;}//计算钟面的半径UINT nRidius = min(m_ptMiddle.x,m_ptMiddle.y);//计算两个刻度之间的距离m_nPointWidth = (int)nRidius/20;// 绘制LOGCBitmap maskbmp,logbmp;maskbmp.LoadBitmap(IDB_LOGMASK);logbmp.LoadBitmap(IDB_LOG);CDC MaskDC,memDC;MaskDC.CreateCompatibleDC(pDc);MaskDC.SelectObject(&maskbmp);memDC.CreateCompatibleDC(pDc);memDC.SelectObject(&logbmp);if(m_nPointWidth > 8){if(m_logColor == 0 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,SRCAND);//该函数对指定的源设备环境区域中的像素进行位块转换,以传送到目标设备环境pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,MERGEPAINT);}else if(m_logColor == 1 ){pDc->BitBlt(m_ptMiddle.x - 25 ,ptMiddle.y - nRidius * 0.7,96,96,&MaskDC,0,0,MERGEPAINT);pDc->BitBlt(m_ptMiddle.x - 25,ptMiddle.y - nRidius * 0.7,96,96,&memDC,0,0,SRCAND);}}if (m_nPointWidth < 2){m_nPointWidth = 2;}//保存各个刻度点的位置CPoint ptFace;//设置刻度点的颜色CBrush brPoint(m_color);CBrush* pbrOld = pDc->SelectObject(&brPoint);//刻度所在的圆半径为钟面半径的90%int nFaceLength = MulDiv(nRidius,9,10);//绘制各个刻度for (int nMin=0; nMin<60; nMin++){//bHour为假表示绘制的是分钟刻度BOOL bHour = FALSE;//计算一个刻度点的位置ptFace = ComputerFacePoint(nMin,nFaceLength);//当分钟数是5的倍数时,bHour为真表示绘制小时刻度if (nMin%5==0){bHour = true;}//绘制一个刻度点DrawFacePoint(pDc,ptFace,bHour);}pDc->SelectObject(pbrOld);return;}5,编写计算刻度函数CPoint ComputerFacePoint(UINT min, int nFaceLength)CPoint CClockScale::ComputerFacePoint(UINT min, int nFaceLength){CPoint ptCalc;//将分钟转换为角度数double fDegrees = 180+((15+min)%60)*6;//再转换为弧度数double fAngle = fDegrees/180;//计算刻度点位置ptCalc.x = m_ptMiddle.x + (int)(cos(fAngle*PI)*nFaceLength);ptCalc.y = m_ptMiddle.y + (int)(sin(fAngle*PI)*nFaceLength);//返回刻度点位置return(ptCalc);}6,编写刻度绘制函数void DrawFacePoint(CDC *pDC, const CPoint &ptFace, BOOL bMajor)void CClockScale::DrawFacePoint(CDC *pDC, const CPoint &ptFace, BOOL bMajor){CRect rectPoint(ptFace.x,ptFace.y,ptFace.x,ptFace.y);//绘制小时刻度点if (bMajor){//增加高度和宽度,使单点变为小的矩形区rectPoint.InflateRect((m_nPointWidth/2)+2,(m_nPointWidth/2)+2);DrawMajor(pDC, m_style,rectPoint);}//绘制分钟刻度点else{//只有当刻度点之间的距离足够大时才绘制if (m_nPointWidth > 2){rectPoint.InflateRect(1,1);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(CO LOR_BTNSHADOW));//COLOR_BTNHIGHLIGHT表示加亮区,COLOR_BTNSHADOW表示按钮的3d阴影}}return;}7,编写表盘小时刻度函数void DrawMajor(CDC *pDC, MAJORTYPE type, CRect rectPoint)void CClockScale::DrawMajor(CDC *pDC, MAJORTYPE type, CRect rectPoint)CPen *oldPen;CPoint ptRhombus[4] ;CPen penBorder(PS_SOLID,1,RGB(255,255,255));switch(type){case TYPE_ELLIPSE:pDC->Ellipse(rectPoint);break;case TYPE_RECT:pDC->Rectangle(&rectPoint);pDC->Draw3dRect(&rectPoint,GetSysColor(COLOR_BTNHIGHLIGHT),GetSysColor(CO LOR_BTNSHADOW));break;case TYPE_RHOMBUS:oldPen = pDC->SelectObject(&penBorder);ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[3].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[3].y = rectPoint.bottom;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,4);pDC->SelectObject(oldPen);break;case TYPE_TRIANGLE:oldPen = pDC->SelectObject(&penBorder);ptRhombus[0].x = rectPoint.left;ptRhombus[0].y = rectPoint.top + rectPoint.Height()/2;ptRhombus[1].x = rectPoint.left + rectPoint.Width()/2;ptRhombus[1].y = rectPoint.top;ptRhombus[2].x = rectPoint.right;ptRhombus[2].y = rectPoint.top + rectPoint.Height()/2;pDC->Polygon(ptRhombus,3);pDC->SelectObject(oldPen);break;}}三:表针模块的设计与实现:1设计对话框IDD_SET_HAND,生成HandSetDlg类时针边框颜色选择:IDC_HBCOLOR指针颜色:IDC_HCOLOR分针边框:IDC_MBCOLOR,指针:IDC_MCOLOR秒针:IDC_SBCOLOR2,为对话框类添加变量:COLORREF m_HbordColor; // 时针边框颜色COLORREF m_HColor;//时针实体颜色COLORREF m_MbordColor;//分针边框颜色COLORREF m_MColor;//分针实体颜色COLORREF m_SbordColor;//秒针颜色3,重载OnPaint()void HandSetDlg::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用 CDialog::OnPaint()CPen penBorderH(PS_SOLID, 1, RGB(200, 200, 200));CPen *ppenOld = dc.SelectObject(&penBorderH);//绘制时针边框颜色CBrush brPointH(m_HbordColor);CBrush* pbrOld = dc.SelectObject(&brPointH);CRect rectHbcolor;GetDlgItem(IDC_HBCOLOR)->GetWindowRect(&rectHbcolor);//获取空间相对于屏幕位置ScreenToClient(rectHbcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectHbcolor.left+5,rectHbcolor.top-25,rectHbcolor.right-5,rectHbc olor.bottom-15),&brPointH);//绘制时针实体颜色CBrush brH(m_HColor);dc.SelectObject(&brH);CRect rectHcolor;GetDlgItem(IDC_HCOLOR)->GetWindowRect(&rectHcolor);//获取空间相对于屏幕位置ScreenToClient(rectHcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectHcolor.left + 5, rectHcolor.top - 28, rectHcolor.right - 5, rectHcolor.bottom - 18), &brH);//绘制分针边框颜色CBrush brPointM(m_MbordColor);dc.SelectObject(&brPointM);CRect rectMbcolor;GetDlgItem(IDC_MBCOLOR)->GetWindowRect(&rectMbcolor);//获取空间相对于屏幕位置ScreenToClient(rectMbcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectMbcolor.left + 5, rectMbcolor.top - 28, rectMbcolor.right - 5, rectMbcolor.bottom - 18), &brPointM);//绘制分针实体颜色CBrush brM(m_MColor);dc.SelectObject(&brM);CRect rectMcolor;GetDlgItem(IDC_MCOLOR)->GetWindowRect(&rectMcolor);//获取空间相对于屏幕位置ScreenToClient(rectMcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectMcolor.left + 5, rectMcolor.top - 28, rectMcolor.right - 5, rectMcolor.bottom - 18), &brM);//绘制秒针颜色CBrush brS(m_SbordColor);dc.SelectObject(&brS);CRect rectSbcolor;GetDlgItem(IDC_SBCOLOR)->GetWindowRect(&rectSbcolor);//获取空间相对于屏幕位置ScreenToClient(rectSbcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectSbcolor.left + 5, rectSbcolor.top - 28, rectSbcolor.right - 5, rectSbcolor.bottom - 18), &brM);//恢复设备对象dc.SelectObject(ppenOld);dc.SelectObject(pbrOld);}4,为颜色选择对话框添加处理函数:void HandSetDlg::OnBnClickedHbcolor(){// TODO: 在此添加控件通知处理程序代码CColorDialog dlg;//颜色对话框dlg.m_cc.Flags |= CC_RGBINIT;//颜色对话框属性dlg.m_cc.rgbResult = m_HbordColor;//当前指针边框颜色显示到颜色对话框上if (IDOK == dlg.DoModal())//显示颜色对话框{m_HbordColor = dlg.m_cc.rgbResult;//获取用户选择的颜色Invalidate();//重绘界面}// TODO: 在此添加控件通知处理程序代码}void HandSetDlg::OnBnClickedHcolor(){// TODO: Add your control notification handler code hereCColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_HColor;if (IDOK == dlg.DoModal()){m_HColor = dlg.m_cc.rgbResult;Invalidate();} // TODO: 在此添加控件通知处理程序代码}void HandSetDlg::OnBnClickedMbcolor(){CColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_MbordColor;if (IDOK == dlg.DoModal()){m_MbordColor = dlg.m_cc.rgbResult;Invalidate();} // TODO: 在此添加控件通知处理程序代码}void HandSetDlg::OnBnClickedMcolor(){CColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_MColor;if (IDOK == dlg.DoModal()){m_MColor = dlg.m_cc.rgbResult;Invalidate();}//TODO: 在此添加控件通知处理程序代码}void HandSetDlg::OnBnClickedSbcolor(){// TODO: 在此添加控件通知处理程序代码CColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_SbordColor;if (IDOK == dlg.DoModal()){m_SbordColor = dlg.m_cc.rgbResult;Invalidate();}四:表针绘制模块:1,创建CClockHand类,添加变量和函数声明:CPoint m_ptMiddle;// 圆心UINT m_nPointWidth;//刻度之间的宽度double m_nRidius;//表盘半径COLORREF m_HbordColor;//时针边框颜色COLORREF m_HColor;//时针实体颜色COLORREF m_MbordColor;//分针边框颜色COLORREF m_MColor;//分针实体颜色COLORREF m_SbordColor;//秒针颜色void SetHandColor(COLORREF hBColor, COLORREF hColor, COLORREF mBColor, COLORREF mColor, COLORREF sColor);void GetHandColor(COLORREF &hBColor, COLORREF &hColor, COLORREF &mBColor, COLORREF &mColor, COLORREF &sColor);void GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand, CTime oTime);void DrawHand(CDC*pDC, int nValue, HANDTYPE typeHand, CPoint&ptMiddle, CTime oTime); 2,在stdAfx.h中定义HANDTYPEenum HANDTYPE{HOUR_HAND,MINUTE_HAND,SECOND_HAND};3,编写构造函数:CClockHand::CClockHand(): m_ptMiddle(0){m_HbordColor = RGB(255, 255, 255);m_HColor = RGB(128, 128, 0);m_MbordColor = RGB(255, 255, 255);m_MColor = RGB(0, 128, 128);m_SbordColor = RGB(255, 128, 128);}4,编写Set和Get方法void CClockHand::SetHandColor(COLORREF hBColor, COLORREF hColor, COLORREF mBColor, COLORREF mColor, COLORREF sColor){m_HbordColor = hBColor;m_HColor = hColor;m_MbordColor = mBColor;m_MColor = mColor;m_SbordColor = sColor;}void CClockHand::GetHandColor(COLORREF &hBColor, COLORREF &hColor, COLORREF &mBColor, COLORREF &mColor, COLORREF &sColor){hBColor = m_HbordColor;hColor = m_HColor;mBColor = m_MbordColor;mColor = m_MColor;sColor = m_SbordColor;}5根据表针类型以及时间计算对应的表针的坐标的函数注意前面加#include “CClockScale.h”void GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand,CTime oTime);void CClockHand::GetHandPoints(int nValue, HANDTYPE typeHand, CPoint *pptHand,CTime oTime) {UINT nMinute = oTime.GetMinute();CClockScale Scale;Scale.m_ptMiddle.x = m_ptMiddle.x;Scale.m_ptMiddle.y = m_ptMiddle.y;int nLength = 0;//根据指针的类型区分switch(typeHand){case HOUR_HAND://时针长为钟面半径的一半nLength = MulDiv(m_nRidius, 50, 100);//因为绘制时针按照分针进行,故需要一些变换nValue *= 5;nValue += (nMinute/12);break;case MINUTE_HAND:nLength = MulDiv(m_nRidius, 70, 100);break;case SECOND_HAND:nLength = MulDiv(m_nRidius, 80, 100);break;default:ASSERT(false);}//得到时针和分针外形的四个点if (typeHand == HOUR_HAND || typeHand == MINUTE_HAND){pptHand[0] = puterFacePoint(nValue+30,m_nPointWidth*2);pptHand[1] = puterFacePoint(nValue+15,m_nPointWidth);pptHand[2] = puterFacePoint(nValue,nLength);pptHand[3] = puterFacePoint(nValue-15,m_nPointWidth);}//得到秒针的两个端点else{pptHand[0] = m_ptMiddle;pptHand[1] = puterFacePoint(nValue,nLength);}}6、编写绘制时针指针的函数:void DrawHand(CDC *pDC,int nValue,HANDTYPE typeHand,CPoint &ptMiddle,CTime oTime);void CClockHand::DrawHand(CDC *pDC, int nValue,HANDTYPE typeHand,CPoint &ptMiddle,CTime oTime){m_ptMiddle.x = ptMiddle.x;m_ptMiddle.y = ptMiddle.y;m_nRidius = min(m_ptMiddle.x,m_ptMiddle.y);m_nPointWidth = (int)m_nRidius/20;CPoint ptHand[4];//得到指针的位置GetHandPoints(nValue,typeHand,ptHand, oTime);CBrush brHandH(m_HColor);CPen penHandH(PS_SOLID,1,m_HbordColor);CBrush brHandM(m_MColor);CPen penHandM(PS_SOLID,1,m_MbordColor);CPen penrgb(PS_SOLID,1,m_SbordColor);switch(typeHand){case HOUR_HAND://设置画刷、画笔pDC->SelectObject(&brHandH);pDC->SelectObject(&penHandH);//绘制一个四边形pDC->Polygon(ptHand,4);break;case MINUTE_HAND://设置画刷、画笔pDC->SelectObject(&brHandM);pDC->SelectObject(&penHandM);//绘制一个四边形pDC->Polygon(ptHand,4);break;case SECOND_HAND:pDC->SelectObject(&penrgb);pDC->MoveTo(ptHand[0]);pDC->LineTo(ptHand[1]);break;}}五:数字时钟设置模块:1,设计对话框IDD_SET_NUMTIME:生成NumTimeSeTDlg类表盘内:IDC_IN ;表盘外:IDC_OUT;自定义:IDC_USER;表盘内位置:IDC_COMIN;外:IDC_COMOUTX坐标:IDC_COMX;Y坐标:IDC_COMY;定制...:IDC_COLOR;隐藏:IDC_HIDE;显示:IDC_SHOW;2,添加NumTimeSetDlg类,为控件添加关联变量:IDC_COMIN 类型:CComboBox 变量名:m_comIn;IDC_COMOUT 类型:CComboBox 变量名:m_comOutIDC_COMX;int m_x;IDC_COMY:int m_y;IDC_HIDE:int m_show;IDC_IN :int m_position;IDC_CHECK1:BOOL m_bgColor;添加控制状态的变量:int m_inType;//表盘b内位置int m_outType;//表盘外位置COLORREF m_color;//字体颜色3,添加初始化函数OnInitDiaLog()CDialog::OnInitDialog();// TODO: Add extra initialization herem_comIn.InsertString(0, _T("正上方"));m_comIn.InsertString(1, _T("正下方"));m_comIn.InsertString(2, _T("正左方"));m_comIn.InsertString(3, _T("正右方"));m_comIn.SetCurSel(m_inType);m_comOut.InsertString(0, _T("左上角"));m_comOut.InsertString(1, _T("右上角"));m_comOut.InsertString(2, _T("左下角"));m_comOut.InsertString(3, _T("右下角"));m_comOut.InsertString(4, _T("上侧居中"));m_comOut.InsertString(5, _T("下侧居中"));m_comOut.InsertString(6, _T("左侧居中"));m_comOut.InsertString(7, _T("右侧居中"));m_comOut.SetCurSel(m_outType);SetPositionEnable();return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE4,编写SetPositionEnable()单选位置函数void NumTimeSetDlg::SetPositionEnable(){switch(m_position){case 0:GetDlgItem(IDC_COMIN)->EnableWindow(true);GetDlgItem(IDC_COMOUT)->EnableWindow(false);GetDlgItem(IDC_COMX)->EnableWindow(false);GetDlgItem(IDC_COMY)->EnableWindow(false);break;case 1:GetDlgItem(IDC_COMIN)->EnableWindow(false);GetDlgItem(IDC_COMOUT)->EnableWindow(true);GetDlgItem(IDC_COMX)->EnableWindow(false);GetDlgItem(IDC_COMY)->EnableWindow(false);break;case 2:GetDlgItem(IDC_COMIN)->EnableWindow(false);GetDlgItem(IDC_COMOUT)->EnableWindow(false);GetDlgItem(IDC_COMX)->EnableWindow(true);GetDlgItem(IDC_COMY)->EnableWindow(true);break;}}5,为控件添加处理函数(1)void NumTimeSetDlg::OnIn(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);//获取用户选中状态,UpdateData(true):将控件的值赋值给成员变量,即从窗口编辑框中读取数据,若为false,将成员变量的值赋值给相关联的控件SetPositionEnable();//使能设置}(2)void NumTimeSetDlg::OnOut(){// TODO: Add your control notification handler code hereUpdateData(true);SetPositionEnable();}(3)void NumTimeSetDlg::OnUser(){// TODO: Add your control notification handler code here UpdateData(true);SetPositionEnable();}(4)void NumTimeSetDlg::OnSelchangeComin(){// TODO: Add your control notification handler code here m_inType = m_comIn.GetCurSel();}(5)void NumTimeSetDlg::OnSelchangeComout(){// TODO: Add your control notification handler code here m_outType = m_comOut.GetCurSel();}(6)void NumTimeSetDlg::OnColor(){// TODO: Add your control notification handler code here CColorDialog dlg;dlg.m_cc.Flags|=CC_RGBINIT ;dlg.m_cc.rgbResult=m_color;if(IDOK==dlg.DoModal()){m_color = dlg.m_cc.rgbResult;Invalidate();}}(7)void NumTimeSetDlg::OnHide(){// TODO: Add your control notification handler code here UpdateData(true);}(8)void NumTimeSetDlg::OnShow(){// TODO: Add your control notification handler code here UpdateData(true);}6重写OnPaint()实现将字体颜色绘制到窗体上的功能:void NumTimeSetDlg::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCPen penBorder(PS_SOLID, 1, RGB(200, 200, 200));CPen *ppenOld = dc.SelectObject(&penBorder);CBrush brPoint(m_color);CBrush* pbrOld = dc.SelectObject(&brPoint);CRect rectcolor;GetDlgItem(IDC_COLOR)->GetWindowRect(&rectcolor);//获取空间相对于屏幕位置ScreenToClient(rectcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectcolor.left + 5, rectcolor.top - 25, rectcolor.right - 5, rectcolor.bottom - 15), &brPoint);dc.SelectObject(ppenOld);//恢复设备最初的画笔dc.SelectObject(pbrOld);//恢复设备最初的画刷}六,数字时钟绘制模块:1,添加CClockNum类,添加变量:public:int m_inType;//表盘内的位置int m_outType;//表盘外的位置int m_position;//数字时钟位置类型int m_pType;/int m_X;//数字时钟横坐标int m_Y;//数字时钟纵坐标COLORREF m_color;//数字时钟的字体颜色bool m_bgColor;//数字时钟字体背景色2.编写构造函数:CClockNum::CClockNum(){m_position = 0;m_inType = 1;m_outType = 5;m_color = RGB(0, 255, 0);m_bgColor = false;}3,编写数字时钟绘制函数void DrawTime(CDC *pDc,CRect rectClient,CTime oTime);//绘制函数void CClockNum::DrawTime(CDC *pDc, CRect rectClient, CTime oTime){SetPosition(rectClient);UINT nHour, nMinute, nSecond;nHour = oTime.GetHour();nMinute = oTime.GetMinute();nSecond = oTime.GetSecond();CString strTime, strHour, strMinute, strSecond;strHour.Format(_T("%d"), nHour);if (nHour <10){strHour.Format(_T("0%d"), nHour);}strMinute.Format(_T("%d"), nMinute);if (nMinute <10){strMinute.Format(_T("0%d"), nMinute);}strSecond.Format(_T("%d"), nSecond);if (nSecond <10){strSecond.Format(_T("0%d"), nSecond);}strTime.Format(_T("%s : %s : %s"), strHour, strMinute, strSecond);pDc->SetTextColor(m_color);if (!m_bgColor){int nBKMode = pDc->SetBkMode(TRANSPARENT);//CDD::SetBkMode,若参数值为OPAQUE时去掉文字背景色,为TRANSPARENT去掉文字背景色pDc->TextOut(m_X, m_Y, strTime);pDc->SetBkMode(nBKMode);}else{pDc->TextOut(m_X, m_Y, strTime);}}4,编写设置数字时钟位置的函数:void SetPosition(CRect rectClient);//设置数字时钟位置的函数void CClockNum::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width() / 2;ptMiddle.y = rectClient.Height() / 2 - 15;int nRidius = min(ptMiddle.x, ptMiddle.y);if (m_position == 0){ // 内部switch (m_inType){case 0: // 上m_X = ptMiddle.x - 35;m_Y = ptMiddle.y - nRidius * 0.7;break;case 1: // 下m_X = ptMiddle.x - 35;m_Y = ptMiddle.y + nRidius * 0.7;break;case 2: // 左m_X = ptMiddle.x - nRidius * 0.8 + 25;m_Y = ptMiddle.y;break;case 3: // 右m_X = ptMiddle.x + nRidius * 0.8 - 95;m_Y = ptMiddle.y;break;}}else if (m_position == 1){ // 外部switch (m_outType){case 0: // 左上角m_X = 22;m_Y = 10;break;case 1: // 右上角m_X = rectClient.right - 100;m_Y = 10;break;case 2: // 左下角m_X = 22;m_Y = rectClient.bottom - 30;break;case 3: // 右下角m_X = rectClient.right - 96;m_Y = rectClient.bottom - 30;break;case 4: // 上侧居中m_X = ptMiddle.x - 33;m_Y = 2;break;case 5: // 下侧居中m_X = ptMiddle.x - 33;m_Y = rectClient.bottom - 30;break;case 6: // 左侧居中m_X = 10;m_Y = ptMiddle.y;break;case 7: // 右侧居中m_X = rectClient.right - 86;m_Y = ptMiddle.y;break;}}}七,数字日期模块的设置:1,创建对话框IDD_SET_DATE;生成DateSetDlg类;左右分布:IDC_LEFT;上下分布:IDC_UP;表盘内:IDC_IN;表盘外:IDC_OUT日期颜色定制:IDC_DATECOLOR;星期颜色定制:IDC_WEEKCOLOR 隐藏:IDC_HIDE;显示:IDC_SHOW;2,为控件添加关联变量:IDC_COMIN:CComboBox m_comIn;IDC_COMOUT:CComboBox m_comOut;IDC_IN :int m_in;IDC_HIDE:int m_show;IDC_UP:int m_up;在.h文件下添加其余变量:COLORREF m_dColor; // 日期颜色COLORREF m_wColor; // 星期颜色int m_inType;int m_outType;3.添加初始化函数:BOOL DateSetDlg::OnInitDialog(){CDialog::OnInitDialog();m_comIn.InsertString(0, _T("正上方"));m_comIn.InsertString(1, _T("正下方"));m_comIn.InsertString(2, _T("正左方"));m_comIn.InsertString(3, _T("正右方"));m_comIn.SetCurSel(m_inType);m_comOut.InsertString(0, _T("左上角"));m_comOut.InsertString(1, _T("右上角"));m_comOut.InsertString(2, _T("左下角"));m_comOut.InsertString(3, _T("右下角"));m_comOut.SetCurSel(m_outType);SetPositionEnable();return TRUE;}4,编写SetPositionEnable()单选位置函数void SetPositionEnable();void DateSetDlg::SetPositionEnable(){if(m_up == 0){GetDlgItem(IDC_IN)->EnableWindow(false);GetDlgItem(IDC_COMIN)->EnableWindow(false);GetDlgItem(IDC_OUT)->EnableWindow(false);GetDlgItem(IDC_COMOUT)->EnableWindow(false);return;}if(m_in == 0){GetDlgItem(IDC_IN)->EnableWindow(true);GetDlgItem(IDC_COMIN)->EnableWindow(true);GetDlgItem(IDC_OUT)->EnableWindow(true);GetDlgItem(IDC_COMOUT)->EnableWindow(false);}elseGetDlgItem(IDC_IN)->EnableWindow(true);GetDlgItem(IDC_COMIN)->EnableWindow(false);GetDlgItem(IDC_OUT)->EnableWindow(true);GetDlgItem(IDC_COMOUT)->EnableWindow(true);}}5,为控件添加事件处理函数void DateSetDlg::OnUp(){// TODO: Add your control notification handler code here UpdateData(true);SetPositionEnable();}void DateSetDlg::OnLeft(){// TODO: Add your control notification handler code here UpdateData(true);SetPositionEnable();}void DateSetDlg::OnIn(){// TODO: Add your control notification handler code here UpdateData(true);SetPositionEnable();}void DateSetDlg::OnOut(){// TODO: Add your control notification handler code here UpdateData(true);SetPositionEnable();}void DateSetDlg::OnDatecolor(){// TODO: Add your control notification handler code here CColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_dColor;if (IDOK == dlg.DoModal())m_dColor = dlg.m_cc.rgbResult;Invalidate();}}void DateSetDlg::OnWeekcolor(){// TODO: Add your control notification handler code here CColorDialog dlg;dlg.m_cc.Flags |= CC_RGBINIT;dlg.m_cc.rgbResult = m_wColor;if (IDOK == dlg.DoModal()){m_wColor = dlg.m_cc.rgbResult;Invalidate();}}void DateSetDlg::OnSelchangeComIn(){// TODO: Add your control notification handler code here m_inType = m_comIn.GetCurSel();}void DateSetDlg::OnSelchangeComOut(){// TODO: Add your control notification handler code here m_outType = m_comOut.GetCurSel();}void DateSetDlg::OnShow(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);SetPositionEnable();}void DateSetDlg::OnHide(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);SetPositionEnable();}6,重载OnPaint()void DateSetDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCPen penBorder(PS_SOLID, 1, RGB(200, 200, 200));CPen *ppenOld = dc.SelectObject(&penBorder);CBrush brPoint(m_dColor);CBrush* pbrOld = dc.SelectObject(&brPoint);CRect rectDcolor;GetDlgItem(IDC_DATECOLOR)->GetWindowRect(&rectDcolor);//获取空间相对于屏幕位置ScreenToClient(rectDcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectDcolor.left + 5, rectDcolor.top - 25, rectDcolor.right - 5, rectDcolor.bottom - 15), &brPoint);CBrush brPointw(m_wColor);dc.SelectObject(&brPointw);CRect rectWcolor;GetDlgItem(IDC_WEEKCOLOR)->GetWindowRect(&rectWcolor);//获取空间相对于屏幕位置ScreenToClient(rectWcolor);//转化为对话框的相对位置dc.FillRect(CRect(rectWcolor.left + 5, rectWcolor.top - 25, rectWcolor.right - 5, rectWcolor.bottom - 15), &brPointw);dc.SelectObject(ppenOld);//恢复设备最初的画笔dc.SelectObject(pbrOld);//恢复设备最初的画刷}八、数字日期的绘制模块1、创建CClockDate类,添加变量:int m_inType;//在表盘内部的位置int m_outType;//在表盘外部的位置int m_position;//数字日期的位置bool m_bUp;//日期与星期的位置关系(上下还是左右)int m_DX;//日期的横坐标int m_DY;//日期的纵坐标int m_WX;//星期的横坐标int m_WY;//星期的纵坐标COLORREF m_dColor;//日期的字体颜色COLORREF m_wColor;//星期的字体颜色2.编写构造函数:CClockDate::CClockDate(){m_dColor = RGB(0,255,0);m_wColor = RGB(0,255,0);m_position = 0;m_inType = 1;m_outType = 1;m_bUp = false;}3,绘制数字时钟:DrawDate()void DrawDate(CDC *pDc, CRect rectClient,CTime oTime);void CClockDate::DrawDate(CDC *pDc, CRect rectClient, CTime oTime) {SetPosition(rectClient);/*UINT nYear, nMonth, nDay, nDayOfWeek;nYear = oTime.GetYear();nMonth = oTime.GetMonth();nDay = oTime.GetDay();CString strDate, strYear, strMonth, strDay, strDayOfWeek;strYear.Format(_T("%d"), nYear);strMonth.Format(_T("%d"), nMonth);if (nMonth <10){strMonth.Format(_T("0%d"), nMonth);}strDay.Format(_T("%d"), nDay);if (nDay <10){strDay.Format(_T("0%d"), nDay);}strDate.Format(_T("%s年%s月%s日"), strYear, strMonth, strDay);strDayOfWeek = weekDay(oTime);*/CString strDate = CTime::GetCurrentTime().Format("%Y年%m月%d日");CString strDayOfWeek = weekDay(oTime);int nBKMode = pDc->SetBkMode(TRANSPARENT);pDc->SetTextColor(m_dColor);pDc->TextOut(m_DX, m_DY, strDate);pDc->SetTextColor(m_wColor);pDc->TextOut(m_WX, m_WY, strDayOfWeek);pDc->SetBkMode(nBKMode);}4,计算星期几日期的位置计算函数:SetPosition()void SetPosition(CRect rectClient);void CClockDate::SetPosition(CRect rectClient){CPoint ptMiddle;ptMiddle.x = rectClient.Width()/2;ptMiddle.y = rectClient.Height()/2 - 15;int nRidius = min(ptMiddle.x,ptMiddle.y);if(!m_bUp){m_DX = ptMiddle.x + nRidius * 0.8 - 110;m_DY = ptMiddle.y + 20 ;m_WX = ptMiddle.x - nRidius * 0.8 + 35;m_WY = ptMiddle.y + 20 ;return;}if(m_position == 0){ // 内部switch(m_inType){case 0: // 上m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y - nRidius * 0.7 + 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y - nRidius * 0.7 + 30;break;case 1: // 下m_DX = ptMiddle.x - 46;m_DY = ptMiddle.y + nRidius * 0.7 - 50;m_WX = ptMiddle.x - 16;m_WY = ptMiddle.y + nRidius * 0.7 - 30;break;case 2: // 左m_DX = ptMiddle.x - nRidius * 0.8 + 10;m_DY = ptMiddle.y + 50;m_WX = ptMiddle.x - nRidius * 0.8 + 45;m_WY = ptMiddle.y + 30 ;。

用C语言实现的闹钟程序

用C语言实现的闹钟程序
第1页
PDF 文件使用 "pdfFactory Pro" 试用版本创建
用C语言实现的闹钟程序.txt line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180 ))); } } 该程序已在Turbo C++3.0中通过编译.
用C语言实现的闹钟程序
用C语言实现的闹钟程序.txt
#include #include #include #include #include void main() { int gd=DETECT,gm; int x=320,y=240,r=200,i,h,m,s,thetamin,thetasec; struct time t; char n[12][3]={"3","2","1","12","11","10","9","8","7","6","5","4"}; initgraph(&gd,&gm,"g:\\tc\\bgi");//图形驱动器路径,根据自己的系统更换。 circle(x,y,210); setcolor(4); settextstyle(4,0,5); for(i=0;i<12;i++) { if(i!=3) outtextxy(x+(r-14)*cos(M_PI/6*i)-10,y-(r-14)*sin(M_PI/6*i)-26,n[i]); else outtextxy(x+(r-14)*cos(M_PI/6*i)-20,y-(r-14)*sin(M_PI/6*i)-26,n[i]); } gettime(&t); printf("The current time is: %2d:%02d:%02d.%02d\n",t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); while(!kbhit()) { setcolor(5); setfillstyle(1,5); circle(x,y,10); floodfill(x,y,5); gettime(&t); if(t.ti_min!=m) { setcolor(0); line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180 ))); circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180)) ,10); line(x,y,x+(r-110)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-110)*sin(M_PI/6*h -((m/2)*(M_PI/180)))); circle(x+(r-130)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-130)*sin(M_PI/6*h-( (m/2)*(M_PI/180))),10); } if(t.ti_hour>12) t.ti_hour=t.ti_hour-12; if(t.ti_hour<4) h=abs(t.ti_hour-3); else&n bsp; h=15-t.ti_hour; m=t.ti_min; if(t.ti_min<=15) thetamin=(15-t.ti_min)*6; else thetamin=450-t.ti_min*6; if(t.ti_sec<=15) thetasec=(15-t.ti_sec)*6; else thetasec=450-t.ti_sec*6; setcolor(4); line(x,y,x+(r-110)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-110)*sin(M_PI/6*h -((m/2)*(M_PI/180)))); circle(x+(r-130)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-130)*sin(M_PI/6*h-( (m/2)*(M_PI/180))),10); line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180 ))); circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180)) ,10); setcolor(15); line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180 ))); delay(1000); setcolor(0);

基于MFC的大屏幕数字时钟

基于MFC的大屏幕数字时钟

大屏幕显示数字时钟设计姓名:谭X 指导教师:XXX专业:XXXXXXXXX 年级:20XX级摘要本设计基于MFC,M FC是微软公司提供的一条类库,是一种应用程序框架,随微软Visual C++开发工具发布,以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++开发工具发布。

目前最新版本为10.0,并且发布了中文版。

该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject 直接或间接派生,只有少部分类例外。

MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。

MFC 提供了MFC AppWizard 自动生成框架。

Windows 应用程序中,MFC 的主包含文件为Afxwin.h。

此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为VC++开发必须使用MFC,这种想法是错误的。

作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

关键字:MFC;大屏显示幕数字时钟;C++。

Large screen display digital clock designName:Chen Tan Tutor:Jijie BiMajor:Electronics and Communications Engineering Grade: 2013AbstractThis design is based on the MFC, MFC is Microsoft provides a class library,is a kind of application framework,along with the Microsoft Visual c++development tools, in the form of c++class encapsulates the Windows API, and contains an application framework, in order to reduce the workload application developers.Handle to the class contains a large number of Windows which contains wrapper class and many Windows built-in controls and component wrapper class.MFC: Microsoft Foundation Classes (Microsoft Foundation Classes), with the VCL, is a kind of application framework, along with the Microsoft Visual c++development tools.Currently the latest version is 10.0, and release the Chinese version.The class library provides a set of generic reusable class library for developers, most of the classification aredirectly or indirectly derived from CObject, only a few exceptions.The overall structure of the MFC applications usually derived by the developer from MFC class several classes and class a CWinApp object (the application object).MFC provides a MFC AppWizard framework automatically generated.Windows application, MFC master include file for Afxwin.H.Also part of the MFC class for MFC/ATL general, can separate in the Win32 application contains and use these classes.Because of its ease of use, often mistaken for beginners vc++ evelopment must use MFC, this idea is wrong.As an Application Framework, the use of MFC can only improve the efficiency of the development of some cases, only play a supplementary role, and does not replace the Win32 programming.Key words:MFC;Screen display digital clock;C++.第1章绪论1.1 MFC简介M FC(Microsoft Foundation Classes),是微软公是微软公司提供的一条类库司提供的一条类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

计算机图形学 MFC VC++6.0制作的简单时钟源代码

计算机图形学 MFC VC++6.0制作的简单时钟源代码
{
// TODO: Add your command handler code here
Timer=1;
SetTimer(1,100,NULL);
}
void CMFCFrame1View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
{
// dቤተ መጻሕፍቲ ባይዱfault preparation
return DoPreparePrinting(pInfo);
}
void CMFCFrame1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
// CMFCFrame1View drawing
/////////////////////////////////////////////////////////////////////////////
// CMFCFrame1View printing
BOOL CMFCFrame1View::OnPreparePrinting(CPrintInfo* pInfo)
// CMFCFrame1View
IMPLEMENT_DYNCREATE(CMFCFrame1View, CView)
BEGIN_MESSAGE_MAP(CMFCFrame1View, CView)
//{{AFX_MSG_MAP(CMFCFrame1View)
ON_WM_CREATE()

C电子闹钟设计说明书

C电子闹钟设计说明书

电子闹钟设计阐明书一、实现旳功能一种简朴旳电子闹钟设计程序,和一般旳闹钟旳功能差不多。

一方面此程序可以同步电脑上旳显示时间,保证时间旳精确性;24小时制,可以根据自己喜欢旳铃声设立闹钟提示音,还能自己设立提示语句,如“时间到了该起床了”,“大懒虫,天亮了,该起床了”等等,因此这是一种集实用和趣味于一体旳小程序。

二、设计环节1、打开Microsoft Visual C++ 6.0,在文献中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名张卢锐旳闹钟及其所在位置,点击拟定,如图所示。

2、将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完毕,如图所示。

然后始终点下一步,最后点完毕,就建立了一种基于对话窗口旳程序框架,如图所示。

3、下面是计算器旳界面设计在控件旳“编辑框”按钮上单击鼠标左键,在对话框编辑窗口上合适旳位置按下鼠标左键并拖动鼠标画出一种大小合适旳编辑框。

在编辑框上单击鼠标右键,在弹出旳快捷莱单中选择属性选项,此时弹出Edit属性对话框,以显示小时旳窗口为例,如图所示,在该对话框中输入ID属性。

在控件旳“Button”按钮上单击鼠标左键,在对话框上旳合适旳位置上按下鼠标左键并拖动鼠标画出一种大小合适旳下压式按钮。

在按钮上单击鼠标右键,在弹出旳快捷菜单中选择属性选项,此时也弹出Push Button属性对话框,以数字按钮打开为例,如图所示,在该对话框中输入控件旳ID值和标题属性。

按照上面旳操作过程编辑其她按钮对象旳属性。

表1 各按钮和编辑框等对象旳属性完毕后界面如图所示。

4、连接变量和代码1)、给编辑框连接变量。

在编辑框上单击鼠标右键,在弹出菜单中选择ClassWizard菜单项,弹出MFC ClassWizard 对话框,选择Member Variables选项卡,如图所示。

2)、给按钮连接代码(以打开按键为例)给打开按钮连接代码。

在打开按钮上单击鼠标右键,选择ClassWizard菜单项,在弹出旳对话框中选择Messages Maps选项卡,然后在Object IDs列表框中选择IDC_HOUR,在Messages列表框中选择BN_CLICKED项,即选择单击按钮事件,如图所示。

小闹钟程序课题设计报告

小闹钟程序课题设计报告

小闹钟VC程序设计报告一课题内容和要求【问题描述】编一个小闹钟程序,运行后可以在指定的时间到时,在屏幕上显示提醒时间到的语句,并使得电脑发出了悠扬的乐声。

二需求分析1显示时间功能,即时显示当前时间2闹钟功能,能够根据用户设置的时间来提醒用户,可以通过声音或者文字提醒3时间设置功能,提供菜单设置时钟的当前时间和提醒的闹钟时间4界面设计,可模拟真实钟表界面,也可用数字界面显示,要求美观,实用和个性化三详细设计该程序拥有四个源文件,分别为AlarmClock.cpp AlarmClockDlg.cpp RingDlg.cpp stdafx.cpp如下图所示:其作用分别为AlarmClock.cpp : 定义应用程序的类行为AlarmClockDlg.cpp : 实现文件RingDlg.cpp : 实现文件另外stdafx.cpp : 只包括标准包含文件的源文件AlarmClock.pch 将作为预编译头stdafx.obj 将包含预编译类型信息在闹钟设置面板上添加当前时间,通过文本框和标签设置需要设置的闹钟的时,分,秒。

设置列表框提供闹钟的音乐供以选择。

设置开关按钮决定闹钟的开始和结束另外于MFC播放背景音乐的问题解决如下:1.建立一个MFC的程序2.插入资源(插入->资源->定制->(输入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.h"7.(工程->设置->连接->库模板添加"winmm.lib")8.编译运行即可程序源代码#include"stdafx.h"#include"AlarmClock.h"#include"AlarmClockDlg.h"#include"afxdialogex.h"#include"RingDlg.h"#include<MMSystem.h>#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), 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_STA TIC_NOW, m_static_now);DDX_Control(pDX, IDC_STA TIC_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_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()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::SetAlarmTime)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 CAlarmClockDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 设置此对话框的图标。

VC计算器-小闹钟-通讯录设计(含源文件)

VC计算器-小闹钟-通讯录设计(含源文件)

面向对象Windows程序设计选题:计算器、小闹钟、通讯录学号:姓名:院(系):信息工程学院专业:信息完成日期:指导老师:老师题目一:利用MFC框架编写简易计算器一.需求分析即要实现简单计算器的功能,包括加、减、乘、除等运算功能,还要实现数据的输入、输出、计算、显示及程序退出等功能。

二.总体设计1.程序的创建.使用软件Visual C++ 6.0.,首先,新建一个MFC 基于对话框的工程。

点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。

点击确定。

创建一个基于对话框的应用程序。

2.界面的设计按如图所示向对话框添加控件,且按如图所示一样排版。

4.为控件添加成员变量和消息处理函数为IDC_FIRNUM 增加一个变量,点Add Variable…,我们为它增加一个 float 型的变量,命名为m_Firnum。

给第二个编辑框增加float变量m_Secnum。

第三个编辑框增加float变量m_Result。

按ctrl+w选择第一个选项卡 Message Maps,从IDs 中选择IDC_JIA,即加这个按钮,从 Messages 中选择 BN_CLICKED,即当被单击的时候,然后点 AddFunction…为其添加函数然后弹出对话框,为函数命名,选择默认即可,点击OK。

同样为-,*,/添加一样的响应函数。

结果如图:三、编程说明与实现添加如下代码:void CJisuanDlg::OnJia(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum+m_Secnum;UpdateData(false);}void CJisuanDlg::OnJian(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum-m_Secnum;UpdateData(false);}void CJisuanDlg::OnCheng(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum*m_Secnum;UpdateData(false);}void CJisuanDlg::OnChu(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum/m_Secnum;UpdateData(false);}这里有一个UpdateData(Bool)函数。

MFC之模拟时钟

MFC之模拟时钟

MFC之模拟时钟最近在学习MFC,程序设计⽼师布置”画板“和”模拟时钟“作为实验来实践,由于没去上课,⽹上搜索的很多教程⼏乎都是以VC6.0为基础的,⽽⾝边⼏乎都是VS2008以上,对于初学者来说,有时仿照VC6.0的教程在VS2008或更⾼的环境上难免会出现⼀些困难,特此将模拟时钟程序在VS2008环境下的开发过程总结如下:1.新建项⽬项⽬类型选择“MFC”,模板选择“MFC应⽤程序”,名称⾃拟,这⾥命名为”Clock"。

选择好以后效果如下:2.MFC应⽤程序向导设置选择“下⼀步"这⾥有两个更改,⼀是”应⽤程序类型”选择“基于对话框”,同时取消选中“使⽤Unicode库”。

完成以上两步之后,直接单击“完成”即可。

三、核⼼部分1.⾸先打开“类视图”,选择"CClockDlg"在该类的头⽂件中,找到如下代码:紧接着后⾯添加三个变量⽤于临时保存时间的秒、分、时。

int m_Sec, m_Min, m_Hour;插⼊后的效果如下:2.⼿动添加⼀个消息映射函数,完成时间的获取和指针的绘制。

在CClockDlg类的头⽂件中找到如下代码:在其中增加⼀⾏如下:afx_msg void OnTimer(UINT nIDEvent);增加后显⽰效果如下:接着在资源管理器中找到CClockDlg类的cpp⽂件来实现刚才的函数声明需要添加的代码如下:1void CClockDlg::OnTimer(UINT nIDEvent)2 {3// TODO: Add your message handler code here and/or call default4 CTime time = CTime::GetCurrentTime(); //获得系统时间5 m_Sec = time.GetSecond();6 m_Min = time.GetMinute();7 m_Hour = time.GetHour();89 CDC* pDC = GetDC();10 CRect rect;11 GetClientRect(&rect); //获取客户区域12 CBitmap bitmap; //定义图⽚类13 bitmap.LoadBitmap(IDB_BITMAP1); //加载位图14 CDC memdc; //定义临时画布15 memdc.CreateCompatibleDC(pDC); //创建画布16 memdc.SelectObject(&bitmap); //关联图⽚1718int x = rect.Width()/2;19int y = rect.Height()/2;2021 CPen MinutePen(PS_SOLID,2,RGB(0,0,0)); //设置分针画笔22 memdc.SelectObject(&MinutePen);23 memdc.MoveTo(x,y);24//绘制分针25 memdc.LineTo(x+(long)40*cos(PI/2-2*PI*m_Min/60.0),y-(long)40*sin(PI/2-2*PI*m_Min/60.0));26 CPen HourPen(PS_SOLID,3,RGB(0,0,0)); //设置时针画笔27 memdc.SelectObject(&HourPen);28 memdc.MoveTo(x,y);29//绘制时针30 memdc.LineTo(x+(long)30*cos(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0))31 ,y-(long)30*sin(PI/2-2*PI*(5*m_Hour/60.0+m_Min/12.0/60.0)));32 CPen SecondPen(PS_SOLID,1,RGB(255,0,0)); //设置秒针画笔33 memdc.SelectObject(&SecondPen);34 memdc.MoveTo(x,y);35 memdc.LineTo(x+(long)50*cos(PI/2-2*PI*m_Sec/60.0),y-(long)50*sin(PI/2-2*PI*m_Sec/60.0));//绘制秒针36 memdc.MoveTo(x,y);37 memdc.LineTo(x+(long)10*cos(PI/2-2*PI*(m_Sec+30)/60.0),y-(long)10*sin(PI/2-2*PI*(m_Sec+30)/60.0));//绘制秒针38 SecondPen.DeleteObject();39 MinutePen.DeleteObject();40 HourPen.DeleteObject();41 pDC->BitBlt(0,0,rect.right,rect.bottom,&memdc,0,0,SRCCOPY); //复制图⽚42 memdc.DeleteDC(); //复制临时画布到预览窗⼝43 bitmap.DeleteObject(); //删除图⽚44 ReleaseDC(pDC);45 CDialog::OnTimer(nIDEvent);46 }3.设置时钟位图打开“资源视图”在“资源视图”中添加资源资源类型选择“Bitmap",然后选择”导⼊”,把实现准备好的BMP⽂件导⼊。

基于MFC的大屏幕数字时钟审批稿

基于MFC的大屏幕数字时钟审批稿

基于M F C的大屏幕数字时钟YKK standardization office【 YKK5AB- YKK08- YKK2C- YKK18】大屏幕显示数字时钟设计姓名:谭X 指导教师:XXX专业:XXXXXXXXX 年级:20XX级摘要本设计基于MFC,M FC是提供的一条类库,是一种应用程序框架,随微软Visual C++开发工具发布,以C++类的形式封装了Windows的API,并且包含一个框架,以减少人员的工作量。

其中包含的类包含大量Windows句柄封装类和很多Windows的内建和组件的封装类。

MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++开发工具发布。

目前最新版本为,并且发布了中文版。

该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject 直接或间接派生,只有少部分类例外。

MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类(应用程序对象)组成。

MFC 提供了MFC 自动生成框架。

Windows 应用程序中,MFC 的主包含文件为。

此外MFC的部分类为MFC/ 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为开发必须使用MFC,这种想法是错误的。

作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

关键字:MFC;大屏显示幕数字时钟;C++。

Large screen display digital clock designName:Chen Tan Tutor:Jijie BiMajor:Electronics and Communications Engineering Grade: 2013AbstractThis design is based on the MFC, MFC is Microsoft provides aclass library,is a kind of application framework,along with the Microsoft Visual c++development tools, in the form of c++class encapsulates the Windows API, and contains an application framework, in order to reduce the workload application to the class contains a large number of Windows which contains wrapper class and many Windows built-in controls and component wrapper class.MFC: Microsoft Foundation Classes (Microsoft Foundation Classes), with the VCL, is a kind of application framework, along with the Microsoft Visual c++development the latest version is , and release the Chinese class library provides a set of generic reusable class library for developers, most of the classification are directly or indirectly derived from CObject, only a few exceptions.The overall structure of the MFC applications usually derived by the developer from MFC class several classes and class a CWinApp object (the application object).MFC provides a MFC AppWizard framework automatically generated.Windows application, MFC master include file for .Also part of the MFC class for MFC/ATL general, can separate in the Win32 application contains and use these classes.Because of its ease of use, often mistaken for beginners vc++ evelopment must use MFC, this idea is an Application Framework, the use of MFC can only improve the efficiency of the development of some cases, only play a supplementary role, and does not replace the Win32 programming.Key words:MFC;Screen display digital clock;C++.第1章绪论MFC简介M FC(Microsoft Foundation Classes),是提供的一条类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个框架,以减少人员的工作量。

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

1.1 创建对话框的应用程序1.使用AppWizard创建应用程序框架首先,创建一个对话框应用程序,其工程文件名为:ch1.dsp。

具体步骤如下:(1)启动Visual C++ 6.0,在File菜单中选择new菜单项;(2)在new对话框的Project页中选择 MFC AppWizard(exe)选项,在Project name框中输入:ch1,并在Location 框中指定希望的目录路径,编译系统生成的各种文件将会存放在该目录下,然后点击[OK]按钮(3)MFC AppWizard-Step1 中选择Dialog based 选项,MFC AppWizard-Step2 到MFC AppWizard-Step4中取默认选项;(4)进入VC对话框设计界面后,选中 [TODO:在这里设置对话控制。

]静态框并按del键删除该框,选中[取消]按钮并按del键删除该按钮; (5)将[确认]按钮拖曳到对话框的下方中间。

生成的对话框设计窗口(如图1-1所示)。

图1-12.向类中添加系统消息响应函数Windows应用程序的采用事件触发、消息驱动机制和大量的消息响应函数构成了应用程序的主体。

本示例需要用到两个消息响应函数OnCtlColor()和OnTimer(),前者响应窗口消息:WM_CTLCOLOR,后者响应窗口消息:WM_TIMER。

关于这两个函数的功能和用法暂且略过,留待后面小节再叙。

这里先介绍响应函数加载的方法。

在CCh1Dlg类中添加OnCtlColor( )函数的操作方法如下:(1)打开类向导(MFC ClassWizard)窗口,选择Message Maps 页;(2)选择工程、类和对象标识。

在Message Maps页的Project、Class name、Object Ids框中分别选择:ch1、CCh1Dlg、CCh1Dlg;(3)添加响应函数。

在Message Maps页的Messages框中选中并双击窗口消息:WM_CTLCOLOR,此时,消息WM_CTLCOLOR 的响应函数OnCtlColor( )被添加到类向导底部Member Functions框中。

MFC 模拟时钟

MFC    模拟时钟

模拟时钟以实例为背景学习基于MFC的WINDOWS应用程序设计,编写一个模拟时钟程序,此程序在屏幕上有一个指针式钟面,用菜单选项进行时间控制。

时间必与机器系统时间相同,不可任意设置。

1 编程要求(1)为该程序设计绘制合适的时钟外形。

(2)程序界面设计合理,色彩得体大方,显示正确。

(3)时针、分针和秒针形象美观,即使各指针重合也可辨认。

(4)各指针运动规律正确,以便于演示。

(5)时间显示正确,并且显示当前系统时间。

(6)按下设置菜单项可实现时间的调整与重新显示2 问题分析本题主要涉及到的知识点有:时钟指针运动算法、屏幕重绘方法、菜单命令、画笔/画刷等。

指针运动算法和屏幕重绘方法是本程序主要难点所在。

不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。

计算指针端点(x, y)的公式如下:x =圆心x坐标+ 指针长度* cos (指针方向角)y =圆心y坐标+ 指针长度* sin (指针方向角)注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。

三个指针的运动是相关联的,秒针转一圈引起分针运动一格,分针转一圈引起时针运动一格,因此应该使用一个定时器消息来处理指针的运动。

若用三个定时器消息分别处理时针、分针和秒针的运动,就会使问题复杂化且不易实现三个指针联动的正确规律。

采用一个定时器消息可以很容易实现指针联动算法。

3 实现步骤(1)用AppWizard生成一个名为“模拟时钟”的单文档(SDI)程序框架。

为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项,其他各选项均可用缺省设置。

(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。

在“时钟控制”菜单中添加二个菜单选项“启动时钟”、“停止时钟”并在菜单属性项中设定“启动时钟”菜单的ID 标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“为了简化菜单,可删除系统原有的“编辑”、“关于”等菜单项。

Visual Basic 6.0编写小闹钟程序课程设计

Visual Basic 6.0编写小闹钟程序课程设计

-南昌航空工业学院-计算机课程设计<Visual Basic 6.0编写小闹钟程序>系别:班级:姓名:同组人:指导老师:目录一.实验目的 (2)二.实验原理及步骤 (2)三.附录 (3)流程图 (4)执行界面 (5)程序源代码 (6)四.参考书目 (7)五.心得体会 (7)一.实验目的编写一个带有闹钟的小时钟(指针式)二.实验原理及步骤(1)启动Visual Basic 6.0,选择“标准EXE”,单击“打开”按钮,VB 自动创建一个名为“工程一”的标准工程,同时创建一个名为“Form1”的窗体。

(2)在窗体上添加一个Timer控件(用于时间的控制)、一个Label控件(用于提示信息的显示)、两个CommandButter控件,如图一所示。

(3)在“定时”的功能中要设置响铃的时间。

为“闹钟定时”编写代码,(参见附录)。

(4)为Timer控件编写代码,(参见附录)。

(5)运行程序,观看结果,初始界面如图二所示。

设置闹钟时间,如图二所示。

输入错误提示,如图三所示。

执行闹钟功能,如图四所示。

三.附录程序流程图:执行界面:(图片一)(图片二)(图片三)(图片四)程序源代码:Public AlarmTime------------------------------------------------------------------------------------------------- Private Sub Command1_Click()Dim tt = AlarmTimeAlarmTime = InputBox("Enter the ring time:", "Alarm", AlarmTime)If AlarmTime = "" And t = "" Then Exit SubIf AlarmTime = "" And t <> "" Then AlarmTime = TEMPIf AlarmTime = "" Then Exit SubIf Not IsDate(AlarmTime) Then'判断date是否可以转换为时间MsgBox "The time you entered was not valid."ElseAlarmTime = CVDate(AlarmTime)'返回转换成时间类型的表达式End IfEnd Sub------------------------------------------------------------------------------------------------- Private Sub SetCaptionTime()Caption = Format(Time, "Short Time")End Sub------------------------------------------------------------------------------------------------- Private Sub Command2_Click()EndEnd Sub------------------------------------------------------------------------------------------------- Private Sub Label1_Click()Label1.BorderStyle = "1-Fixed single"End Sub------------------------------------------------------------------------------------------------- Private Sub Timer1_Timer()Timer1.Interval = 1000Static Alarmed As IntegerIf Label1.Caption <> CStr(Time) ThenIf Time = AlarmTime And Not Alarmed Then'判断是否重复响铃MsgBox ("Ring !" & vbCrLf & Time)Alarmed = TrueElseIf Time < AlarmTime ThenAlarmed = FalseEnd IfLabel1.FontName = "Times New Roman"Label1.FontSize = 36Label1.Caption = TimeEnd IfEnd Sub四.参考书目〈Visual Basic程序设计教程〉刘炳文许蔓舒编著〈Visual Basic 6.0编程实例〉张宏林周江峰等编著〈Visual Basic 6.0编程实例大制作〉李光明主编〈Visual Basic 6.0程序设计教程〉罗朝盛主编〈VB Script可视化程序设计〉刘炳文编著五.心得体会两周的计算机程序设计结束了,经过两周的翻阅资料和设计,以及把以前所学的运用到设计当中。

c语言课程设计闹钟

c语言课程设计闹钟

c语言课程设计闹钟一、教学目标本课程旨在通过学习C语言编程,使学生掌握编写简单的闹钟程序的基本技能。

具体目标如下:1.理解C语言的基本语法和数据结构。

2.掌握函数的定义和调用。

3.了解操作系统中时间相关的函数和概念。

4.能够使用C语言编写简单的程序。

5.能够通过编程实现闹钟的基本功能,如设定时间、响起闹铃等。

6.能够对程序进行调试和优化。

情感态度价值观目标:1.培养学生的逻辑思维能力和解决问题的能力。

2.培养学生对编程和计算机科学的兴趣。

3.培养学生遵守时间和纪律的良好习惯。

二、教学内容本课程的教学内容主要包括C语言的基本语法、数据结构、函数的定义和调用,以及操作系统中时间相关的函数和概念。

具体安排如下:1.C语言的基本语法和数据结构(2课时)2.函数的定义和调用(2课时)3.闹钟程序的设计和实现(4课时)4.程序调试和优化(2课时)三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

1.讲授法:用于讲解C语言的基本语法、数据结构和函数的定义和调用。

2.案例分析法:通过分析实际案例,使学生理解和掌握闹钟程序的设计和实现。

3.实验法:让学生通过动手实践,加深对C语言编程的理解和掌握。

四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。

1.教材:选用《C程序设计语言》作为主教材,辅助以相关参考书。

2.多媒体资料:提供相关的教学视频和PPT,帮助学生更好地理解和掌握知识。

3.实验设备:提供计算机和相关的编程环境,让学生能够进行实际的编程实践。

五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以保证评估的客观性和公正性。

1.平时表现(20%):通过课堂参与、提问和小组讨论等方式评估学生的学习态度和参与程度。

2.作业(30%):布置相关的编程作业,评估学生对课程内容的掌握程度和编程能力。

3.考试(50%):期末进行闭卷考试,评估学生对课程知识的全面理解和应用能力。

六、教学安排本课程的教学安排如下:1.教学进度:按照教材的章节顺序进行教学,确保学生系统地掌握C语言编程的知识。

MFC定时的用法

MFC定时的用法

VC 中的定时VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。

方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。

首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。

然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。

这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为18ms。

CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。

只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。

精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。

方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。

以下是实现2秒的延时代码:COleDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time= COleDateTime::GetCurrentTime()-start_time;while(end_time.GetTotalSeconds()< 2) //实现延时2秒{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);//以上四行是实现在延时或定时期间能处理其他的消息,//虽然这样可以降低CPU的占有率,//但降低了延时或定时精度,实际应用中可以去掉。

VC++课程设计--基于MFC的模拟时钟

VC++课程设计--基于MFC的模拟时钟

VC++课程设计--基于MFC的模拟时钟计科2011级VC++课程设计实验报告题目:基于MFC的模拟时钟班级:计科1104班学号:1108030429姓名:张宝龙日期:2014/1/7课程设计实验报告1、题目:基于MFC的模拟时钟2、编程要点:制作时钟的过程中,首先给时钟创建一个基类CClockElement,还需要派生类CClockBackground,CClockHourHand,CClockMin Hand,CClockSecHand分别控制时钟的背景,时钟的时针,分针,秒针。

3、实现过程:(1)工程、风格、控件与变量表本时钟是基本对话框的时钟,界面简约,便于使用。

控件控件名控件类型Clock 静态文本变量表变量名类型m_crMain COLORREF m_crOther COLORREFm_tmCur CTimem_rcRegion CRectm_nRadius intm_clockBK CClockBackground m_clockHour CClockHourHandm_clockMin CClockMinHandm_clockSec CClockSecHandm_rcClient CRectm_Clock CClockEX(2)主要功能程序代码CClockBackground::CClockBackground() {//为时钟背景定义默认的颜色设置m_crMain=RGB(0,0,255);m_crOther=RGB(0,255,0);}void CClockBackground::Draw(CDC *pDC) {//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOther(PS _SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther);CBrush*pOldBrush=pDC->SelectObject(&brMain);CPointptCenter=m_rcRegion.CenterPoint();int nRadius=m_nRadius-8;for(int i=0;i<60;i++){CPoint ptEnd=ptCenter;ptEnd.Offset((int)(nRadius*sin(2*PI*(i% 60)/60)),(int)(-nRadius*cos(2*PI*(i%60)/60)));CRect rcDot(-2,-2,2,2);rcDot.OffsetRect(ptEnd);pDC->Ellipse(rcDot);}//绘制12个小方框,表示12个正点pDC->SelectObject(&penMain);pOldBrush=pDC->SelectObject(&brOth er);for(i=0;i<12;i++){CPoint ptEnd=ptCenter;double fRadian=2*PI*(i%12)/12;ptEnd.Offset((int)(nRadius*sin(fRadian) ),(int)(-nRadius*cos(fRadian)));CRect rcDot(-3,-3,3,3);rcDot.OffsetRect(ptEnd);pDC->Rectangle(rcDot);}//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockHourHand::CClockHourHand(){//定义默认颜色m_crMain=RGB(0,0,128);m_crOther=RGB(128,128,0);}void CClockHourHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain);//确定当前指针的弧度intnTime=(m_tmCur.GetHour()%12)*3600;nTime+=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();doublefRadian=2*PI*nTime/3600/12;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/2;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockMinHand::CClockMinHand(){//定义默认颜色m_crMain=RGB(0,255,100);m_crOther=RGB(128,128,0);}void CClockMinHand::Draw(CDC *pDC){//设置准备环境CPenpenMain(PS_SOLID,1,m_crMain),penOthe r(PS_SOLID,1,m_crOther);CBrushbrMain(m_crMain),brOther(m_crOther);CPen*pOldPen=pDC->SelectObject(&penOther );CBrush*pOldBrush=pDC->SelectObject(&brMain );//确定分针所在位置的弧度intnTime=m_tmCur.GetMinute()*60;nTime+=m_tmCur.GetSecond();double fRadian=2*PI*nTime/3600;//确定绘制菱形指针所需的四个角的坐标CPoint ptDiamond[4];for(int i=0;i<4;i++){ptDiamond[i]=m_rcRegion.CenterPoin t();}int nRadius=m_nRadius/4;ptDiamond[0].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[1].Offset((int)(nRadius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/10;ptDiamond[2].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));fRadian+=0.5*PI;nRadius=m_nRadius/20;ptDiamond[3].Offset((int)(nRad ius*sin(fRadian)),(int)(-nRadius*cos (fRadian)));//绘制菱形时钟pDC->Polygon(ptDiamond,4);//huanyuan设备环境pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush);}CClockSecHand::CClockSecHand(){//设定秒针的默认颜色m_crMain=RGB(0,200,200);m_crOther=RGB(0,200,200);}void CClockSecHand::Draw(CDC *pDC){int nTime=m_tmCur.GetSecond();CPointptStart=m_rcRegion.CenterPoint();CPoint ptEnd=ptStart;int nRadius=m_nRadius-10;ptEnd.Offset((int)(nRadius*sin (2*PI*nTime/60)),(int)(-nRadius*cos( 2*PI*nTime/60)));CPenpenMain(PS_SOLID,1,m_crMain);CPen*pOldPen=pDC->SelectObject (&penMain);pDC->MoveTo(ptStart);pDC->LineTo(ptEnd);pDC->SelectObject(pOldPen);}void CClockEX::OnTimer(UINT nIDEvent){Invalidate(FALSE);CStatic::OnTimer(nIDEvent);}void CClockEX::OnSize(UINT nType, int cx, int cy){CStatic::OnSize(nType, cx, cy);GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);}void CClockEX::OnPaint(){CPaintDC dc(this); // device context for painting//实现双缓冲绘图---防止屏幕闪烁CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmp;bmp.CreateCompatibleBitmap(&dc ,m_rcClient.Width(),m_rcClient.Heigh t());dcMem.SelectObject(&bmp);DrawClock(&dcMem); //绘制时钟dc.BitBlt(0,0,m_rcClient.Width (),m_rcClient.Height(),&dcMem,0,0,SR CCOPY);}voidCClockEX::PreSubclassWindow(){GetClientRect(m_rcClient);//获取当前客户区m_clockBK.SetRegion(m_rcClient );m_clockHour.SetRegion(m_rcClie nt);m_clockMin.SetRegion(m_rcClien t);m_clockSec.SetRegion(m_rcClien t);SetTimer(1,100,NULL);CStatic::PreSubclassWindow();}void CClockEX::DrawClock(CDC *pDC){CTimetmCur=CTime::GetCurrentTime();m_clockBK.SetTime(tmCur);m_clockHour.SetTime(tmCur);m_clockMin.SetTime(tmCur);m_clockSec.SetTime(tmCur);m_clockBK.Draw(pDC);m_clockHour.Draw(pDC);m_clockMin.Draw(pDC);m_clockSec.Draw(pDC);}CClockElement::CClockElement(){m_nRadius=0;m_crMain=RGB(255,0,0);m_crOther=RGB(128,128,0);}voidCClockElement::SetRegion(LPRECT lprcRect){m_rcRegion=lprcRect;m_nRadius=m_rcRegion.Width()/2;if(m_rcRegion.Width()>m_rcRegion.Hei ght()){m_nRadius=m_rcRegion.Height()/2;}}void CClockElement::SetTime(const CTime &tmCur){m_tmCur=tmCur;}voidCClockElement::SetColor(COLORREF crMain,COLORREF crOther){m_crMain=crMain;m_crOther=crOther;}4、运行效果展示:5、自我总结:该小程序是基于MFC中的对话框的,主要针对画笔和画刷的用法,没有涉及连接数据库和算法,完全是为了本学期所学知识的运用,由于时间紧,所以没能深入的探索MFC的奥妙,不过通过本次设计,我对老师课堂上所讲述的关于该类型的知识,有了进一步的了解和掌握,初步的熟悉了画笔和画刷的简单用法,还巩固了MFC类中的基本操作,例如,添加新类,新变量,创建新的对话框,添加控件等方面的知识。

MFC实现简单的小闹钟

MFC实现简单的小闹钟
2
主界面如下
3
“倒计时器”标签下的控件与“定时器”标签下的控件大致相同。 点击“Browse…”会弹出如下界面(请使用CfileDialog):
4
选择一个文件后,文件路径出现在“Browse…”左边的编辑框 里,也可以直接在该编辑框中手动输入音乐文件的路径。主界 面中的“Set Timer:”下的编辑框是一个CDataTimeCtrl控件,
❖ 取得用户设定的秒数 second。
❖ 每隔一秒钟发送一次
❖ SetTimer(1,second*1000,
WM_TIMER消息。
NULL);
SetTimer(0,1000,NULL); ❖ 在OnTimer(UINT_PTR
❖ 在OnTimer(UINT_PTR nIDEvent)中加入响应函数, 捕获nIDEvent==0的那个 WM_TIMER,并判断当前 时间是否等于设定时间。
17
❖ 需求分析 ❖ 实现过程 ❖ 实现情况
内容概要
1
需求分析
❖ 程序功能: 实现一个小闹钟。 首先有两个标签页(CTabCtrl控件类),一个标签是
定时器,设定好时间和提示音乐后点击OK,当设定 的时间到达后(可以使用CTime类),提示音乐响 起;另一个标签是倒计时器,设定好倒计时的秒数, 点击OK后便开始倒计时(使用WM_TIMER消息来 实现计时),当倒计时减小到0时,提示音乐响起。
❖ 3)用create方法创建对话框,使用资源中定义的模板,并 将他们的父窗口设为CTabCtrl,并调整大小和位置。
❖ 4)在主窗口中,捕获Tab Control的页选择事件,在其中 对索引值进行分类,然后就显示你的对话框,注意显示一个 的同时,要隐藏其他的对话框。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
播放声音
❖ 加入Mmsystem.h头文件。 ❖ 加入winmm.lib文件。可以在工程中设置,也可以在文件中
加入以下语句: #pragma comment(lib,"winmm.lib") ❖ 用PlaySound()函数播放声音。
11
最小化到托盘
❖ 把程序放到托盘上的本质就是先在托盘区绘制一个图标,然 后把程序隐藏不见,再对托盘的图标进行消息处理,就可以 了。 绘制图标以及确定图标所传送消息的函数只有一个, 那就是——— WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );
nIDEvent)中加入响应函数, 捕获nIDEvent==1的那个 WM_TIMER,并响铃,然 后KillTimer(1)关掉定时 器时器。
8
定时保存的问题
❖ 由于第一个功能是设置定 时器,设定的时间可能是 很多天之后,而应用程序 不可能保证一直运行到很 多天之后,所以必须要保 存用户设定的时间,每次 启动时自动读入这个时间, 继续上次定时。
14
然后就是在CPP文件中加入函数onShowTask的实现了:
15
实现情况
❖ 基本功能实现。但是不是很实用,每次定时之后要么保持程 序一直运行,要么在设定时间到达之前手动开启才能听到闹 铃。
解决方案的设想: 1.设置开机启动,让程序自动运行。 2.设置任务计划,在特定的时间开启程序。
❖ 这个函数负责向系统传递消息,以添加、修改或删除托盘区 的图标。
12
❖ 这个函数里面首先给NOTIFYICONDATA赋值,然后调用 shell_NotifyIcon, 头一个参数是NIM_ADD,表示添加。然 后用函数ShowWindow 隐藏主窗口,这样,就实现了将程
序最小化到系统托盘区的任务了。 13
❖ 需求分析 ❖ 实现过程 ❖ 实现情况
内容概要
1
需求分析
❖ 程序功能: 实现一个小闹钟。 首先有两个标签页(CTabCtrl控件类),一个标签是
定时器,设定好时间和提示音乐后点击OK,当设定 的时间到达后(可以使用CTime类),提示音乐响 起;另一个标签是倒计时器,设定好倒计时的秒数, 点击OK后便开始倒计时(使用WM_TIMER消息来 实现计时),当倒计时减小到0时,提示音乐响起。
定义一个CUserData类, 用来保存设定时间和 wav路径等信息
9
❖ 如何将这个类写入文件保存呢?通过查询msdn得知,将一 个类永久保存,也就是实现类的串行化(sariallization), 有以下五个步骤:
一.将你的类从CObject继承。 二.重载serialize这个成员函数。 三.在类的声明里面加上DECLARE_SERIAL这个宏 四.定义一个没有争议的默认构造函数。 五.在类的实现文件里加入IMPLEMENT_SERIAL这个宏。
6
CTabCtrl的使用
❖ 1)在资源管理器中创建几个Dialog, 分别生成相应的类 (基于CDialog),注意,要设置Dialog的Style为 “Child”, Border为“None”。
❖ 2)在CDialog::OnInitDialog中,调用 CTabCtrl::InsertItem(...)方法添加几个页面 。
❖ 取得用户设定的秒数 second。
❖ 每隔一秒钟发送一次
❖ SetTimer(1,second*1000,
WM_TIMER消息。
NULL);
SetTimer(0,1000,NULL); ❖ 在OnTimer(UINT_PTR
❖ 在OnTimer(UINT_PTR nIDEvent)中加入响应函数, 捕获nIDEvent==0的那个 WM_TIMER,并判断当前 时间是否等于设定时间。
❖ 3)用create方法创建对话框,使用资源中定义的模板,并 将他们的父窗口设为CTabCtrl,并调整大小和位置。
❖ 4)在主窗口中,捕获Tab Control的页选择事件,在其中 对索引值进行分类,然后就显示你的对话框,注意显示一个 的同时,要隐藏其他的对话框。
7
定时器的实现
倒计时的实现
❖ 定义一个CTime变量,保 存用户设定的时间。
在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应 函数: afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam); 然后在CPP文件中添加消息映射。 在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间 加入: ON_MESSAGE(WM_SHOWTASK,onShowTask) 将消息和消息响应函数映射起来。
点击会出现如下界面:
当所有设置完成后,点击OK按键,则设定生效, 同时,该标签页内的所有设置相关的控件都变灰, 为不可用状态。“OK”变为“Cancel”。点 击”Cancel“,则恢复可设置状态,同时, “Cancel”也变回为原来的”OK“。
5
实现过程
❖ 一.CTabCtrl的使用。 ❖ 二.定时的实现. ❖ 三.定时保存的实现. ❖ 四.播放声音 ❖ 五.最小化到托盘.
❖ 程序已经最小化到托盘区了,但是呢,对托盘图标的操作如何进行呢? 这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用 了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无 论是左键还是右键),会向hWnd所代表的窗口传送消息,如果是上例, 消息的名称就是WM_SHOWTASK。根据VC的消息机制,对自定义消 息增加消息响应函数。
2
主界面如下
3
“倒计时器”标签下的控件与“定时器”标签下的控件大致相同。 点击“Browse…”会弹出如下界面(请使用CfileDialog):
4
选择一个文件后,文件路径出现在“Browse…”左边的编辑框 里,也可以直接在该编辑框中手动输入音乐文件的路径。主界 面中的“Set Timer:”下的编辑框是一个CDataTimeCtrl控件,
相关文档
最新文档