VC++课程设计实验报告.doc

上传人:仙人指路1688 文档编号:2385742 上传时间:2023-02-17 格式:DOC 页数:25 大小:64.50KB
返回 下载 相关 举报
VC++课程设计实验报告.doc_第1页
第1页 / 共25页
VC++课程设计实验报告.doc_第2页
第2页 / 共25页
VC++课程设计实验报告.doc_第3页
第3页 / 共25页
VC++课程设计实验报告.doc_第4页
第4页 / 共25页
VC++课程设计实验报告.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《VC++课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《VC++课程设计实验报告.doc(25页珍藏版)》请在三一办公上搜索。

1、 VC+程序设计课程设计报告 时钟 时钟 1.摘要:利用MFC设计制作一个能联网调时时钟,当按下F1键时,能打开或关闭帮助,单击左键是,能拖动窗口,双击左键时,能联网校时,滚动中轴时,能调整时间,单击右键,能随机变换背景颜色。2.关键词:MFC;Clock;C+ 3.前言:1.我们学习MFC,除了可以掌握一种Windows应用程序设计的基本方法之外,还可以使他们进一步全面、深刻地理解向对象程序设计的思想。而且MFC所蕴含的程序设计思想、代码实现技巧、则是其他开发工具所不能及的。2.我们通过制作这个时钟,可以加深对MFC的设计思想的理解。也可以加强对C+的思想的理解。4.正文:4.1:窗口的创建

2、于注册class CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationpr

3、otected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MS

4、G_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CAlarmClockDlg dialogCAlarmClockDlg:CAlarmClockDlg(CWnd* pParent /*=NULL*/): CDialog(CAlarmClockDlg:IDD, pParent)/AFX_DATA_INIT(CAlarmClockDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that Load

5、Icon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);m_hThread = NULL;m_bkColor = RGB(110, 200, 255);m_bHelp = TRUE;void CAlarmClockDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAlarmClockDlg)/ NOTE: the ClassWizard w

