在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获取系统当前时间
} SYSTEMTIME;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
原型:time_t GetTime( ) const;
(3)GetYear() 获取CTime对象代表的年。
原型:int GetYear( ) const;
以下(4)至(9)函数原型与GetYear()类似。
(4)GetMonth()获取CTime对象代表的月。
(5)GetDay() 获取CTime对象代表的日期。
MessageBox("今天是周日");
break;
case 2:
MessageBox("今天是周一");
break;
1.使用CTime类
CString str; //获取系统时间
CTime tm; tm=CTime::GetCurrentTime();
str=tm.Format("现在时间是%Y年%m月%d日 %X");
MessageBox(str,NULL,MB_OK);
例2:由年、月、日得到对应的周日。
CTime m_time(2001,2,5,12,0,0);
int weekday=m_time.GetDayOfWeek();
switch(weekday)
{
case 1:
//转化为CTime
CString strTime="2008-7-2 21:59:11";
MFC中的自动显示提示信息CToolTipCtrl类
MFC中的⾃动显⽰提⽰信息CToolTipCtrl类摘⾃⽹络:MFC 中 Tooltip 实现的⼏种⽅式⽅法⼀:利⽤CWnd本⾝⾃⾝⽀持的tooptip来实现,这种⽅法适⽤给控件增加tooltip,⾮常⽅便和简单⽅法如下:1、在窗⼝中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)SetTipText是个回调函数,名字叫什么⽆所谓,符合原型就⾏了,原型下⾯会说。
2、EnableToolTips(TRUE),使⽤这个⽅法调⽤这个函数是必不可少的.建议在CDialog::OnInitDialog调⽤。
3、在窗⼝中增加⼀个函数⽤于动态提供显⽰内容,其原型为 BOOL SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult),下⾯的代码可以根据传⼊的参数判定应该显⽰的内容。
BOOL CWndYour::SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult){TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;UINT nID = pTTTStruct->idFrom; //得到相应窗⼝ID,有可能是HWND//表明nID是否为HWNDif (pTTT->uFlags & TTF_IDISHWND){//从HWND得到ID值,当然你也可以通过HWND值来判断nID = ::GetDlgCtrlID((HWND)nID);if (NULL == nID)return FALSE;switch(nID){case(IDC_YOUR_CONTROL1)strcpy(pTTT->lpszText, your_string1);break;case(IDC_YOUR_CONTROL2)//设置相应的显⽰字串break;default:break;}return TRUE;}return FALSE;}4、很重要的⼀点,要显⽰的控件必须设置notify属性,否则收不到notify消息,⾃然也就显⽰不了tooltip。
CMFCRibbonStatusBar
在状态栏显示时间今天啥也没干,开会开了一天,回来就搞了一个小模块——在状态栏显示时间。
由于工程使用的是CMFCRibbonStatusBar,而网上没有找到这东西该怎么显示时间,索性自己折腾吧。
谢谢lymanghost提醒,我应该说一下这是个什么工程。
VS2010,建立一个基于多文档的MFC Application工程。
既然要显示时间,一个定时器是免不了了,在CMainFrame::OnCreate()函数中添加一个1.SetTimer(1, 1000, NULL);1表示的是EventID,可以设置多个Timer,传递不同的EventID便有不同的时间间隔。
1000表示的是1000ms,每隔1000ms执行一次定时器内的代码。
第三个参数是一个DWORD值,包含定时器标识,一般设为NULL即可。
CMFCRibbonStatusBar与基于对话框模式的CStatusBar有诸多不同之处。
CMFCRibbonStatusBar内的所有元素都是通过AddElement()方法添加进去的,也就是说,所有的添加、修改、删除都需要通过操作这些元素来实现。
我想在右下角显示时间,那么在CMainFrame::OnCreate()函数中,对右边的元素进行初始化如下:1.// 设置要显示的内容2.CString strTitlePane1;3.CString strTitlePane2 = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));4.bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);5.ASSERT(bNameValid);6.7.m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1,strTitlePane1, TRUE), strTitlePane1);8.m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, FALSE), strTitlePane2);在对CTime进行格式化的时候,"y"代表年份显示12年,"Y"代表年份显示2012年。
显示时间的代码
在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();。
VC++工具栏与状态栏
指针;dwStyle指定状态栏的风格,除了标准的 Windows风格外,还可以是CBRS_TOP(状态栏
既然我们已经取得应用程序的指针所以马上就能得到应用程序对象的公共数据成员mpmainwnd它是一个指向cwin应用程序的主窗口的指针利用这个指针我们又可使用该指针所指向的对象cwin对象的成员函数getdescendantwindow这个函数的作用是求得某个子窗口即状态栏这个窗口的指针
工具栏与状态栏
BOOL LoadToolBar(LPCTSTR lpszResourceName);
BOOL LoadToolBar(UINT nIDResource); 参数lpszResourceName指向被重载的工具栏 资源名字的指针,参数nIDResource为被重 载的工具栏资源的ID。
13
14
2 状态栏
lpIDArray所指向的数组元素的个数。该函数按照 数组lpIDArray中的对应元素的值设定标识符ID
19
的值,加载由每个ID所指定的字符串资源,并把字 符串设置为标识符的文字。如果该函数操作成功, 在返回一个非0值,否则返回0。 2、SetPaneInfo()函数
函数SetPaneInfo()用于设置给定索引值的指示器 ID、风格和宽度。它的原型为:
6
工具栏按钮可以以按钮、复选框或单选框的形 式出现和起作用,默认情况下以按钮形式出现。 若想让工具栏按钮以复选框形式出现时,应将风 格TBBS_ CHECKBOX赋给该CToolBar对象或在一个 ON_UNDATE_COMMAND_UI处理程序中使用某个 CCmdUI对象的SetCheck函数;如果按钮为单选框 形式,那么应在命令更新处理函数中调用 CCmdUI::SetRadio。
使qt的lalbl标签显示年月日时分的方法
使qt的lalbl标签显示年月日时分的方法如何使用Qt的QLabel标签显示年月日时分信息步骤1:创建Qt项目首先,我们需要创建一个Qt项目来实现在QLabel标签上显示年月日时分的功能。
在Qt Creator中,选择“New Project”,然后选择“Qt Widgets Application”,选择适当的项目名称和位置,点击“Next”完成项目的创建。
步骤2:设计用户界面在Qt Creator的项目文件中,打开ui文件(默认为mainwindow.ui)并设计用户界面。
将一个QLabel控件拖放到您希望显示时间的位置。
根据需要调整标签的大小和位置。
步骤3:获取当前日期和时间在mainwindow.cpp文件中添加以下头文件:cpp#include <QDateTime>在需要显示日期和时间的函数中(通常是构造函数或特定的槽函数),可以使用QDateTime类获取当前日期和时间。
您可以使用以下代码:cppQDateTime currentDateTime = QDateTime::currentDateTime(); QString currentDateTimeString =currentDateTime.toString("yyyy-MM-dd hh:mm");这将获取当前日期和时间,并将其设置为形如“年-月-日时:分”的字符串。
步骤4:将日期和时间显示在QLabel上在设计的用户界面中,我们已经创建了一个QLabel标签。
现在,我们需要在该标签上显示日期和时间。
您可以使用以下代码:cppui->label->setText(currentDateTimeString);其中,"label"是您在Qt Creator中为标签指定的对象名称。
这将在QLabel 标签上显示当前日期和时间。
步骤5:运行和测试完成上述步骤后,您可以构建并运行项目,以查看QLabel标签上是否正确显示日期和时间。
MFC 获取系统时间
获取系统时间
time_t t = time(NULL);//1970年1月1日0点到现在多少秒
char *ctime(const time_t *clock);//将秒数转化为字符串
//或
CTime::GetCurrentTime(),
GetSystemTime()
int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六
如果想计算两段时间的差值,可以使用CTimeSpan类,具体使用方法如下:
CTime t1( 1999, 3, 19, 22, 15, 0 );
CTime t = CTime::GetCurrentTime();
MFC 获取系统时间
GetCurrentTime
GetCurrБайду номын сангаасntTime函数可以用来获取系统时间,用于VC编程。
使用方法
在VC中,我们可以借助CTime时间类,获取系统当前日期,具体使用方法如下:
CTime t = CTime::GetCurrentTime(); //获取系统日期
CTimeSpan span=t-t1; //计算当前系统时间与时间t1的间隔
int iDay=span.GetDays(); //获取这段时间间隔共有多少天
int iHour=span.GetTotalHours(); //获取总共有多少小时
int iMin=span.GetTotalMinutes();//获取总共有多少分钟
int d=t.GetDay(); //获得几号
int y=t.GetYear(); //获取年份
int m=t.GetMonth(); //获取当前月份
MFC如何给工具条上的按钮添加提示功能
MFC如何给工具条上的按钮添加提示功能在MFC中,可以通过重载工具条按钮的OnUpdateCmdUI函数来添加按钮提示功能。
下面是一种实现方法:1.创建一个新的MFC应用程序,并在资源视图中添加一个工具条。
在工具条中添加需要添加提示功能的按钮。
2. 打开工具栏的相关代码文件。
通常是MainFrm.cpp文件。
3. 找到CToolBar类的相关函数,例如OnCreate、OnEraseBkgnd等函数。
4. 在OnCreate函数中,找到以下代码:```cpp//注释掉默认的按钮提示文本设置// m_wndToolBar.SetWindowText(...)```5. 在OnEraseBkgnd函数中,找到以下代码:```cpp//注释掉默认的按钮提示文本设置// CFrameWnd::OnEraseBkgnd(pDC);```6.在该文件的末尾,添加以下代码:```cppvoid CMainFrame::OnUpdateCmdUI(CCmdUI* pCmdUI)if (pCmdUI->m_nID >= ID_FILE_NEW && pCmdUI->m_nID <= ID_FILE_PRINT)//替换按钮提示文本CString strToolTip;switch (pCmdUI->m_nID)case ID_FILE_NEW:strToolTip = _T("New"); break;case ID_FILE_OPEN:strToolTip = _T("Open"); break;case ID_FILE_SAVE:strToolTip = _T("Save"); break;case ID_FILE_PRINT:strToolTip = _T("Print"); break;//添加其他按钮的提示文本}//设置按钮的提示文本pCmdUI->SetText(strToolTip);pCmdUI->m_pMenu->SetMenuItemText(pCmdUI->m_nIndex, strToolTip);pCmdUI->m_pOther->SetText(strToolTip);}else//将其他命令消息传给父类处理CFrameWnd::OnUpdateCmdUI(pCmdUI);}```7.重新编译并运行应用程序,鼠标放置在工具条按钮上,将会显示相应的提示文本。
MFC应用程序编写实例—完整版(原创)
MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。
程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。
windows实验报告
Windows实验报告(学校图标)姓名:****专业:***班级:****学号:****指导教师:****实验报告一、实验目的1、掌握菜单的实现机制和创建过程2、掌握普通下拉菜单和上下文菜单的创建3、掌握工具栏的创建和消息处理过程二、实验内容主要掌握菜单、工具栏的使用方法,内容包括菜单的创建和使用、工具栏的创建和使用。
1.利用书中第四章中举例来说明关于winds中窗口构建过程;2.利用VC6.0中的Win32 Application创建简单的MFC程序;3.根据书中的事例及指导来,利用VisualC++的应用程序向导(App Wizard)生成MFC代码,添加部分代码实现简单的文本显示;4.修改程序,实现一些小功能,并叙述功能的实现过程。
三、实验步骤:1、菜单的设计首先创建一个单文档应用程序menu,然后编辑由AppWizard自动生成的菜单资源,接下来的步骤如下○1、选择项目工作区的ResourceView标签,切换到资源试图,并进行相应的操作。
○2、对已生成菜单进行相应的编辑。
○3、在“帮助”菜单之前加入一个菜单选项。
双击空白框弹出属性对话框,并添加“消息”字样。
○4、按相应操作完成菜单资源的可视化设计。
○5、利用Class Wizard添加消息映射。
双击COMMAND,如图:单击OK,编辑成员函数OnWelcome如下:void CMainFrame::OnWelcome(){MessageBox("欢迎使用本系统!");}○6、建立并运行该程序,选择“消息”—“欢迎消息”菜单命令。
2、快捷方式○1、打开上一节建立的应用程序menu,将项目工作区切换到资源视图,展开Accelerator,双击ID_MAINFERAME,○2、双击快捷链表最下端的空白方框,在Key下拉框中填写“b”,在Modifiers 选项中选择Ctrl键,在Type选项组中选择VirtKey。
○3、为了使用户能够看到各菜单项所对应的快捷键,可以在文本后面加上说明。
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还提供了一些与系统时间相关的函数,比如获取当前系统时间、设置系统时间等,这些函数也可以帮助开发者进行时间的转换操作。
在使用这些时间转换函数时,开发者需要注意参数的传递和返回值的处理,以确保时间转换操作的准确性和可靠性。
mfc的showwindow参数
MFC(Microsoft Foundation Classes)是一个用于创建基于Microsoft Windows的应用程序的类库。
在MFC中,`ShowWindow()`函数是一个非常重要的函数,用于控制窗口的显示状态。
`ShowWindow()`函数的参数是一个整数,用于指定窗口的显示状态。
该参数可以是以下几个值之一:
* `SW_HIDE`:隐藏窗口。
* `SW_NORMAL`:以普通大小显示窗口。
* `SW_MAXIMIZE`:最大化窗口,使其占据整个屏幕。
* `SW_MINIMIZE`:最小化窗口,将其缩小为任务栏上的图标。
* `SW_RESTORE`:恢复窗口,用于从最大化或最小化状态还原窗口到其原始大小和位置。
此外,还可以使用一些其他参数来控制窗口的显示方式,例如是否激活窗口、是否更新窗口等。
这些参数可以通过使用位运算符组合使用,例如`SW_SHOW | SW_ACTIVATE`将显示窗口并激活它。
需要注意的是,`ShowWindow()`函数必须在窗口创建之后调用才有效。
在MFC中,通常在`OnCreate()`函数中调用
`ShowWindow()`来显示窗口。
MFC中添加状态栏_显示时间
MFC中添加状态栏1.首先在string table 里添加两个字串,ID分别为IDS_INDICATOR_MESSAGE and IDS_INDI2.在你的 dlg.h 类里面加个 CStatusBar m_bar;3.在dlg.cpp 开头加上static UINT indicators[] ={IDS_INDICATOR_MESSAGE,IDS_INDICATOR_TIME};4.OnInitDialog 里面加上m_bar.Create(this); //We create the status barm_bar.SetIndicators(indicators,2); //Set the number of panesCRect rect;GetClientRect(&rect);//Size the two panesm_bar.SetPaneInfo(0,IDS_INDICATOR_MESSAGE,SBPS_NORMAL,rect.Width()-100);m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH ,0);//This is where we actually draw it on the screenRepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_TIME);5.时间显示OnInitDialog 里面加 SetTimer(1,1000,NULL);为你的dlg类添加WM_TIMER的响应函数,在其中添加代码:CTime t1;t1=CTime::GetCurrentTime();m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));CDialog::OnTimer(nIDEvent);这样添加的程序刚开始运行时在时间一栏中显示的是初始设置的字符,为了使程序在刚开始运m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH ,0);后添加如下代码:CTime t1;t1=CTime::GetCurrentTime();m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));这样在程序刚启动时就会显示系统时间,然后实时更新。
第六章 工具栏
Company Logo
添加新的工具栏
在本节内容中,首先介绍有关工具栏创建和控制 (包括风格控制和信息控制等等)的 CToolBar 类的主要成员函数,然后使用向导创建一个单文 档文件( SDI 应用程序 MyTimer , 并可通过工具 栏按钮控制是否显示时间。
Company Logo
创建 ReBar
ReBar 是用来放置其他控件的容器。可以通过向 ReBar 中加入其他工具栏,使得窗口中所有工具栏排列整齐,否 则在程序运行后每个工具栏各显示在不同行中,主窗口显 得零乱。 按照下面这些步骤把 ReBar 支持添加到任何 MFC 应 用程序中: 在 MainFrm . h 中,把 CReBar 类型的一个变量添加到受 保护的变量列表中,这部分代码还包含用于工具栏 m_WndToolBar 和状态栏m_WndStatusBar 的变量。 在 CMainFrame : : oncreate ( )中,创建和初始化工具栏 后,必须把 ReBar 附加到它的父窗口。这可以通过调用 CReBar : : Create ( )并传入指向父窗口的指针来实现: m_wndReBar . Create(this ) ;
Company Logo
在MFC中,工具栏CToolBar的基类是 CControlBar,称为控件栏类.它又是Cwnd 类派 生的,这种继承关系有一些非常有用的含义。例 如,因为所有的控件都是由 CWnd 派生的,所以 它们被连接到一个 Windows API 窗口上,结果所 有的 CWnd 性能,如创建、移动、显示和隐藏窗 口,在使用控件栏时都是可用的。 工具栏是可停靠的。哪些边可接受停靠工具栏, 则由框架窗口来决定。 作为一种选择,工具栏还可以离开框架窗口的 边缘,放进一个自由浮动的面板中。 工具栏类 CToolBar 还支持“工具提示” ( ToolTips),
MFC中状态栏CStatusBar的使用
MFC中状态栏CStatusBar的使用标签:状态栏 MFCMFC界面中经常需要显示状态信息,如版本、版权,时间等,这就需要用到状态栏,在这里简单演示一下状态栏的使用操作1、首先定义状态栏中显示的信息,方法:在资源视图中的String Table中双击,然后在String Table中点击新行,添加ID,值和标题,标题里的内容即对应将要在状态栏中显示的内容(值是按顺序的)2、在Dlg.h文件中定义状态栏类CStatusBar m_Statusbar; //状态栏类3、在Dlg.c文件中的OnInitDialog()函数中添加状态栏初始化操作m_Statusbar.Create(this); //创造状态栏m_Statusbar.SetIndicators(indicators,3); //设置状态栏项目栏数CRect rect;GetClientRect(&rect); //Size the two panes//伸缩窗格以填满空间,第一栏显示IDS_STRING_MESSAGE内容,即“状态栏” ,0表示默认长度m_Statusbar.SetPaneInfo(0,IDS_STRING_MESSAGE,SBPS_STR ETCH,0);//窗格突出显示,第二栏长度为320单位,显示IDS_STRING_VERSION字符串m_Statusbar.SetPaneInfo(1,IDS_STRING_VERSION,SBPS_POP OUT,320);m_Statusbar.SetPaneInfo(2,IDS_STRING_TIME,SBPS_POPOUT ,120); //第三栏长度120单位RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CO NTROLBAR_LAST, IDS_STRING_TIME);//指定状态栏在显示窗口位置SetTimer(2,1000,NULL); //一个1秒触发一次的定时器。
MFC各种控件属性介绍
MFC各种控件属性介绍VC++6.0控件工具箱:2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon)3 静态文本(Static Text):用来在指定的位置显示特定的字符串,一般用来标识附近另一个控件的内容。
显示在静态文本控件中的字符串一般不再改变,但是在需要的时候,也可以通过调用相应的函数来进行设置。
MFC提供了CStatic类支持静态控件。
4 编辑框(Edit Box):用来接收用户输入的字符串。
通过选择编辑框的选项,编辑框可以接收字符串、数字、密码等;编辑框还可以设置成接收多行字符串的模式;可以自动进行大小写转换。
编辑框可能向其父窗口发送多种控件通知,如果用户需要,可以对这些控件通知进行处理。
MFC提供了CEdit类支持编辑框控件。
5 组成框(Group Box):用来包围具有逻辑关系的一组控件,在这些控件的周围加上边界和标题。
需注意的是,组成框仅仅是在视觉效果上对控件进行“成组”,真正的“成组”工作还需要另外一些工作。
6 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。
按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。
在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“Default”选项。
如果在对话框活动的时候按下了Enter键,则等同于单击了默认按钮。
MFC提供了CButton类支持按钮控件。
7 复选框(Check Box):用来显示某种可能的选择,该项选择是独立的,用户可以选中或取消该选项。
在选项被选中的时候核选标记出现,选项被取消时核选标记消失。
MFC中由CButton类对核选框进行支持,用户可以通过SetCheck()函数和GetCheck()函数设置或获取核选框当前的状态。
8 单选按钮(Radio Button):用来选择某种可能的选择,与核选框不同,该选项不是独立的。
MFC 提供了两个 日期 和 时间 类CTime和CTimeSpan
time_t mktime(struct tm * timeptr);
其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,
下面的例子可以计算出1997年7月1日是星期几:
#include "time.h"
二、总结
首先看几个函数的原型的声明(在time.h中):
clock_t clock( void ) clock_t是用来保存时间的数据类型,是long型
double difftime(time_t time1, time_t time0);取时间间隔的函数
time_t time(time_t * timer);日历时间函数
中,这样的程序虽然可以编译通过,但运行时会异常终止。
5.还知道了一个system()函数,是执行DOS命令的,system("某DOS命令");头文件是stdlib.h?windows.h
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
int tm_min; /*分-取值区间为[0,59] */
int tm_hour; /*时-取值区间为[0,23] */
int tm_mday; /*一个月中的日期-取值区间为[1,31] */
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显示时分秒
1>在Resource标签String Table中添加New String,在此定义为ID_INDICATOR_CLOCK,将其Caption设为00: 00: 00(注意此处00与:之间不能有其他字符或符号).
注意,本步操作时有两种方式:
一种建立新的String Table,并添加String;另一种则在原有String Table
中添加。
当用后一种方式操作时,若完成后,时钟栏并不显示时间,则需要将此New String在String Table中对应的V alue值加1(可在resource.h中修改)。
2>在MainFrm.cpp中的indicators声明出添加ID_INDICA TOR_CLOCK,代码如下: …
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_CLOCK, //这里排列影响显示顺序,s所要添加的String的ID
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
…
这一步中ID_INDICA TOR_CLOCK的插入位置将影响时间窗格在状态栏中的显示位置。
3>安装定时器:在MainFrm.cpp中OnCreate函数处添加代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
SetTimer(1,1000,NULL);//安装定时器,并将其时间间隔设为1000毫秒
return 0;
}
4)编写时间处理函数:利用ClassWizard为CMainFrame类加入WM_TIMER的
消息处理函数OnTimer,并添加代码如下:
void CMainFrame::OnTimer(UINT nIDEvent)
{
CTime time;
time=CTime::GetCurrentTime();//得到当前时间
CString s=time.Format("%H:%M:%S");//转换时间格式
m_wndStatusBar.SetPaneText(m_mandToIndex(ID_INDICA TOR _CLOCK),s); //显示时钟
CFrameWnd::OnTimer(nIDEvent);}
5)销毁定时器:利用ClassWizard为CMainFrame类加入WM_CLOSE的消息处理函数OnClose,并添加代码如下:
void CMainFrame::OnClose()
{
KillTimer(1);//销毁定时器
CFrameWnd::OnClose();
}
最后,编译运行。
可以通过调用CStatusBar的成员函数SetPaneStyle,SetPaneInfo来设置你的时钟栏的显示方式。
例如:在MainFrm .cpp中OnCreate函数处添加如下代码,即可将你的时钟栏pop out:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{…
m_wndStatusBar.SetPaneInfo(m_mandToIndex(ID_INDICATOR_ CLOCK),ID_INDICA TOR_CLOCK,SBPS_POPOUT,50);
return 0;
}
效果图:
显示年月日时分秒
1>同上面的1,不过记得caption设置为0000- 00- 00 00: 00: 00
2>同上面的2
3>同上面的3
4>将CString s=time.Format("%H:%M:%S");改为CString s = time.Format("%Y-%m-%d %H:%M:%S")
其他一致相同,编译运行即可
效果图:
年月日与时分秒分开显示
1>基本同上1添加两个CString一个ID_INDICATOR_CLOCK,caption为0000- 00- 00,另一个ID_INDICA TOR_YYYY,caption为00: 00: 00
2>在MainFrm.cpp中的indicators声明出添加ID_INDICA TOR_CLOCK和ID_INDICATOR_YYYY
3>同上面的3
4>CString s = time.Format("%Y-%m-%d ");
CString date = time.Format("%H:%M:%S");
m_wndStatusBar.SetPaneText(m_mandToIndex(ID_INDICA T OR_CLOCK),s);
m_wndStatusBar.SetPaneText(m_mandToIndex(ID_INDICA T OR_YYYY),date);
效果图:。