可视化编程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 ;。
使用MFC进行可视化编程
使用MFC进行可视化编程
MFC(Microsoft Foundation Classes,微软基础类)是一个C++图形用户界面(GUI)应用程序编程框架,它主要用于开发Windows应用程序。
MFC是微软的一个可视化编程框架,由C++构成,以C++为基础实现可视化编程。
MFC的主要功能是抽象出Windows平台的GUI底层,减少编程者使用Windows API的繁琐程度,使应用程序的开发更加容易。
MFC提供了许多可视化的功能来帮助开发者开发Windows应用程序,它主要由以下几个部分组成:
(1)基础框架:MFC建立在Windows API基础上,它封装了许多Windows系统函数,使得使用者不需要编写复杂的Windows基础函数就可以实现可视化的界面。
(2)界面控件:MFC提供了大量的界面控件,可以让开发者快速实现可视化编程,如按钮、对话框、工具栏、菜单栏等,而且还提供了自定义控件的功能,可以让开发者自定义控件来满足特定业务的需求。
(3)图像处理:MFC提供大量的图像处理的API函数,可以实现图像的显示、缩放、旋转、裁剪等功能,而且支持大量的图像格式,可以满足大多数应用的需求。
(4)网络访问:MFC提供了网络访问的接口,可以实现基于HTTP协议的网络访问,实现网络编程,而且支持多种数据格式,可以轻松实现网络应用的开发。
可视化编程
可视化编程,亦即可视化程序设计:以“所见即所得”的编程思想为原则,力图实现编程工作的可视化,即随时可以看到结果,程序与结果的调整同步。
可视化编程是与传统的编程方式相比而言的,这里的“可视”,指的是无须编程,仅通过直观的操作方式即可完成界面的设计工作,是目前最好的Windows应用程序开发工具。
可视化编程语言的特点主要表现在两个方面:一是基于面向对象的思想,引入了控件的概念和事件驱动;二是程序开发过程一般遵循以下步骤,即先进行界面的绘制工作,再基于事件编写程序代码,以响应鼠标、键盘的各种动作。
1. 什么是可视化程序设计?可视化(Visual)程序设计是一种全新的程序设计方法,它主要是让程序设计人员利用软件本身所提供的各种控件,像搭积木式地构造应用程序的各种界面。
2. 可视化程序设计有哪些优点?可视化程序设计最大的优点是设计人员可以不用编写或只需编写很少的程序代码,就能完成应用程序的设计,这样就能极大地提高设计人员的工作效率。
3. 能够进行可视化程序设计的语言有哪些?能进行可视化程序设计的语言很多,比较常用的有微软的Visual Basic、Visual C++、中文Visual Foxpro、Borland公司的Delphi等。
4. 可视化程序设计中有哪些基本概念?主要的几个基本概念有表单、组件、属性、事件、方法等。
5. 什么是表单(Form)?表单是指进行程序设计时的窗口,我们主要是通过在表单中放置各种部件(如命令按钮、复选框、单选框、滚动条等)来布置应用程序的运行界面。
6. 什么是组件?所谓组件,就是组成程序运行界面的各种部件,如:命令按钮、复选框、单选框、滚动条等。
7. 什么是属性?属性就是组件的性质。
它说明组件在程序运行的过程中是如何显示的、组件的大小是多少、显示在何处、是否可见、是否有效……8. 属性可以分成哪几类?属性可分成三类,设计属性:是在进行设计时就可发挥作用的属性;运行属性:这是在程序运行过程中才发挥作用的属性;只读属性:是一种只能查看而不能改变的属性。
MFC编程总结各种控件使用说明
MFC各种控件的使用说明把整数显示为时间格式的方法:Int minute=5; int sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);定时器的使用方法:在函数BOOL CDingshiqiDlg::OnInitDialog(){SetTimer(1,1000,NULL);}添加语句SetTimer(1,1000,NULL);定时器1秒钟中断一次.然后添加消息WM_TIMER对应的消息函数:void CDingshiqiDlg::OnTimer(UINT nIDEvent){}播放系统声音的方法:在头文件添加这两句#include<mmsystem.h>#pragma comment (lib,"winmm.lib")然后调用函数: PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);VC++6.0控件工具箱:2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon)3 静态文本(Static Text):MFC提供了CStatic类支持静态控件。
(1)更改该控件上字体的方法是:该控件的ID为IDC_STATIC1,IDC_STATIC2.CFont * f1;f1 = new CFont;f1 -> CreateFont( 25 , // nHeight15, // nWidth0 , // nEscapement0 , // nOrientationFW_BOLD, // nWeightFALSE , // TRUEbItalicFALSE, // bUnderline0 , // cStrikeOutDEFAULT_CHARSET, //ANSI_CHARSET nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_PITCH | FF_SWISS, // nPitchAndFamily_T( " 宋体" )); // lpszFacGetDlgItem(IDC_STATIC1)-> SetFont(f1);GetDlgItem(IDC_STATIC2)-> SetFont(f1);另一种改变字体大小的方法: 在函数外定义CStatic m_static;CFont font;m_static.SubclassDlgItem(IDC_STAT_DIS,this);LOGFONT log;GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);log.lfHeight=300; //改log.lfWidth=120; //改log.lfCharSet=GB2312_CHARSET;lstrcpy(log.lfFaceName, _T("宋体"));font.CreateFontIndirect(&log);m_static.SetFont(&font);(2) 把整数显示在该控件的方法:IDC_STAT_DIS为控件IDInt minute=5,sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);另外一种显示的方法:CStatic*pst=(CStatic *)GetDlgItem(IDC_STAT_DIS);pst->SetWindowText("00:00");4 编辑框(Edit Box):MFC提供了CEdit类支持编辑框控件。
显示时间的代码
在MFC的对话框标题栏显示当前时间,以及实现显示软件使用经过的时间分类:MFC 2009-09-15 00:06 676人阅读评论(4) 收藏举报首先建立一个MFC对话框程序,然后在对话框类里添加如下成员private:CTime m_beginTime;//软件启动时间CTime m_EndTime;//软件结束时间然后在初始化对话框函数OnInitDialog()里添加如下代码m_beginTime = CTime::GetCurrentTime();//给予当前软件的启动时间SetTimer(1,1000,NULL);//设置时钟建立两个消息事件WM_TIMER 与WM_CLOSE[cpp]view plaincopyprint?1. v oid CMyClockDlg::OnTimer(UINT nIDEvent)2. {3. //创建一个当前时间4. CTime cTime = CTime::GetCurrentTime();5. CString strTime;6. //字符串格式化时间7. strTime.Format("当前时间:%d年%d月%d日%d时%d分%d秒",cTime.GetYear(),cTime.GetMonth(),cTime.GetDay(),cTime.GetHour(),cTime.GetMinute(),cTime.GetSecond());8. //设置当前窗口标题9. SetWindowText(strTime);10.11. CDialog::OnTimer(nIDEvent);12. }1. v oid CMyClockDlg::OnClose()2. {3. // 将定时器1删除4. KillTimer(1);5. //给予软件终结时间6. m_EndTime = CTime::GetCurrentTime();7. //取得软件从开始到结束经过的秒数8. CTimeSpan ctSpan = m_EndTime - m_beginTime; CString strTime;9. //格式化经过的时间10. strTime.Format("软件运行时间:%d日%d时%d分%d秒",ctSpan.GetDays(),ctSpan.GetHours(),ctSpan.GetMinutes(),ctSpan.GetSeco nds());11. //输出12. MessageBox(strTime);13.14. CDialog::OnClose();。
多时区时钟软件的设计与实现论文
多时区时钟软件的设计与实现摘要进入21世纪以来,电脑用户数迅速增长,网上的跨国交流也越见频繁,由于时差的关系,不同国家的作息不同,因此需要经常进行时间的切换。
本系统主要论述如何利用VC++6.0应用程序开发环境和微软基础类库(MFC),设计与实现一个基于对话框的多时区时钟软件。
该软件主要包括时钟显示,闹钟报时以及计时器功能。
其中,时钟显示包含单时区时钟显示和多时区时钟显示,计时器可实现倒计时与正常计时。
利用MFC中与定时器相关的函数,实现计时和时钟的定时刷新;运用模运算实现不同时区的时间转换;采用多线程技术使三个时钟同时运行。
关键词:VC++;MFC;时钟;多线程The design and realization of Multi_ time_ zone ClockAbstractSince the 21st Century, the number of computer users has increased quickly,the communication among different countries on Internet becomes more and more frequent. Because of the time difference, every country has its own timetable, you need to switch the time frequently.This system has discussed how to design and realize a clock with Visual C++6.0 and Microsoft Foundation Class. This software principally contains these functions: the display of clocks, alarm clock and timer. The function of clock display contains the displays of single time zone clocks and multi time zone clocks. The timer can realize functions of countdown and clock. Take use of the functions related to the timer in Microsoft Foundation Class library to implement time and regular update of the clocks; the time conversion of different time zone could use modular arithmetic to realize; and taking advantage of multithreading could make three clocks run at the same time.Key words:Visual C++; MFC; clock; multithreading目录论文总页数:27页1 引言 (1)1.1课题背景及意义 (1)1.2 课题的研究方法 (1)2 程序功能描述 (1)2.1 时钟显示 (1)2.1.1 单时钟显示 (1)2.1.2 多时钟显示 (1)2.2闹钟功能 (1)2.3计时器 (2)2.3.1 倒计时 (2)2.3.2 正常计时 (2)2.4 开发环境 (2)2.4.1 开发环境 (2)2.4.2 Visual C++ 6.0简介 (2)3 主要开发技术 (3)3.1 MFC简介 (3)3.2 MFC的线程 (3)3.2.1多线程概述 (3)3.2.2 MFC的线程 (4)4 程序功能实现 (5)4.1单时钟显示 (5)4.2多时钟显示 (10)4.3闹钟报时 (13)4.4计时器 (17)4.4.1倒计时 (17)4.4.2正常计时 (20)结论 (22)参考文献 (23)附录 (24)致谢 (26)声明 (27)1 引言1.1课题背景及意义随着社会的发展,进入21世纪,个人电脑已经进入千家万户,人们已习惯于以互联网的方式交流,学习和娱乐。
基于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 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 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 时间转换函数
mfc 时间转换函数
MFC(Microsoft Foundation Class)是微软公司提供的用于开
发Windows应用程序的类库。
在MFC中,时间转换函数用于将时间
表示的不同格式相互转换,常用的时间转换函数包括以下几种:
1. COleDateTime类的相关函数,COleDateTime是MFC中表示
日期时间的类,它提供了一系列函数用于时间的转换,比如GetYear、GetMonth、GetDay等用于获取年、月、日,Format用于
将时间格式化成字符串,ParseDateTime用于将字符串解析成时间等。
2. CTime类的相关函数,CTime是MFC中表示时间的类,它也
提供了一些函数用于时间的转换,包括GetYear、GetMonth、
GetDay等用于获取年、月、日,Format用于将时间格式化成字符串,GetTime和SetTime用于获取和设置时间等。
3. 使用CStdioFile类中的相关函数,CStdioFile类提供了一
些用于文件操作的函数,其中包括一些用于读取和写入时间格式的
函数,可以通过这些函数将时间转换成字符串或者从字符串中解析
出时间。
总的来说,MFC提供了丰富的时间转换函数,可以满足不同场景下的时间操作需求。
开发者可以根据具体的需求选择合适的时间转换函数来完成时间的格式化、解析和转换操作。
同时,MFC还提供了一些与系统时间相关的函数,比如获取当前系统时间、设置系统时间等,这些函数也可以帮助开发者进行时间的转换操作。
在使用这些时间转换函数时,开发者需要注意参数的传递和返回值的处理,以确保时间转换操作的准确性和可靠性。
电脑桌面时钟的代码
电脑桌面时钟的代码
以下是一个使用Python编写的简单桌面时钟的代码示例。
这个程序使用了tkinter库来创建一个图形用户界面(GUI),并使用time库来获取和显示当前时间。
python复制代码
import tkinter as tk
import time
def time_now():
current_time = time.strftime('%H:%M:%S') clock.config(text=current_time)
clock.after(1000, time_now)
root = ()
clock = bel(root, font=('times', 50, 'bold'), bg='green')
clock.pack(fill='both', expand=1)
time_now()
root.mainloop()
在这个代码中,time_now函数是用来获取当前时间并更新时钟显示的。
clock.after(1000, time_now)会在1秒(1000毫秒)后再次调用time_now函数,因此时钟的显示会每秒更新一次。
你可以根据自己的需要修改这个程序,例如改变字体、背景颜色、窗口大小等等。
如果你不熟悉tkinter,可能需要花一些时间来学习如何使用它,但是一旦你掌握了,就可以创建出各种复杂的GUI应用。
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框架的介绍与应用MFC(Microsoft Foundation Class)是一种基于C++的编程框架,用于开发Windows应用程序。
该框架是微软推出的一种基于消息机制的图形用户界面(GUI)框架,旨在简化Windows应用程序开发的复杂度。
下面将介绍MFC框架的基本组成和应用。
一、MFC框架的基本组成MFC框架由多个类库组成,包括应用框架、控件库、GDI(图形设备接口)和基础设施库等。
其中,应用框架是构成整个应用程序的基础,控件库提供了大量可视化元素,GDI和基础设施库则为开发人员提供了强大的图形处理能力。
1. 应用框架应用框架是MFC框架的核心,包括了窗口管理、消息处理、应用程序生命周期等一系列功能。
在应用程序开发过程中,开发人员需要继承CWinApp类,该类提供了应用程序的生命周期管理、初始化、清理等操作,使应用程序能够顺利运行。
2. 控件库控件库是MFC框架中最为重要的组件之一,提供了丰富的可视化元素,如按钮、文本框、标签等等。
开发人员可以在应用程序中使用这些控件,实现丰富的用户界面交互。
同时,控件库还提供了许多高级控件,例如Tree Control、List Control等,支持各种不同的交互方式,大大增强了用户的操作体验。
3. GDIGDI是图形设备接口,是MFC框架中最为重要的图形处理组件。
它提供了许多图形操作API,支持诸如绘制、渲染等操作,还支持丰富的图像格式转换、裁剪等操作。
开发人员可以使用GDI轻松操作图形,实现各种复杂的图形效果。
4. 基础设施库基础设施库是MFC框架中提供的帮助开发人员快速开发业务处理的组件,例如数据库操作、网络通信、多线程编程等。
它提供了各种常用的工具类和函数,帮助开发人员编写高效、易维护的代码。
二、MFC框架的应用MFC框架的应用范围广泛,可以用于开发许多不同类型的软件,例如桌面应用程序、图形处理软件、嵌入式软件等。
下面将以桌面应用程序为例,介绍MFC框架的应用实例。
mfc timer用法
mfc timer用法MFC(Microsoft Foundation Classes)是一个C++的框架,用于开发Windows应用程序。
MFC提供了一系列的类和函数,其中包含了一个计时器类CTimer,用于定时触发特定的动作。
使用MFC的计时器,需要按照以下步骤进行操作:1. 在需要使用计时器的类的头文件中,包含`afxwin.h`和`afxext.h`头文件。
```#include <afxwin.h>#include <afxext.h>```2. 在类中声明计时器对象。
```CTimer m_timer;```3. 在类的构造函数中,进行计时器的初始化设置。
```m_timer.SetInterval(1000); // 设置计时器触发的时间间隔,单位为毫秒m_timer.StartTimer(); // 启动计时器```4. 在需要处理计时器触发事件的地方,添加相应的消息处理函数。
```afx_msg void OnTimer(UINT_PTR nIDEvent); // 声明消息处理函数DECLARE_MESSAGE_MAP() // 声明消息映射```5. 在消息处理函数中添加具体的处理逻辑。
```void CMyClass::OnTimer(UINT_PTR nIDEvent){if (nIDEvent == m_timer.GetTimerID()){// 处理计时器触发事件的逻辑}else{// 处理其他计时器触发事件的逻辑}}```6. 在类的实现文件中,使用`ON_WM_TIMER()`宏来指定消息映射。
```BEGIN_MESSAGE_MAP(CMyClass, CWnd)ON_WM_TIMER()END_MESSAGE_MAP()```通过以上步骤,就可以在MFC应用程序中使用计时器实现定时触发特定的动作了。
用C++编写模拟时钟程序
模拟时钟程序1 基本功能描述本次课程设计是基于面向对象的应用程序设计,主要运用C++语言在VC++开发环境下的MFC中编程实现。
模拟时钟的基本功能是程序初始在屏幕上有一指针式时钟表盘,表盘为椭圆形,内部分布有12个刻度,表盘上有三个长度和颜色不同的时针分针和秒针,相互之间容易辨认,指针的运动通过数学推导之后以代码实现。
表盘的下方是一个数字形式显示的数字钟,其显示时间的格式是时:分:秒,指针式时钟和数字式时钟显示的时间同步,且两个时钟所显示的时间与系统时间相致,页面的菜单项设有时间设置项,可以对所显示的时间进行调整,能进行调整的具体内容是年、月、日、时、分、秒。
设计成功之后,此应用程序便可以起到时钟显示的作用。
2 设计思路2.1 程序流程图图1 模拟时钟程序流程图2.2 程序流程分析(1) 绘制指针式的时钟和数字式的时钟图形时,要在CView类下进行。
其中OnDraw()函数在绘制视图窗口时被调用,在定义了画刷CBrush和画笔CPen之后,调用GetClientRect()定义屏幕大小并确定椭圆中心的坐标,然后调用Ellipse绘制椭圆,即指针式的时钟表盘,SetTextColor绘制文本颜色,调用MoveTo和LineTo绘制表盘指针,同时调用CreateFont()创建数字钟字体,TextOut则是用以数字钟的文本输出。
(2) 模拟时钟处理消息的过程:首先调用SetTimer函数定义时钟消息,包括参数指定计时器的ID,消息产生的时间间隔,回调函数为NULL;调用消息处理函数OnTimer()刷新窗口显示。
在相应的WM_TIMER消息处理里添加时钟消息响应代码;最后调用KillTimer 释放该时钟。
(3) 要实现时钟的动态效果,即时间窗显示的时间每隔一秒钟更新一次,需要在时间窗格的正文调用CStatusBar::SetPaneText()函数。
要定时更新,则应利用WM_TIMER消息,计时器每隔一定的时间间隔就会发出一个WM_TIMER消息,而这个时间间隔可由用户指定。
计算机图形学 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++指针型闹钟课程设计
课程设计说明书题目:指针型闹钟学院名称:专业班级:姓名学号:指导教师:2013 年 07 月课程设计任务书专业班级:学生姓名:指导教师:一、课程设计题目:设计一个如图所示的指针式闹钟二、目的与要求:1、目的:(1)要求学生熟练掌握C++语言的基本知识和C++调试技能;(2)掌握用C++开发应用程序的一般步骤和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象的程序设计问题。
(4)培养学生综合利用C++语言进行程序设计的能力,主要是培养学生利用系统提供的标准图形函数进行创新设计。
2、基本要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;(2)要求在设计的过程中,对Windows环境下的编程有一个基本的认识;(3)学会Windows环境下绘图的基本方法;(4)能够完成基本的钟表的走时功能、对表功能、定时功能;(5)界面美观大方。
3、创新要求:在基本要求达到后,可进行创新设计,如定时提醒功能、声音提醒功能、定时运行别的程序的功能等。
4、写出设计说明书按照设计过程写出设计说明书。
三、设计方法和基本原理:1、问题描述(功能要求):要求所编写的闹钟能够完成基本的走时、对时、定时功能。
2、问题的解决方案(参考):根据题目的要求,可以将问题解决分为以下步骤:(1)分析问题,画出要解决问题的流程图(类及其层次结构图);(2)利用对话框编辑器完成界面的设计,要求界面要美观实用;(3)添加成员变量和成员函数(消息映射函数);(4)利用结构化程序的设计思路完成秒针、分针、时针的走动及闹铃指针的设置。
(5)程序功能调试;(6)完成系统总结报告以及系统使用说明书。
四、设计中涉及到的重要内容及关键技术:1、对话框应用程序的编写方法及其相关函数;2、绘图工具的使用方法;3、一些常用系统API函数的使用方法。
五、程序设计和调试:编写程序代码、完成程序调试。
六、编写课程设计说明书:按照课程设计说明书的规范格式要求以及说明书中的内容要求编写课程设计说明书。
MFC 提供了两个 日期 和 时间 类CTime和CTimeSpan
time_t time(time_t * timer);日历时间函数
char * asctime(const struct tm * timeptr);将tm类的时间结构转化为固定时间格式
char * ctime(const time_t *timer);将日历时间转化为固定时间格式
operator –减小CTime和CTimeSpan对象。
operator += CTime对象加一个CTimeSpan对象。
operator -= CTime对象减一个CTimeSpan对象。
operator ==比较两个绝对时间是否相等。
operator !=比较两个绝对时间是否不相等。
operator <比较两个绝对时间,是否前一个大于后一个。
operator >比较两个绝对时间,是否前一个小于后一个。
operator >=比较两个绝对时间,是否前一个大于等于后一个。
operator <=比较两个绝对时间,是否前一个小于等于后一个
二、总结
首先看几个函数的原型的声明(在time.h中):
clock_t clock( void ) clock_t是用来保存时间的数据类型,是long型
//local=gmtime(&t);
cout<<local->tm_hour;
2.以固定的时间格式获得日期和时间:看清这两个函数的参和返回值的类型
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);
mfc计算时间差
mfc计算时间差MFC是Microsoft Foundation Class的缩写,是微软公司为Windows操作系统开发的一套类库。
它提供了丰富的功能和工具,方便开发人员快速搭建Windows应用程序。
在MFC中,我们可以使用CDateTime类来计算时间差。
计算时间差是指计算两个时间点之间的时间间隔。
在实际开发中,我们经常需要计算两个时间点之间的时间差,比如计算某个任务的执行时间,或者计算两个事件的间隔时间等。
MFC提供了一系列的函数和方法来实现时间差的计算。
我们需要获取两个时间点的值。
在MFC中,可以通过CDateTime 类来表示一个时间点。
CDateTime类提供了获取当前时间的方法,可以使用GetTime方法获取当前时间的值。
例如,下面的代码可以获取当前时间的值:```cppCDateTime currentTime;currentTime.GetTime();```获取时间差的方法有很多种,下面介绍其中一种常用的方法。
我们可以使用COleDateTime类来表示一个时间点,并使用COleDateTimeSpan类来表示两个时间点之间的时间间隔。
COleDateTime类提供了从CDateTime类获取时间值的方法,可以使用GetTime方法获取时间值。
COleDateTimeSpan类提供了计算时间差的方法,可以使用COleDateTimeSpan的构造函数来计算时间差。
例如,下面的代码可以计算两个时间点之间的时间差:```cppCDateTime startTime;CDateTime endTime;// 获取开始时间和结束时间的值startTime.GetTime();endTime.GetTime();// 计算时间差COleDateTimeSpan timeSpan(endTime - startTime);// 获取时间差的各个部分int hours = timeSpan.GetHours();int minutes = timeSpan.GetMinutes();int seconds = timeSpan.GetSeconds();```上述代码中,我们首先获取开始时间和结束时间的值,然后使用COleDateTimeSpan类的构造函数计算时间差,最后使用COleDateTimeSpan类的GetHours、GetMinutes和GetSeconds方法获取时间差的小时、分钟和秒数。
mfc 时间转换函数
mfc 时间转换函数MFC 时间转换函数在MFC 编程中,时间转换函数是非常常用的一个功能。
它可以将不同的时间格式相互转换,方便开发者在不同场景下使用。
一、将字符串转换为时间格式在实际开发中,我们经常会遇到将字符串转换为时间格式的需求。
比如,从用户输入的日期字符串中获取具体的年、月、日等信息。
这时,可以使用 MFC 提供的函数 CString::Format 进行转换。
例如,我们有一个日期字符串"2021-01-01",我们想要获取其中的年份。
可以使用以下代码实现:```cppCString strDate = "2021-01-01";int nYear = 0;sscanf_s(strDate, "%d", &nYear);```这样,变量nYear 就存储了字符串中的年份值。
同样的道理,我们也可以获取月份和日期的值。
二、将时间格式转换为字符串除了将字符串转换为时间格式,有时我们还需要将时间格式转换为字符串,以便于展示给用户或保存到文件中。
MFC 提供了一系列的格式化输出函数,可以方便地实现这个功能。
例如,我们有一个时间变量dt,表示当前的日期和时间。
我们可以使用以下代码将其转换为字符串:```cppCTime dt = CTime::GetCurrentTime();CString strDate = dt.Format("%Y-%m-%d");```这样,strDate 就存储了当前日期的字符串表示,格式为"2021-01-01"。
三、其他时间转换函数除了上述的字符串转换函数,MFC 还提供了一些其他的时间转换函数,用于处理更复杂的时间操作。
比如,CTimeSpan 类可以用来计算两个时间之间的时间间隔,CTime 类提供了一些日期和时间的基本操作。
四、总结MFC 时间转换函数是开发中经常使用的功能之一,能够方便地实现字符串和时间格式之间的相互转换。
mfc ctime的用法
mfc ctime的用法
MFCCTime是一种日期和时间类,用于在MFC应用程序中管理日期和时间。
它提供了许多有用的方法,例如获取当前日期和时间、格式化日期和时间字符串、比较两个日期和时间等。
使用CTime类,可以轻松地在MFC应用程序中处理日期和时间。
CTime类的构造函数有多种重载形式,可以接受不同的参数类型。
例如,可以使用当前日期和时间创建一个CTime对象,也可以使用表示日期和时间的整数值创建一个CTime对象。
还可以使用字符串表示的日期和时间创建CTime对象。
CTime类还提供了许多有用的方法,例如GetYear、GetMonth、GetDay、GetHour、GetMinute和GetSecond,可以从CTime对象中获取日期和时间的各个部分。
还可以使用Format方法将CTime对象格式化为字符串表示形式,并使用ParseDateTime方法将字符串解析为CTime对象。
CTime类还提供了一些与日期和时间比较相关的方法,例如Compare、operator<、operator>、operator==等。
这些方法可以帮助开发人员比较两个日期和时间,以确定它们的关系。
总之,MFC CTime是一种非常有用的日期和时间类,可以帮助开发人员在MFC应用程序中轻松处理日期和时间。
掌握CTime的用法可以使开发人员更加高效地编写MFC应用程序。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// clockDlg.cpp : implementation file//#include "stdafx.h"#include "clock.h"#include "clockDlg.h"#include "math.h"#include "mmsystem.h"#include "windows.h"#include "time.h"#pragma comment(lib,"winmm.lib")#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg)protected://}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}//DEL void CAboutDlg::DoDataExchange(CDataExchange* pDX)//DEL {//DEL CDialog::DoDataExchange(pDX);//DEL //{{AFX_DATA_MAP(CAboutDlg)//DEL //}}AFX_DATA_MAP//DEL }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CClockDlg dialogCClockDlg::CClockDlg(CWnd* pParent /*=NULL*/): CDialog(CClockDlg::IDD, pParent){//{{AFX_DATA_INIT(CClockDlg)m_x = 0;m_y = 0;m_seth = 0;m_setm = 0;m_sets = 0;m_z = 0;sum=0,s=1,m=0,h=0;int i,j;//char ch[15][3]={"12","1","2","3","4","5","6","7","8","9","10","11"};for(i=0;i<15;i++)for(j=0;j<3;j++)ch[i][j]='\0';ch[0][0]='1',ch[0][1]='2',ch[1][0]='1',ch[2][0]='2',ch[3][0]='3',ch[4][0]='4',ch[5][0]='5',ch[6][ 0]='6',ch[7][0]='7',ch[8][0]='8',ch[9][0]='9',ch[10][0]='1',ch[10][1]='0',ch[11][0]='1',ch[11][1]='1';o_x=175,o_y=175;ss=false,sss=false;memset(flag,false,sizeof(flag));//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CClockDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CClockDlg)DDX_Text(pDX, IDC_EDIT1, m_x);DDX_Text(pDX, IDC_EDIT2, m_y);DDX_Text(pDX, IDC_EDIT5, m_seth);DDX_Text(pDX, IDC_EDIT6, m_setm);DDX_Text(pDX, IDC_EDIT7, m_sets);DDX_Text(pDX, IDC_EDIT3, m_z);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CClockDlg, CDialog)//{{AFX_MSG_MAP(CClockDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Draw, OnDraw)ON_WM_TIMER()ON_BN_CLICKED(IDC_Set, OnSet)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CClockDlg message handlersBOOL CClockDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CClockDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CClockDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CClockDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}/*void CClockDlg::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_x=point.x;m_y=point.y+25;UpdateData(false);CDialog::OnMouseMove(nFlags, point);}*//****************************************************************************** ************/const double PI=3.1415926;void CClockDlg::OnDraw(){// TODO: Add your control notification handler code hereif(!ss){CTime t=CTime::GetCurrentTime();seth=t.GetHour();setm=t.GetMinute();sets=t.GetSecond();temp1=seth;sum=(seth%12)*3600+60*setm+sets;h=(seth%12)*5+setm/12;m=setm;s=sets;}sum=seth*3600+60*setm+sets;m_x=temp1,m_y=setm,m_z=sets;//m_x=m_x%12*5+m_y/12;UpdateData(false);CDC *pDC;CPen Newpen,*Oldpen;pDC=GetWindowDC();Newpen.CreatePen(PS_SOLID,2,RGB(255,255,255));Oldpen=pDC->SelectObject(&Newpen);pDC->Ellipse(50,50,300,300);Newpen.DeleteObject();/*******************清除圆内********************/Newpen.CreatePen(PS_SOLID,2,RGB(132,125,177));pDC->SelectObject(&Newpen);pDC->Ellipse(50,50,300,300);Newpen.DeleteObject();/********************圆*******************************/Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo(175,175);pDC->LineTo(175,175);/******************圆心*****************************/pDC->SelectObject(&Newpen);double coner=0.0;int num=15;for(int o=0;o<60;o++){Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,3,RGB(132,125,177));pDC->SelectObject(&Newpen);int uux,uuy;uux=(int)(175+120*cos(coner));uuy=(int)(175-120*sin(coner));pDC->MoveTo(uux,uuy);pDC->LineTo(uux,uuy);//pDC->TextOut(uux,uuy,num);x[num]=uux,y[num--]=uuy;if((num+1)%5==0){Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo(uux,uuy);pDC->LineTo(uux,uuy);}if(num<0)num=59;coner+=PI/30.0;}/*******************获取60个点的坐标*****************************************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->TextOut(x[0]-6,y[0]+4,"12");pDC->TextOut(x[5]-6,y[5]+4,"1");pDC->TextOut(x[10]-11,y[10]-4,"2");pDC->TextOut(x[15]-11,y[15]-6,"3");pDC->TextOut(x[20]-11,y[20]-8,"4");pDC->TextOut(x[25]-7,y[25]-17,"5");pDC->TextOut(x[30]-3,y[30]-17,"6");pDC->TextOut(x[35]+2,y[35]-17,"7");pDC->TextOut(x[40]+4,y[40]-9,"8");pDC->TextOut(x[45]+4,y[45]-8,"9");pDC->TextOut(x[50]+4,y[50]-7,"10");pDC->TextOut(x[55]+2,y[55]-1,"11");/**********************12个数字**********************************************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,2,RGB(255,0,0));pDC->SelectObject(&Newpen);for(int i=0;i<60;i++){if(i==0){S_x[i]=175;S_y[i]=75;M_x[i]=175;M_y[i]=95;M_X[i]=175;M_Y[i]=105;H_x[i]=175;H_y[i]=125;H_X[i]=175;H_Y[i]=135;end_x[i]=175;end_y[i]=185;}else if(i==30){S_x[i]=175;S_y[i]=275;M_x[i]=175;M_y[i]=255;M_X[i]=175;M_Y[i]=245;H_x[i]=175;H_y[i]=225;H_X[i]=175;H_Y[i]=215;end_x[i]=175;end_y[i]=165;}else if(i<30){t=1.0*(10000*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350* x[i]);S_x[i]=sqrt(t)+175;S_y[i]=(S_x[i]-175)*(y[i]-175)/(x[i]-175)+175;/*************秒针终点坐标*****************/t=1.0*(6400*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);M_x[i]=sqrt(t)+175;M_y[i]=(M_x[i]-175)*(y[i]-175)/(x[i]-175)+175;t=1.0*(4900*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x[i]);M_X[i]=sqrt(t)+175;M_Y[i]=(M_X[i]-175)*(y[i]-175)/(x[i]-175)+175;/************分针终点坐标*******************/t=1.0*(2500*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);H_x[i]=sqrt(t)+175;H_y[i]=(H_x[i]-175)*(y[i]-175)/(x[i]-175)+175;t=1.0*(1600*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);H_X[i]=sqrt(t)+175;H_Y[i]=(H_X[i]-175)*(y[i]-175)/(x[i]-175)+175;/**************时针终点坐标*****************/t=1.0*(100*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x[i ]);end_x[i]=-1*sqrt(t)+175;end_y[i]=(end_x[i]-175)*(y[i]-175)/(x[i]-175)+175;/*************三针的尾部坐标*********************/}else{t=1.0*(10000*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x[i]);S_x[i]=-1*sqrt(t)+175;S_y[i]=(S_x[i]-175)*(y[i]-175)/(x[i]-175)+175;/*************秒针终点坐标*****************/t=1.0*(6400*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);M_x[i]=-1*sqrt(t)+175;M_y[i]=(M_x[i]-175)*(y[i]-175)/(x[i]-175)+175;t=1.0*(4900*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x[i]);M_X[i]=-1*sqrt(t)+175;M_Y[i]=(M_X[i]-175)*(y[i]-175)/(x[i]-175)+175;/************分针终点坐标*******************/t=1.0*(2500*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);H_x[i]=-1*sqrt(t)+175;H_y[i]=(H_x[i]-175)*(y[i]-175)/(x[i]-175)+175;t=1.0*(1600*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x [i]);H_X[i]=-1*sqrt(t)+175;H_Y[i]=(H_X[i]-175)*(y[i]-175)/(x[i]-175)+175;/**************时针终点坐标*****************/t=1.0*(100*(x[i]*x[i]+30625-350*x[i]))/(y[i]*y[i]+30625-350*y[i]+x[i]*x[i]+30625-350*x[i ]);end_x[i]=sqrt(t)+175;end_y[i]=(end_x[i]-175)*(y[i]-175)/(x[i]-175)+175;/*************三针的尾部坐标*********************/}}/******************************计算三针起点和终点坐标****************************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,5,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_x%12*5+m_y/12],(int)end_y[m_x%12*5+m_y/12]);pDC->LineTo((int)H_X[m_x%12*5+m_y/12],(int)H_Y[m_x%12*5+m_y/12]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_x%12*5+m_y/12],(int)end_y[m_x%12*5+m_y/12]);pDC->LineTo((int)H_x[m_x%12*5+m_y/12],(int)H_y[m_x%12*5+m_y/12]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,3,RGB(0,0,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[setm],(int)end_y[setm]);pDC->LineTo((int)M_x[setm],(int)M_y[setm]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[setm],(int)end_y[setm]);pDC->LineTo((int)M_X[setm],(int)M_Y[setm]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,2,RGB(255,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[sets],(int)end_y[sets]);pDC->LineTo((int)S_x[sets],(int)S_y[sets]);/******************************绘制三针初始化时的状态*************************/SetTimer(1,1000,NULL);s=sets+1;memset(flag,false,sizeof(flag));}/****************************************************************************** ****************************/void CClockDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultsum++;//count++;m_x=sum/3600,m_y=(sum-m_x*3600)/60,m_z=sum-m_x*3600-m_y*60;m_x=(m_x+m_y/60)%24,m_y=(m_y+m_z/60)%60,m_z%=60;UpdateData(false);CDC *pDC;CPen Newpen,*Oldpen;pDC=GetWindowDC();Newpen.CreatePen(PS_SOLID,2,RGB(255,255,255));Oldpen=pDC->SelectObject(&Newpen);pDC->Ellipse(73,73,277,277);Newpen.DeleteObject();/*******************清除圆内,对原来的三针进行擦除********************/if(m_x==0&&m_y==0&&flag[0]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_00.wav",SND_ASYNC);flag[0]=true;flag[23]=false;}if(m_x==1&&m_y==0&&flag[1]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_01.wav",SND_ASYNC);flag[1]=true;flag[0]=false;}if(m_x==2&&m_y==0&&flag[2]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_02.wav",SND_ASYNC);flag[2]=true;flag[1]=false;}if(m_x==3&&m_y==0&&flag[3]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_03.wav",SND_ASYNC);flag[3]=true;flag[2]=false;}if(m_x==4&&m_y==0&&flag[4]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_04.wav",SND_ASYNC);flag[4]=true;flag[3]=false;}if(m_x==5&&m_y==0&&flag[5]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_05.wav",SND_ASYNC);flag[5]=true;flag[4]=false;}if(m_x==6&&m_y==0&&flag[6]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_06.wav",SND_ASYNC);flag[6]=true;flag[5]=false;}if(m_x==7&&m_y==0&&flag[7]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_07.wav",SND_ASYNC);flag[7]=true;flag[6]=false;}if(m_x==8&&m_y==0&&flag[8]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_08.wav",SND_ASYNC);flag[8]=true;flag[7]=false;}if(m_x==9&&m_y==0&&flag[9]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_09.wav",SND_ASYNC);flag[9]=true;flag[8]=false;}if(m_x==10&&m_y==0&&flag[10]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_10.wav",SND_ASYNC);flag[10]=true;flag[9]=false;}if(m_x==11&&m_y==0&&flag[11]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_11.wav",SND_ASYNC);flag[11]=true;flag[10]=false;}if(m_x==12&&m_y==0&&flag[12]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_12.wav",SND_ASYNC);flag[12]=true;flag[11]=false;}if(m_x==13&&m_y==0&&flag[13]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_13.wav",SND_ASYNC);flag[13]=true;flag[12]=false;}if(m_x==14&&m_y==0&&flag[14]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_14.wav",SND_ASYNC);flag[14]=true;flag[13]=false;}if(m_x==15&&m_y==0&&flag[15]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_15.wav",SND_ASYNC);flag[15]=true;flag[14]=false;}if(m_x==16&&m_y==0&&flag[16]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_16.wav",SND_ASYNC);flag[16]=true;flag[15]=false;}if(m_x==17&&m_y==0&&flag[17]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_17.wav",SND_ASYNC);flag[17]=true;flag[16]=false;}if(m_x==18&&m_y==0&&flag[18]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_18.wav",SND_ASYNC);flag[18]=true;flag[17]=false;}if(m_x==19&&m_y==0&&flag[19]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_19.wav",SND_ASYNC);flag[19]=true;flag[18]=false;}if(m_x==20&&m_y==0&&flag[20]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_20.wav",SND_ASYNC);flag[20]=true;flag[19]=false;if(m_x==21&&m_y==0&&flag[21]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_21.wav",SND_ASYNC);flag[21]=true;flag[20]=false;}if(m_x==22&&m_y==0&&flag[22]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_22.wav",SND_ASYNC);flag[22]=true;flag[21]=false;}if(m_x==23&&m_y==0&&flag[23]==false){sndPlaySound("C:\\Users\\Administrator\\Desktop\\可视化编程\\clock\\raw\\s_23.wav",SND_ASYNC);flag[23]=true;flag[22]=false;}/****************************整点报时******************************************//*Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,9,RGB(255,255,255));Oldpen=pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[h],(int)end_y[h]);pDC->LineTo((int)H_x[h],(int)H_y[h]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,9,RGB(255,255,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m],(int)end_y[m]);pDC->LineTo((int)M_x[m],(int)M_y[m]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,2,RGB(255,255,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[s-1],(int)end_y[s-1]);pDC->LineTo((int)S_x[s-1],(int)S_y[s-1]);/*********************白线覆盖****************************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo(o_x,o_y);pDC->LineTo(o_x,o_y);/************************对圆心进行修补*******************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);if((s-1)%5==0){pDC->TextOut(a[s-1],b[s-1],ch[(s-1)/5]);pDC->MoveTo(x[s-1],y[s-1]);pDC->LineTo(x[s-1],y[s-1]);}/********************对整点数字及整点所对应的点进行修补***************************/else{Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,3,RGB(132,125,177));pDC->SelectObject(&Newpen);pDC->MoveTo(x[s-1],y[s-1]);pDC->LineTo(x[s-1],y[s-1]);}/*******************对其他各点进行修补**********************************/if(s%60==0)s=0;/*******************循环转圈************************************/if(sum%720==0&&sum>0){h++;}if(h%60==0)h=0;m=sum/60;Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_x%12*5+m_y/12],(int)end_y[m_x%12*5+m_y/12]);pDC->LineTo((int)H_x[m_x%12*5+m_y/12],(int)H_y[m_x%12*5+m_y/12]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,5,RGB(0,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_x%12*5+m_y/12],(int)end_y[m_x%12*5+m_y/12]);pDC->LineTo((int)H_X[m_x%12*5+m_y/12],(int)H_Y[m_x%12*5+m_y/12]);/**************对时针进行修补**************************/m%=60;seth+=m/60;if(m==60)m=0;Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,3,RGB(0,0,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_y%60],(int)end_y[m_y%60]);pDC->LineTo((int)M_x[m_y%60],(int)M_y[m_y%60]);Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,4,RGB(0,0,255));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[m_y%60],(int)end_y[m_y%60]);pDC->LineTo((int)M_X[m_y%60],(int)M_Y[m_y%60]);/*********************对分针进行修补***********************/Newpen.DeleteObject();Newpen.CreatePen(PS_SOLID,2,RGB(255,0,0));pDC->SelectObject(&Newpen);pDC->MoveTo((int)end_x[s],(int)end_y[s]);pDC->LineTo((int)S_x[s],(int)S_y[s]);/******************画出下一时刻的秒针**********************/ s++;CDialog::OnTimer(nIDEvent);}/****************************************************************************** **********************************************/void CClockDlg::OnSet(){// TODO: Add your control notification handler code heress=true;CDC *pDC;CPen Newpen,*Oldpen;pDC=GetWindowDC();Newpen.DeleteObject();if(sum>0){Newpen.CreatePen(PS_SOLID,2,RGB(255,255,255));Oldpen=pDC->SelectObject(&Newpen);pDC->Ellipse(73,73,277,277);Newpen.DeleteObject();Newpen.DeleteObject();sss=true;}/*******************清除圆内,对原来的三针进行擦除********************/ UpdateData(true);temp1=seth=m_seth;setm=m_setm;sets=m_sets;if(seth>24||setm>60||sets>60){seth=setm=sets=0;MessageBox("时间格式不正确!");}else{MessageBox("时间设定成功!");}//seth%=12;sum=(seth%12)*3600+60*setm+sets;//temp1=seth=seth*5+setm/12;h=(seth%12)*5+setm/12;//m_y=h;//UpdateData(false);s=sets;m=setm;if(sss){Newpen.CreatePen(PS_SOLID,2,RGB(255,255,255));Oldpen=pDC->SelectObject(&Newpen);pDC->Ellipse(75,75,275,275);Newpen.DeleteObject();Newpen.DeleteObject();}/*flag_0=false,flag_1=false,flag_2=false,flag_3=false,flag_4=false,flag_5=false,flag_6=false ,flag_7=false,flag_8=false,flag_9=false,flag_10=false,flag_11=false,flag_12=false,flag_13=false,flag_14=false,flag_15=false,flag_16=fal se,flag_17=false,flag_18=false,flag_19=false,flag_20=false,flag_21=false,flag_22=false,flag_23=false;*/memset(flag,false,sizeof(flag));OnDraw();}。