6、ill add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAlarmClockDlg, CDialog)/AFX_MSG_MAP(CAlarmClockDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_LBUTTONDOWN()ON_WM_TIMER()ON_WM_ERASEBKGND()ON_WM_LBUTTONDBLCLK()ON_WM_RBUTTONDOWN()ON_WM_MOUSEWHEEL()/AFX_MSG_MAPEND_MESSAGE_MAP

7、()/ CAlarmClockDlg message handlersvoid CAlarmClockDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.

8、HCURSOR CAlarmClockDlg:OnQueryDragIcon()return (HCURSOR)m_hIcon;BOOL CAlarmClockDlg: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 AppendMenu(MF_SEPARATOR)

9、;pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization here/1. 将窗

10、口改成正方形CRect rc;this-GetWindowRect(&rc);int iNewWH = min(rc.Width(), rc.Height();this-MoveWindow(rc.left, rc.top, iNewWH, iNewWH);/2. 设置绘图区域this-GetWindowRect(&rc);HRGN hRgn = :CreateEllipticRgn(rc.left, rc.top, rc.right, rc.bottom);this-SetWindowRgn(hRgn, TRUE);/3. 设置定时器this-SetTimer(110, 7000, NULL

11、);/110 = Helpthis-SetTimer(2359, 1000, NULL);/23:59 = move time/4. 主动触发鼠标双击消息this-PostMessage(WM_LBUTTONDBLCLK);/5. 设置窗口标题this-SetWindowText(Internet时钟);return TRUE; / return TRUE unless you set the focus to a controlvoid CAlarmClockDlg:OnTimer(UINT nIDEvent) if (nIDEvent = 2359)this-Invalidate();el

12、se if (nIDEvent = 110)m_bHelp = FALSE;this-KillTimer(110);CDialog:OnTimer(nIDEvent);/ 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 CAlarmClock

13、Dlg:OnPaint() CPaintDC dc(this); / device context for paintingif (IsIconic()SendMessage(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.Widt

14、h() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseOnDraw(&dc);/CDialog:OnPaint();BOOL CAlarmClockDlg:OnEraseBkgnd(CDC* pDC) / TODO: Add your message handler code here and/or call defaultreturn TRUE;/return CDialog:OnEraseBkgnd(pDC);void CAla

15、rmClockDlg:OnDraw(CDC *pDC)/ TODO: add draw code for native data here/如下的做法能避免绘图闪烁, 强烈推荐使用. KouConghua./主要思想是将以前直接画在pDC上的图,改画到一个内存DC(如dcMem)中去,/然后使用BitBlt函数,将dcMem这个内存中的图复制到当前屏幕即pDC中去./具体步骤如下, 其中a 和b 选择一步即可, 不可二者都做: /a. 直接在OnDraw()中增加如下语句, 以改变窗口背景为透明色:/ :SetClassLong(this-m_hWnd, GCL_HBRBACKGROUND,/

16、(LONG)(HBRUSH):GetStockObject(NULL_BRUSH);/b. 在CxxxView类中增加OnEraseBkgnd()消息响应函数, / 将其中的代码改为: return TRUE;/ 直接返回TRUE表示告诉系统绘图时不再绘制背景,相当于设置窗口背景为NULL刷子./c. 为CxxxView类增加一个成员函数void OnDrawMem(CDC &dcMem),/ 并将你以前写在OnDraw()中的代码,移到OnDrawMem()中去即可./1. 改变当前View窗口的背景为空刷子/:SetClassLong(this-m_hWnd, GCL_HBRBACKGRO

17、UND, (LONG)(HBRUSH):GetStockObject(NULL_BRUSH);/2. 获取当前绘图区的宽度和高度CRect rcClient;this-GetClientRect(&rcClient);int nWidth = rcClient.Width();int nHeight= rcClient.Height();/3. 创建一个和pDC兼容的内存DC: dcMemCDC dcMem;dcMem.CreateCompatibleDC(pDC);/pDC换成NULL也可以,指定为显示器/创建一个位图对象, 其宽度和高度就用当前绘图区的nWidth 和nHeightCBit

18、map bmp;bmp.CreateCompatibleBitmap(pDC, nWidth, nHeight);/将bmp选入到dcMem中, 只有选入了位图的dcMem才有地方绘图,画到指定的bmp位图上CBitmap * pOldBit = dcMem.SelectObject(&bmp);/4. 先用背景色将位图清除干净,这里我用的是m_bkColor作为背景dcMem.FillSolidRect(0, 0, nWidth, nHeight, m_bkColor);/5. 执行真正的绘图代码, 如dcMem.MoveTo(); dcMem.LineTo(); 等等OnDrawMem(&

19、dcMem);/6. 将dcMem中的图拷贝到pDC上进行显示. 关键点.pDC-BitBlt(0, 0, nWidth, nHeight, &dcMem, 0, 0, SRCCOPY);/7. 绘图完成后的清理bmp.DeleteObject();dcMem.DeleteDC();4.2:中心时间显示void CAlarmClockDlg:OnDrawMem(CDC *pDC)CRect rc;this-GetClientRect(&rc);/获取客户区矩形/1. 获取设备资源CPen *pOldPen = pDC-GetCurrentPen();CPen pen(PS_SOLID, 1,

20、RGB(0,0,0);pDC-SelectObject(&pen);CBrush *pOldBrush = pDC-GetCurrentBrush();CBrush brush;/使圆背景透明,不至于遮挡住圆心处显示的时间文本brush.CreateStockObject(NULL_BRUSH);pDC-SelectObject(&brush);pDC-SetBkMode(TRANSPARENT);/设置文本背景为透明pDC-SetTextColor(RGB(128, 0, 128);/设置文本颜色/2. 获取圆心和半径POINT ptO;/圆心int iR = min(rc.right -

21、rc.left, rc.bottom-rc.top) / 2;iR = iR - 10;/半径ptO.x = (rc.right + rc.left) / 2;ptO.y = (rc.bottom + rc.top) / 2;/3. 取得时, 分, 秒CString sTime;SYSTEMTIME tm;:GetLocalTime(&tm);/取得本地时间float fSecond = tm.wSecond;float fMinute = tm.wMinute + fSecond / 60.0f;float fHour = tm.wHour % 12 + fMinute / 60.0f;/在

22、圆心附近显示时间/CRect rtO(ptO.x - 40, ptO.y + 2, ptO.x + 40, ptO.y + 22);CRect rtO(ptO.x - iR, ptO.y + 2, ptO.x + iR, ptO.y + iR);sTime.Format(%.2d:%.2d:%.2d, tm.wHour, tm.wMinute, tm.wSecond);pDC-DrawText(sTime, &rtO, DT_CENTER); 4.3:画时钟算法:时钟的秒刻度分为60个刻度,每个刻度是6四个象限的刻度尺的算法如下:/第一象限for(int i=0;i16;i+)POINT pt

23、0; pt0.x = ptOrigin.x + iR * sin( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y - iR * cos( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);/第四象限for(i=1;i16;i+)POINT pt0;pt0.x = ptOrigin.x + iR * cos( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y + iR * sin( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.

24、x,pt0.y,RGB(255,0,0);/第三象限for(i=1;i16;i+)POINT pt0;pt0.x = ptOrigin.x - iR * sin( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y + iR * cos( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);/第二象限for(i=1;i15;i+)POINT pt0;pt0.x = ptOrigin.x - iR * cos( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y - i

25、R * sin( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);根据:sin(PI/2)coscos(/2)sin第四象限可以写成for(int i=16;i32;i+)POINT pt0;pt0.x = ptOrigin.x + iR * sin( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y - iR * cos( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);根据:sin()sincos()cos第三象限可

26、以写成:for(int i=32;i48;i+)POINT pt0;pt0.x = ptOrigin.x + iR * sin( PI/180 * 6*i) * 0.95f;pt0.y = ptOrigin.y - iR * cos( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);根据:sin(3/2)coscos(3/2)sin第二象限可以写成for(int i=48;i60;i+)POINT pt0;pt0.x = ptOrigin.x + iR * sin( PI/180 * 6*i) * 0.95f;pt0.y

27、= ptOrigin.y - iR * cos( PI/180 * 6*i) * 0.95f;SetPixel(hdc,pt0.x,pt0.y,RGB(255,0,0);最后统一成:for(int i=0;iEllipse(ptO.x - iR, ptO.y - iR, ptO.x + iR, ptO.y + iR);/4.1 画秒刻度pen.DeleteObject();pen.CreatePen(PS_SOLID, 1, RGB(0,0,0);pDC-SelectObject(&pen);for (int i = 0; i MoveTo(ptA.x, ptA.y);pDC-LineTo(p

28、tB.x, ptB.y);/4.2 画小时刻度pen.DeleteObject();pen.CreatePen(PS_SOLID, 2, RGB(0,0,0);pDC-SelectObject(&pen);for (i = 0; i MoveTo(ptA.x, ptA.y);pDC-LineTo(ptB.x, ptB.y);/写出小时数字int j = i/5;if (j = 0) j = 12;CString sTime;sTime.Format(%d, j);POINT ptN;ptN.x = ptO.x + iR * sin( PI/30 * i) * 0.87f;ptN.y = ptO

29、.y - iR * cos( PI/30 * i) * 0.87f;CRect rtN(ptN.x - 10, ptN.y - 10, ptN.x + 10, ptN.y + 10);pDC-DrawText(sTime, &rtN, DT_CENTER | DT_VCENTER);/5. 画秒针 60s = 2*PI, 1s = PI / 30pen.DeleteObject();pen.CreatePen(PS_SOLID, 1, RGB(0,0,255);pDC-SelectObject(&pen);POINT ptSecond;ptSecond.x = ptO.x + iR * sin

30、( PI/30 * fSecond) * 0.94f;ptSecond.y = ptO.y - iR * cos( PI/30 * fSecond) * 0.94f;pDC-MoveTo(ptO.x, ptO.y);pDC-LineTo(ptSecond.x, ptSecond.y);/6. 画分针 60m = 2*PI, 1m = PI / 30pen.DeleteObject();pen.CreatePen(PS_SOLID, 2, RGB(255,0,0);pDC-SelectObject(&pen);POINT ptMinute;ptMinute.x = ptO.x +iR * sin

31、( PI/30 * fMinute) * 0.84f;ptMinute.y = ptO.y - iR * cos( PI/30 * fMinute) * 0.84f;pDC-MoveTo(ptO.x, ptO.y);pDC-LineTo(ptMinute.x, ptMinute.y);/7. 画时针 12h = 2*PI, 1h = PI / 6pen.DeleteObject();pen.CreatePen(PS_SOLID, 3, RGB(255,0,255);pDC-SelectObject(&pen);POINT ptHour;ptHour.x = ptO.x + iR * sin(

32、PI/6 * fHour) * 0.71f;ptHour.y = ptO.y - iR * cos( PI/6 * fHour) * 0.71f;pDC-MoveTo(ptO.x, ptO.y);pDC-LineTo(ptHour.x, ptHour.y);4.4:显示帮助信息及其相关操作/帮助信息, 显示7s后关闭if (m_bHelp)CString sHelp;sHelp += 按下F1键: 帮助开关rn;sHelp += 单击左键: 拖动窗口rn;sHelp += 双击左键: 联网校时rn;sHelp += 滚动中轴: 调整时间rn;sHelp += 单击右键: 随机背景rn;sHel

33、p += 按Esc 键: 退出程序rn;if (int(fHour) % 12 = 3 & (int)fHour % 12 DrawText(sHelp, &rtHelp, DT_CENTER | DT_VCENTER);elseCRect rtHelp(ptO.x - iR, ptO.y + iR / 5, ptO.x + iR, ptO.y + iR * 4 / 5);pDC-DrawText(sHelp, &rtHelp, DT_CENTER | DT_VCENTER);/8. 恢复现场, 释放资源pDC-SelectObject(pOldPen);pDC-SelectObject(pO

34、ldBrush);pen.DeleteObject();brush.DeleteObject();/移动无标题窗口void CAlarmClockDlg:OnLButtonDown(UINT nFlags, CPoint point) this-SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);CDialog:OnLButtonDown(nFlags, point);/Internet校时void CAlarmClockDlg:OnLButtonDblClk(UINT nFlags, CPoint point) if (m_hThread) :Termin

35、ateThread(m_hThread, -1);m_hThread = :CreateThread(NULL, 0, SetInternetTimeProc, this, 0, NULL);CDialog:OnLButtonDblClk(nFlags, point);/随机背景void CAlarmClockDlg:OnRButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default:srand(:GetTickCount();m_bkColor = RGB

36、(rand() * 100 % 255, rand() * 100 % 255, rand() * 100 % 255);this-Invalidate();CDialog:OnRButtonDown(nFlags, point);/调整时间BOOL CAlarmClockDlg:OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) / TODO: Add your message handler code here and/or call defaultSYSTEMTIME tm;:GetLocalTime(&tm);COleDateTime

37、now = COleDateTime:GetCurrentTime();now += COleDateTimeSpan(0, 0, zDelta 0 ? -1 : 1, 0); / 1 Minute exactlytm.wHour = now.GetHour();tm.wMinute = now.GetMinute();tm.wSecond = 0;/now.GetSecond();:SetLocalTime(&tm);this-Invalidate();return CDialog:OnMouseWheel(nFlags, zDelta, pt);/键盘控制void CAlarmClockD

38、lg:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)/ TODO: Add your message handler code here and/or call defaultswitch (nChar)case VK_ESCAPE:CDialog:OnOK();break;case VK_HOME:this-SendMessage(WM_LBUTTONDBLCLK);break;case VK_END:SYSTEMTIME tm;:GetLocalTime(&tm);tm.wHour = 0;tm.wMinute = 0;tm.wSecond = 0;:SetLocalTime(&tm);this-Invalidate();break;case VK_DOWN:case VK_RIGHT:case VK_NEXT:OnMouseWheel(0, -1, 0);break;case VK_UP:case VK_LEFT:case VK_PRIOR:OnMouseWheel(0, 1, 0);break;/CDialog:OnKeyDown(nChar, nRepCnt, nFlags);/帮助信

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号