第一篇:孫鑫---VC教學(xué)視頻筆記(全)
第一課
基礎(chǔ)
1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函數(shù)的聲明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等許多類及其方法的聲明。2.Project->Setting->Debug可以加入命令行參數(shù)。
3.在SDK中要加入“windows.h”和stdio.h。因?yàn)長(zhǎng)oadCursor,MessageBox等函數(shù)的聲明在這個(gè)文件中。
4.創(chuàng)建一個(gè)完整的窗口的四個(gè)步驟SDK,1設(shè)計(jì)窗口類,2注冊(cè)窗口類,3創(chuàng)建窗口,4顯示窗口
5.函數(shù)名可以代表函數(shù)代碼的首地址,即可作為函數(shù)指針。
6.要查看VC數(shù)據(jù)類型,可以在MSDN中輸入“BOOL”然后選擇“DATA TYPE”。7.atof將字符串轉(zhuǎn)化為float,atoi將字符串轉(zhuǎn)化為int型。8.所有從CWnd類派生的類都有m_hWnd句柄。
9.變量的生命周期:可以認(rèn)為出了包含它的大括號(hào),這個(gè)變量的生命周期結(jié)束。所以全局變量的聲明位于所有大括號(hào)之外。但是用new聲明的變量和用static聲明的變量除外。10.SDK示范程序,見(jiàn)下面。
11.sprintf格式化字符,其頭文件為stdio.h,在MFC中格式化字符用CString.Format 12.GetDC()與ReleaseDC()要成對(duì)使用,否則會(huì)內(nèi)存泄漏。同樣,BeginPaint()與EndPaint()。
13.GetStockObject()得到畫筆、畫刷、字體、調(diào)色板的句柄,使用時(shí)必須用類型轉(zhuǎn)換。
14.什么時(shí)候用NULL,什么時(shí)候用0.答,對(duì)指針賦值時(shí)用NULL,對(duì)變量賦值時(shí)用0.15.什么是野指針?答:將指針指向的變量的內(nèi)存釋放后,此指針即變成野指針!
第二篇:孫鑫視頻的詳細(xì)目錄
孫鑫VC++6.0視頻教程的詳細(xì)目錄
CD1:Windows程序運(yùn)行原理及程序編寫流程,窗口產(chǎn)生過(guò)程,句柄原理,消息隊(duì)列,回調(diào)函數(shù),窗口關(guān)閉與應(yīng)用程序退出的工作關(guān)系,使用VC++的若干小技巧,stdcall與cdecl調(diào)用規(guī)范的比較,初學(xué)者常犯錯(cuò)誤及注意事項(xiàng)。
CD2:C++經(jīng)典語(yǔ)法與應(yīng)用,類的編寫與應(yīng)用,構(gòu)造與析構(gòu)函數(shù),函數(shù)的重載,類的繼承,函數(shù)覆蓋,基類與派生類的構(gòu)造函數(shù)、析構(gòu)函數(shù)先后調(diào)用順序,如何在派生類構(gòu)造函數(shù)中向基類的構(gòu)造函數(shù)傳遞參數(shù),this成員變量,類型轉(zhuǎn)換的內(nèi)幕,虛擬函數(shù)與多態(tài)性,引用和指針的變量的區(qū)別與共同處。VC工程的編譯原理與過(guò)程,將工程中不同的類拆分到不同的原文件中,每一個(gè)類由一個(gè).h和.cpp文件共同完成,頭文件重復(fù)定義問(wèn)題的解決,培養(yǎng)了學(xué)員良好的編程習(xí)慣,也為以后分析MFC Appwizard生成的工程奠定了良好基礎(chǔ)。
CD3:講述MFC AppWizard的原理與MFC程序框架的剖析。AppWizard是一個(gè) 源代碼生成工具,是計(jì)算機(jī)輔助程序設(shè)計(jì)工具,WinMain在MFC程序中是如何從源程序中被隱藏的,theApp全局變量是如何被分配的,MFC框架中的幾個(gè)類的作用與相互關(guān)系,MFC框架窗口是如何產(chǎn)生和銷毀的,對(duì)窗口類的PreCreateWidow和OnCreate兩個(gè)函數(shù)的著重分析,Windows窗口與C++中的CWnd類的關(guān)系。
CD4:MFC消息映射機(jī)制的剖析,講述如何運(yùn)用ClassWizard,理解發(fā)送給窗口的消息是如何被MFC框架通過(guò)窗口句柄映射表和消息映射表來(lái)用窗口類的函數(shù)進(jìn)行響應(yīng)的。掌握設(shè)備描述表及其封裝類CDC的使用,CDC是如何與具體的設(shè)備發(fā)生關(guān)聯(lián)的,融合具體的畫圖程序進(jìn)行分析。如何設(shè)置封閉圖形的填充刷子(位圖畫刷與透明畫刷的使用)。
CD5:掌握CDC的文字處理程序的編寫,如何產(chǎn)生自定義字體和自定義插入符,熟悉對(duì)CString類的使用。通過(guò)對(duì)卡拉OK程序的編寫,講解定時(shí)器的使用和DrawText函數(shù)的巧妙運(yùn)用。講解如何使用CDC的裁減功能。
CD6:菜單的工作原理及編寫應(yīng)用,菜單命令消息在MFC框架程序的幾個(gè)類中的傳遞順序和處理過(guò)程。標(biāo)記菜單、缺省菜單的實(shí)現(xiàn)原理、圖形菜單的實(shí)現(xiàn)及常犯錯(cuò)誤的分析,GetSystemMetrics的應(yīng)用,快捷彈出菜單的實(shí)現(xiàn)方式及其命令響應(yīng)函數(shù)有效范圍(與彈出菜單時(shí)所指定的父窗口有密切的關(guān)系,最底層的子窗口具有最優(yōu)先的處理機(jī)會(huì))。動(dòng)態(tài)菜單的編寫,如何讓程序在運(yùn)行時(shí)產(chǎn)生新的菜單項(xiàng)及如何手工為這些新產(chǎn)生的菜單命令安排處理函數(shù),如何在頂層窗口中截獲對(duì)菜單命令的處理,更進(jìn)一步掌握CString類的應(yīng)用。
CD7:對(duì)話框用戶界面程序的編寫,如何向?qū)υ捒蚩丶?lián)接數(shù)據(jù)成員及其實(shí)現(xiàn)機(jī)理,如何向?qū)υ捒蚩仃P(guān)聯(lián)控件類,如何利用對(duì)話框類的成員函數(shù)向控發(fā)送消息和獲取對(duì)話框控件的類指針,如何直接利用對(duì)話框控件類操縱對(duì)話框控件(發(fā)送消息和直接調(diào)用成員函數(shù))。如何在程序運(yùn)行時(shí)產(chǎn)生和銷毀控件。對(duì)話框控件的幾種操作方式的優(yōu)劣比較分析。如何實(shí)現(xiàn)對(duì)話框的部分收縮和展開。如何讓對(duì)話框
上的文本框在程序啟動(dòng)后立即獲得焦點(diǎn),如何利用SetWindowLong改變窗口的回調(diào)函數(shù),通過(guò)改變文本框的默認(rèn)回車處理方式進(jìn)行演示。實(shí)現(xiàn)多個(gè)輸入文本框間通過(guò)回車逐一向下傳遞焦點(diǎn)的另一種巧妙方法(用缺省按鈕來(lái)處理)。
CD8:逃跑按鈕的巧妙實(shí)現(xiàn)。如何制作屬性頁(yè)對(duì)話框和向?qū)?duì)話框,融合講解組合框(如何調(diào)整組合框的大小)、列表框、單選按鈕、復(fù)選按鈕等常用對(duì)話框控件的多種使用方法。如何限制用戶在不滿足設(shè)定的條件時(shí)切換到其他屬性頁(yè)和向?qū)ы?yè)。
CD9:如何修改MFC AppWizard向?qū)傻目蚣艹绦虻耐庥^和大小,修改圖標(biāo)、光標(biāo)、背景的三種方法。如何增加和刪除工具欄按鈕,如何給應(yīng)用程序增加工具欄,如何顯示和隱藏工具欄。定制狀態(tài)欄,在狀態(tài)欄中添加時(shí)鐘顯示,CTime類及其用法。在狀態(tài)欄中添加進(jìn)度條(主窗口產(chǎn)生后立即產(chǎn)生進(jìn)度條的巧妙思想,不能在OnCreate函數(shù)中直接處理,要用到自定義消息的方法)。鼠標(biāo)坐標(biāo)顯示,在CView中獲取狀態(tài)欄對(duì)象的幾種方式。如何為應(yīng)用程序添加啟動(dòng)畫面。
CD10:圖形的繪制,如何使用自定義畫筆(顏色,線寬,線形)。如何為程序中添加選項(xiàng)菜單和選項(xiàng)設(shè)置對(duì)話框,如何使用標(biāo)準(zhǔn)顏色對(duì)話框,如何使用字體對(duì)話框,在選項(xiàng)對(duì)話框中實(shí)現(xiàn)預(yù)覽功能。實(shí)現(xiàn)選項(xiàng)對(duì)話框和窗口類中的數(shù)據(jù)交換。如何改變對(duì)話框和控件的背景色,如何改變控件的文本顏色,對(duì)按鈕控件的特殊處理。如何在窗口中顯示一幅位圖。
CD11:如何讓CDC上輸出的文字、圖形具有保持功能,集合類CPtrArray的使用,CPaintDC與CClientDC的區(qū)別與應(yīng)用,OnPaint與OnDraw在CView中的關(guān)系及實(shí)現(xiàn)內(nèi)幕,滾動(dòng)窗口的實(shí)現(xiàn),坐標(biāo)空間,映射方式,設(shè)備坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換。元文件設(shè)備描述表的使用,如何利用兼容DC實(shí)現(xiàn)圖形的保存和再現(xiàn)。
CD12:const char *與char * const的區(qū)別。C語(yǔ)言對(duì)文件讀寫的支持,F(xiàn)ILE指針;文本文件和二進(jìn)制文件的區(qū)別。用文本方式讀寫文件和以二進(jìn)制方式讀寫文件的注意事項(xiàng)。C++對(duì)文件讀寫的支持,ofstream和ifstream的用法。Win32 SDK對(duì)文件讀寫的支持,CreateFile函數(shù)、WriteFile函數(shù)、ReadFile函數(shù)的使用;MFC對(duì)文件讀寫的支持,CFile類和CFileDialog的使用,文件過(guò)濾器的設(shè)置。win.ini文件和注冊(cè)表的讀寫方式及相關(guān)知識(shí)點(diǎn)。
CD13:使用CArchive類對(duì)文件進(jìn)行操作。MFC框架程序提供的文件新建與打開功能內(nèi)部的實(shí)現(xiàn)機(jī)制。如何利用CDocument類的串行化存儲(chǔ)功能保存與加載數(shù)據(jù)。如何實(shí)現(xiàn)類對(duì)串行化的支持,CObArray的串行化實(shí)現(xiàn)內(nèi)幕。刪出文檔數(shù)據(jù)時(shí)常犯的錯(cuò)誤。MFC框架程序的文檔類和視類的關(guān)系,以及如何獲得相互的指針引用。
CD14:網(wǎng)絡(luò)的相關(guān)知識(shí),網(wǎng)絡(luò)程序的編寫,Socket是連接應(yīng)用程序與網(wǎng)絡(luò)驅(qū)動(dòng)程序的橋梁,Socket在應(yīng)用程序中創(chuàng)建,通過(guò)bind與驅(qū)動(dòng)程序建立關(guān)系。此后,應(yīng)用程序送給Socket的數(shù)據(jù),由Socket交給驅(qū)動(dòng)程序向網(wǎng)絡(luò)上發(fā)送出去。計(jì)算機(jī)從網(wǎng)絡(luò)上收到與該Socket綁定的IP+Port相關(guān)的數(shù)據(jù)后,由驅(qū)動(dòng)程序交給
Socket,應(yīng)用程序便可從該Socket中提取接收到的數(shù)據(jù)。網(wǎng)絡(luò)應(yīng)用程序就是這樣通過(guò)socket進(jìn)行數(shù)據(jù)的發(fā)送與接收的。TCP與UDP的工作原理與編寫過(guò)程,如何在程序中鏈接庫(kù)文件。一個(gè)字符界面的聊天程序。
CD15:多線程程序的編寫,多線程應(yīng)用中容易出現(xiàn)的問(wèn)題?;コ鈱?duì)象的講解,如何采用互斥對(duì)象來(lái)實(shí)現(xiàn)多線程的同步。如何利用命名互斥對(duì)象保證應(yīng)用程序只有一個(gè)實(shí)例運(yùn)行。應(yīng)用多線程編寫網(wǎng)絡(luò)聊天室程序。
CD16:事件內(nèi)核對(duì)象、關(guān)鍵代碼段(臨界區(qū))的講解,以及在多線程同步中的應(yīng)用。在Windows下編寫基于消息的網(wǎng)絡(luò)應(yīng)用程序,掌握阻塞與非阻塞網(wǎng)絡(luò)程序的編寫,理解在Windows平臺(tái)下,采用異步選擇機(jī)制可以提高網(wǎng)絡(luò)應(yīng)用程序的性能。
CD17:詳細(xì)講解進(jìn)程間通訊的四種方式:剪貼板、匿名管道、命名管道和郵槽。并比較分析這幾種進(jìn)程間通信的優(yōu)點(diǎn)和缺點(diǎn)。
CD18:ActiveX控件的應(yīng)用與工作原理。ActiveX控件的編寫,如何為控件安排屬性,方法,事件,屬性頁(yè),持久性存儲(chǔ),控件如何通知容器自身屬性的改變。如何注冊(cè)控件與取消控件注冊(cè)。在VB和VC中訪問(wèn)ActiveX控件。
CD19:動(dòng)態(tài)鏈接庫(kù)程序的編寫。靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別,以及調(diào)用程序在鏈接靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)時(shí)的區(qū)別。如何利用工具查看動(dòng)態(tài)鏈接庫(kù)輸出的函數(shù),Depends工具的使用,C++編譯器名字改編技術(shù)對(duì)動(dòng)態(tài)鏈接庫(kù)輸出函數(shù)的影響,extern “C”的用法,利用模塊定義文件來(lái)解決C++名字改編的問(wèn)題。用typedef定義指向函數(shù)的指針類型,如何獲得動(dòng)態(tài)連接庫(kù)里的函數(shù)的指針。
CD20:Hook編程。如何安裝鉤子過(guò)程,如何編寫全局鉤子,動(dòng)態(tài)連接庫(kù)里的全局變量數(shù)據(jù)共享問(wèn)題分析。ADO數(shù)據(jù)庫(kù)編程。在VB中利用ADO控件和ADO對(duì)象訪問(wèn)數(shù)據(jù)庫(kù),在VC中利用ADO技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)。
第三篇:班組管理心得體會(huì)-孫鑫
班組管理心得體會(huì)
近期,我參加了分廠組織的班組管理培訓(xùn)班學(xué)習(xí),聆聽了劉春福老師的授課。通過(guò)簡(jiǎn)潔、明了的講解,形象、生動(dòng)的實(shí)例,受到了一次愉快而深刻的思想、管理知識(shí)教育,進(jìn)一步啟迪了思維,開拓了視野,細(xì)細(xì)品味感受很多。以下是我個(gè)人學(xué)習(xí)以后的一些心得體會(huì)。
首先,我深刻認(rèn)識(shí)到班組管理是一種意識(shí),一種觀念,是一種認(rèn)真的態(tài)度,更是一種精益求精的文化。老子云:“天下難事,必做于易;天下大事,必做于細(xì)”。要想成就一番事業(yè),必須從簡(jiǎn)單做起,從細(xì)微處入手,多角度考慮習(xí)以為常的事。對(duì)于班組管理是一樣的道理,在現(xiàn)實(shí)的工作中,需要做大事的機(jī)會(huì)非常少,多數(shù)人,多數(shù)情況下只能做一些瑣碎、單調(diào)的事情,或平淡,或雞毛蒜皮。但這就是工作,這就是生活,就是每一個(gè)個(gè)體成功不可缺少的基礎(chǔ)。工作中往往因一件小事而導(dǎo)致全盤否定,就會(huì)出現(xiàn)100-1=0的現(xiàn)象。因此,在班組管理中細(xì)節(jié)決定我們發(fā)展的成敗。
其次,從自身而言,通過(guò)學(xué)習(xí)意識(shí)到,在工作中要擺正自己的位置,合理定位,做好自己的事情。如果把班組比作“人”一樣的系統(tǒng),把班長(zhǎng)比作“頭”,組長(zhǎng)就是“身體”,而基層人員就是“肢體”,如果一個(gè)班組里每一個(gè)人都能合理“定位”,能認(rèn)識(shí)自己所處的地位,干好自己應(yīng)干好的工作,發(fā)揮好自己的“專長(zhǎng)”,就能在工作中游刃有余,左右逢源,不然很可能就是寸步難行。
再次,就班組而言,應(yīng)該加強(qiáng)班組的文化建設(shè),完善自身的管理機(jī)制。隨著分廠、班組的日趨完善,崗位分工越來(lái)越細(xì),專業(yè)化標(biāo)準(zhǔn)越來(lái)越高,班組管理的重要性日見(jiàn)明顯。綜上所述,班組管理是種意識(shí)、觀念,是種態(tài)度與文化。因此,實(shí)施班組管理,就是對(duì)工作過(guò)程中的每一個(gè)細(xì)節(jié)都要精益求精,做每一件事哪怕是小事,都要持高度負(fù)責(zé)的態(tài)度,做到事無(wú)巨細(xì),不斷培養(yǎng)個(gè)人扎實(shí)、嚴(yán)謹(jǐn)?shù)墓ぷ黠L(fēng)格,做到事事有人管,時(shí)時(shí)有人查,時(shí)時(shí)有計(jì)劃,事事有總結(jié),杜絕管理上的漏洞,消除管理上的盲點(diǎn),班組在競(jìng)爭(zhēng)中才能步步為贏!
總之,通過(guò)這次培訓(xùn)班學(xué)習(xí),使我系統(tǒng)、全面地了解了班組管理的深邃,洞悉了班組管理在現(xiàn)實(shí)工作、生活中對(duì)于個(gè)人,班組乃至整個(gè)公司的深遠(yuǎn)意義。為此,我將立足本職工作,放眼未來(lái),與同事們一起,發(fā)揮每一個(gè)人的作用,為班組的發(fā)展打下良好的基礎(chǔ)!
第四篇:讀博士期間自己總結(jié)的VC筆記
第一課
1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函數(shù)的聲明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等許多類及其方法的聲明。2.Project->Setting->Debug可以加入命令行參數(shù)。
3.在SDK中要加入“windows.h”和stdio.h。因?yàn)長(zhǎng)oadCursor,MessageBox等函數(shù)的聲明在這個(gè)文件中。
4.創(chuàng)建一個(gè)完整的窗口的四個(gè)步驟SDK,1設(shè)計(jì)窗口類,2注冊(cè)窗口類,3創(chuàng)建窗口,4顯示窗口
5.函數(shù)名可以代表函數(shù)代碼的首地址,即可作為函數(shù)指針。
6.要查看VC數(shù)據(jù)類型,可以在MSDN中輸入“BOOL”然后選擇“DATA TYPE”。7.atof將字符串轉(zhuǎn)化為float,atoi將字符串轉(zhuǎn)化為int型。8.所有從CWnd類派生的類都有m_hWnd句柄。
9.變量的生命周期:可以認(rèn)為出了包含它的大括號(hào),這個(gè)變量的生命周期結(jié)束。所以全局變量的聲明位于所有大括號(hào)之外。但是用new聲明的變量和用static聲明的變量除外。
10.SDK示范程序,見(jiàn)下面。
11.sprintf格式化字符,其頭文件為stdio.h,在MFC中格式化字符用CString.Format 12.GetDC()與ReleaseDC()要成對(duì)使用,否則會(huì)內(nèi)存泄漏。同樣,BeginPaint()與EndPaint()。
13.GetStockObject()得到畫筆、畫刷、字體、調(diào)色板的句柄,使用時(shí)必須用類型轉(zhuǎn)換。
14.什么時(shí)候用NULL,什么時(shí)候用0.答,對(duì)指針賦值時(shí)用NULL,對(duì)變量賦值時(shí)用0.15.什么是野指針?答:將指針指向的變量的內(nèi)存釋放后,此指針即變成野指針!如何避免野指針?答:將此指針指向NULL即可。p=NULL;16.SDK代碼流程:
#include “windows.h”//包含頭文件LoadCursor,TextOut等函數(shù) #include “stdio.h”//包含sprintf,printf等函數(shù) LRESULT CALLBACK MyProc(...);//聲明回調(diào)函數(shù) int WINAPI WinMain(){ WNDCLASS wndcls;//設(shè)計(jì)窗口類
wndcls.hcursor=LoadCursor();//初始化....RegisterClass(&wndcls);//注冊(cè)窗口類 hwnd=CreateWindow(...);//創(chuàng)建窗口 ShowWindow(..);//顯示窗口 UpdateWindow(..);MSG msg;//定義消息結(jié)構(gòu)體
while(GetMessage(...))//消息循環(huán) {...} return 0;}
LRESULT CALLBACK MyProc(...)//實(shí)現(xiàn)回調(diào)函數(shù) { switch(uMsg){ case WM_CHAR: break;...} }
第2課
1.定義結(jié)構(gòu)體和類時(shí)別忘記在最后加入“;”號(hào)!例如Class Point{int x;int y;};2.#include
3.類的定義中,如果未指明成員類型,則缺省為private.而結(jié)構(gòu)體中則缺省為public.4.引用:引用經(jīng)常用在函數(shù)的傳參上。另外數(shù)值交換函數(shù)也經(jīng)常用引用。例 change(int &x,int &y){int temp;temp=x;x=y;y=x}調(diào)用時(shí)即可以用 int a=3;int b=4;change(a,b);一般不用指針來(lái)作為參數(shù)進(jìn)行數(shù)值交換。因?yàn)闀?huì)引起歧義。
5.通常將類的定義放.h文件,而將其實(shí)現(xiàn)放在cpp文件中,別忘記了在cpp文件中#include ”xxx.h“ 6.如何防止類的重復(fù)定義? 用#inndef Point_H_H #define Point_H_H class Point{};#endif來(lái)防止
7.源文件cpp文件單獨(dú)編譯成obj文件。最后由鏈接器將與將要使用到的C++標(biāo)準(zhǔn)庫(kù)類鏈接成exe文件,頭文件不參加編譯。所以在cpp文件中別忘記了加入#include ”xxx.h“ 8.函數(shù)的覆蓋,在子類中重寫父類的函數(shù),此時(shí)采用早期綁定的方法。如果加入了virtual,則將采用遲綁定的技術(shù),在運(yùn)行時(shí)根據(jù)對(duì)象的類型確定調(diào)用哪一個(gè)函數(shù)。此遲綁定技術(shù)是MFC的類的繼承的精髓。
9.強(qiáng)制類型轉(zhuǎn)換。如果CFish從CAnimal派生而來(lái)。則可以將魚的對(duì)象轉(zhuǎn)換為CAnimal的對(duì)象,而反之則不行。從現(xiàn)實(shí)中理解也是正常的,魚可以是動(dòng)物,而動(dòng)物卻不是魚。再如int可以強(qiáng)制轉(zhuǎn)換成char型。而反之則出錯(cuò)。
第3課
1.在main或WinMain之前,全局變量已經(jīng)被分配內(nèi)存并初始化了。2.在MFC中在WinMain之前有個(gè)theApp全局變量先被構(gòu)造并被初始化,而由于子類構(gòu)造函數(shù)執(zhí)行前,其父類的構(gòu)造函數(shù)先被執(zhí)行,所以CTestApp的父類CWinAPP的構(gòu)造函數(shù)先執(zhí)行。產(chǎn)生了theApp對(duì)象后,在WinMain()中的指針*pThread和*pApp就有了內(nèi)容。3.MFC大致流程:
CTestApp theApp;//構(gòu)造全局對(duì)象 WinMain(){ AfxWinMain();//調(diào)用下面的函數(shù) } AfxWinMain(){ pThread->Initinstance();//初始化工作和注冊(cè)窗口類,窗口顯示和更新 pThread->Run();//消息循環(huán) } 而在BOOL CTestApp::InitInstance()中的代碼 CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);完成了將這三個(gè)類關(guān)聯(lián)起來(lái)的工作。
4.如何在單文檔文件中顯示一個(gè)CButton的對(duì)象?
在CMainFrame::OnCreate()中定義一個(gè)CButton的對(duì)象btn;然后調(diào)用btn.Create(”維新“,WS_DISABLED |WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, CRect(0,0,300,100),/*GetParent(),*/this,123);注意點(diǎn):
(1).此處btn不能是局部變量,否則它的生命周期太短,將不能顯示。(2).在create函數(shù)的第二個(gè)參數(shù)中加入WS_VISIBLE 參數(shù)才行。否則必須調(diào)用ShowWindow 也可以在view的OnCreate消息響應(yīng)函數(shù)中加入(3).CButton類的定義頭文件在afxwin.h中,而stdafx.h包含了afxwin.h,所以可以直接使用。因?yàn)镸FC中的每一個(gè)類中都有#include ”stdafx.h“的聲明。
第4課
1.在單文檔中view擋在MainFrame的前面。此時(shí)如果編寫針對(duì)MainFrame的mouseClick事件,將不會(huì)有反應(yīng)。
2.消息響應(yīng)會(huì)在3處修改代碼,1處是在頭文件中,//{{AFX_MSG(CDrawView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);//}}AFX_MSG DECLARE_MESSAGE_MAP()另一處是cpp文件的begin MessageMap和End MessageMap之間,BEGIN_MESSAGE_MAP(CDrawView, CView)//{{AFX_MSG_MAP(CDrawView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()//}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()最后是要有函數(shù)實(shí)現(xiàn)的代碼。
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){ // TOD Add your message handler code here and/or call default m_ptOrigin=m_ptOld=point;m_bDraw=TRUE;CView::OnLButtonDown(nFlags, point);} 3.畫線:定義一個(gè)成員變量保存mouseDown的點(diǎn)m_Point 1)API函數(shù)方法畫線用HDC 2)用CDC類成員函數(shù)畫線。此時(shí)別忘記ReleaseDC 3)用CClientDC 4)用CWindowDC,用它甚至可以整個(gè)屏幕區(qū)域畫線。下面是上面4種方法的代碼 /*HDC hdc;hdc=::GetDC(m_hWnd);MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);LineTo(hdc,point.x,point.y);::ReleaseDC(m_hWnd,hdc);必須成對(duì)使用。*/ /*CDC *pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);必須成對(duì)使用。*/
//CClientDC dc(this);/*CClientDC dc(GetParent());dc.MoveTo(m_ptOrigin);dc.LineTo(point);此處不需要ReleaseDC,因?yàn)镃ClientDC會(huì)自動(dòng)釋放DC*/
//CWindowDC dc(this);//CWindowDC dc(GetParent());/*CWindowDC dc(GetDesktopWindow());//此時(shí)可以在整個(gè)屏幕上畫線。dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/ /*CPen pen(PS_DOT,1,RGB(0,255,0));CClientDC dc(this);CPen *pOldPen=dc.SelectObject(&pen);dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);*/ 5)用Bitmap填充所畫的矩形。CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);//CBRUSH::FromHandle是靜態(tài)成員函數(shù),所以可以用下面的方法調(diào)用。CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point));dc.SelectObject(pOldBrush);m_bDraw=FALSE;6)用其它顏色畫線 CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,0,0));CPen *pOldPen=dc.SelectObject(&pen);//選中紅色畫筆 if(m_bDraw==TRUE){ dc.SetROP2(R2_BLACK);//設(shè)置繪畫模式 dc.MoveTo(m_ptOrigin);//dc.LineTo(point);dc.LineTo(m_ptOld);//dc.MoveTo(m_ptOrigin);dc.MoveTo(m_ptOld);dc.LineTo(point);//m_ptOrigin=point;m_ptOld=point;} dc.SelectObject(pOldPen);4.MFC中隱式的包含了windows.h。為什么? 因?yàn)樵贏FXV_W32.h文件中:
// This is a part of the Microsoft Foundation Classes C++ library.// Copyright(C)1992-1998 Microsoft Corporation // All rights reserved.在AFXWIN.h中
// Note: WINDOWS.H already included from AFXV_W32.H 5.如何從句柄獲得對(duì)象的指針? 答FromHandle 6.類的靜態(tài)成員函數(shù)可以由類名直接調(diào)用,也可以由對(duì)象調(diào)用??梢哉J(rèn)為靜態(tài)成員函數(shù)并不屬于某個(gè)對(duì)象,它屬于類本身。程序運(yùn)行伊始,即使沒(méi)有實(shí)例化類的對(duì)象,靜態(tài)成員函數(shù)和靜態(tài)成員變量已然有其內(nèi)存空間。靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)成員變量!靜態(tài)成員變量必須在類的外部初始化。當(dāng)然如果并不打算用到靜態(tài)成員變量,此時(shí)你可以不初始它。7.理解代碼區(qū),數(shù)據(jù)區(qū),堆,棧!請(qǐng)見(jiàn)下面的簡(jiǎn)介:
http://004km.cnamedPipeSrvView::OnPipeCreate(){ // TOD Add your command handler code here hPipe=CreateNamedPipe(”.pipeMyPipe“, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0,1,1024,1024,0,NULL);if(INVALID_HANDLE_VALUE==hPipe){ MessageBox(”創(chuàng)建命名管道失??!“);hPipe=NULL;return;} HANDLE hEvent;hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(!hEvent){ MessageBox(”創(chuàng)建事件對(duì)象失?。 ?;CloseHandle(hPipe);hPipe=NULL;return;} OVERLAPPED ovlap;ZeroMemory(&ovlap,sizeof(OVERLAPPED));ovlap.hEvent=hEvent;if(!ConnectNamedPipe(hPipe,&ovlap)){ if(ERROR_IO_PENDING!=GetLastError()){ MessageBox(”等待客戶端連接失?。 ?;CloseHandle(hPipe);CloseHandle(hEvent);hPipe=NULL;return;} } if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE)){ MessageBox(”等待對(duì)象失??!“);CloseHandle(hPipe);CloseHandle(hEvent);hPipe=NULL;return;} CloseHandle(hEvent);} void CNamedPipeSrvView::OnPipeRead(){ // TOD Add your command handler code here char buf[100];DWORD dwRead;if(!ReadFile(hPipe,buf,100,&dwRead,NULL)){ MessageBox(”讀取數(shù)據(jù)失?。 ?;return;} MessageBox(buf);} void CNamedPipeSrvView::OnPipeWrite(){ // TOD Add your command handler code here char buf[]=”http://004km.cnamedPipeCltView::OnPipeConnect()連接管道 { // TOD Add your command handler code here if(!WaitNamedPipe(“.pipeMyPipe”,NMPWAIT_WAIT_FOREVER)){ MessageBox(“當(dāng)前沒(méi)有可利用的命名管道實(shí)例!”);return;} hPipe=CreateFile(“.pipeMyPipe”,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE==hPipe){ MessageBox(“打開命名管道失敗!”);hPipe=NULL;return;} } void CNamedPipeCltView::OnPipeRead()讀取數(shù)據(jù) { // TOD Add your command handler code here char buf[100];DWORD dwRead;if(!ReadFile(hPipe,buf,100,&dwRead,NULL)){ MessageBox(“讀取數(shù)據(jù)失??!”);return;} MessageBox(buf);} void CNamedPipeCltView::OnPipeWrite()寫入數(shù)據(jù) { // TOD Add your command handler code here char buf[]=“命名管道測(cè)試程序”;DWORD dwWrite;if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL)){ MessageBox(“寫入數(shù)據(jù)失??!”);return;} } 4.郵槽,使用時(shí)應(yīng)將消息長(zhǎng)度限制在424字節(jié)以下,關(guān)鍵函數(shù)CreateMailSlot()a.先建一個(gè)MailSlotSRV工程,加菜單“接收數(shù)據(jù)” b.消息響應(yīng)代碼:
void CMailslotSrvView::OnMailslotRecv()菜單“接收數(shù)據(jù)”的代碼 { // TOD Add your command handler code here HANDLE hMailslot;hMailslot=CreateMailslot(“.mailslotMyMailslot”,0, MAILSLOT_WAIT_FOREVER,NULL);if(INVALID_HANDLE_VALUE==hMailslot){ MessageBox(“創(chuàng)建油槽失??!”);return;} char buf[100];DWORD dwRead;if(!ReadFile(hMailslot,buf,100,&dwRead,NULL)){ MessageBox(“讀取數(shù)據(jù)失?。 ?;CloseHandle(hMailslot);return;} MessageBox(buf);CloseHandle(hMailslot);} c.加工程MailSlotCLT,加菜單“發(fā)送數(shù)據(jù)” d.加消息響應(yīng),添加代碼,客戶端也比較簡(jiǎn)單。
void CMailslotCltView::OnMailslotSend()菜單“發(fā)送數(shù)據(jù)”的代碼 { // TOD Add your command handler code here HANDLE hMailslot;hMailslot=CreateFile(“.mailslotMyMailslot”,GENERIC_WRITE, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE==hMailslot){ MessageBox(“打開油槽失??!”);return;} char buf[]=“http://004km.cn”;DWORD dwWrite;if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL)){ MessageBox(“寫入數(shù)據(jù)失??!”);CloseHandle(hMailslot);return;} CloseHandle(hMailslot);} 5.以上4種方法各有優(yōu)缺點(diǎn):剪貼板比較簡(jiǎn)單。郵槽是基于廣播的,可以一對(duì)多發(fā)送。但只能一個(gè)發(fā)送,一個(gè)接收,要想同時(shí)發(fā)送接收,須寫兩次代碼。命名管道和郵槽可以進(jìn)行網(wǎng)絡(luò)通信。
第18課 ActiveX編程(下面X均為ActiveX簡(jiǎn)稱)1.在VB中調(diào)用X控件,添加方法 project->Add components。另外可以用Object Browser來(lái)查看控件 2.在VC中創(chuàng)建X控件
1.新建一個(gè)X工程名為Clock,注意一個(gè)文件中可以包含多個(gè)控件。2.保持缺省設(shè)置,完成。注意它生成的三個(gè)類,以及相關(guān)的接口。3.運(yùn)行它。選擇TSTCON32.exe作為容器。
4.選擇Insert Control,此時(shí)我們可以看到,它畫了一個(gè)橢圓。也可以在VB中測(cè)試。
5.刪除注冊(cè)信息。用regsvr32 /u +文件名。也可以在菜單選擇反注冊(cè)命令。6.重寫代碼。在CClockCtrl::OnDraw()中畫了一個(gè)橢圓,此時(shí)我們?cè)谄渲械玫较到y(tǒng)時(shí)間,并顯示它。為此我們?cè)贠nCreate()設(shè)置了一個(gè)定時(shí)器,每隔一定時(shí)間發(fā)出一個(gè)Invalidate()消息,使窗口重繪。
7.如何改變控件的背景色和前景色?ClassWizard->AutoMation->Add Property->BackColor,還需要在OnDraw()中加上相應(yīng)的代碼 CBrush brush(TranslateColor(GetBackColor()));pdc->FillRect(rcBounds, &brush);pdc->SetBkMode(TRANSPARENT);pdc->SetTextColor(TranslateColor(GetForeColor()));8.增加屬性頁(yè)。在
BEGIN_PROPPAGEIDS(CClockCtrl, 2)此時(shí)數(shù)目也得改成相應(yīng)的數(shù)目 PROPPAGEID(CClockPropPage::guid)PROPPAGEID(CLSID_CColorPropPage)END_PROPPAGEIDS(CClockCtrl)OK~ 9.增加自定義屬性:ClassWizard->AutoMation->Add Property加上一個(gè)變量m_interval,類型為short,對(duì)應(yīng)外部變量為Interval。在CClockCtrl中增加OnIntervalChanged方法。添加如下代碼: if(m_interval<0 || m_interval>6000){ m_interval=1000;} else { m_interval=m_interval/1000*1000;KillTimer(1);SetTimer(1,m_interval,NULL);BoundPropertyChanged(0x1);} 10.測(cè)試:Control->Invoke Methods 11.將時(shí)間間隔加到屬性頁(yè)中,在資源視圖中加入一文本框和編輯框。為EditBox關(guān)聯(lián)成員變量,加入屬性interval。12.增加方法:ClassWizard->AutoMation->Add Method->Hello加入代碼 OK!在VB中可以調(diào)用此方法!
void CClockCtrl::Hello(){ // TOD Add your dispatch handler code here MessageBox(“Hello world!”);} 13.增加事件:ClassWizard->AutoMation->Add Events->Click 14.增加自定義事件:ClassWizard->AutoMation->Add Events->NewMinute 在新的一分鐘到達(dá)時(shí)發(fā)出這個(gè)通知,在OnDraw()中寫代碼: CTime time=CTime::GetCurrentTime();if(0==time.GetSecond()){ FireNewMinute();} 15.讓Interval屬性具有持久性。在CClockCtrl::DoPropExchange()中調(diào)用PX_short()方法,OK!
PX_Short(pPX,“Interval”,m_interval,1000);16.讓Property Page和Property屬性中的interval保持一致的方法:在OnIntervalChanged()中調(diào)用BoundPropertyChanged(0x1);17.希望控件在設(shè)計(jì)時(shí)間內(nèi)不走動(dòng)的方法:在OnTimer()中,if(AmbientUserMode())InvalidateControl();巧妙!3.在VC中調(diào)用X控件
1.新建ClockTest對(duì)話框應(yīng)用程序 2.點(diǎn)擊右鍵->插入X控件->時(shí)鐘控件
3.Project->Add Component會(huì)生成CClock類。
4.在CCLockTestDlg中增加CClock類的成員變量m_clock,然后可以動(dòng)態(tài)創(chuàng)建一個(gè)這樣的東東!
5.試驗(yàn)Click(),NewMinute(),SetBkColor(),SetForeColor()方法和屬性 6.如何為動(dòng)態(tài)創(chuàng)建的控件做事件響應(yīng)呢?首先你得知道它的ID號(hào),然后參考非動(dòng)態(tài)的控件事件代碼,呵。第19課 DLL編程
1.DLL簡(jiǎn)介,動(dòng)態(tài)庫(kù),靜態(tài)庫(kù)。動(dòng)態(tài)庫(kù)節(jié)約磁盤空間,靜態(tài)庫(kù)體積大??梢杂枚喾N語(yǔ)言編寫DLL文件。動(dòng)態(tài)庫(kù)有兩種加載方式:隱式調(diào)用和動(dòng)態(tài)加裁!2.新建一個(gè)DLL1的dll工程,加入一源文件名為dll1.cpp,加入add和subtract兩個(gè)函數(shù),注意此時(shí)須在函數(shù)名前加_declspec(dllexport),并且編譯。用dumpbi-exports dll1.dll查看其導(dǎo)出的函數(shù),發(fā)現(xiàn)函數(shù)名字已經(jīng)被改成了 ?add@@YAHHH@Z,這種現(xiàn)象叫做名字粉碎,是為了支持函數(shù)重載而做的。
3.編寫一個(gè)程序測(cè)試DLL,工程名為DllTest,基于對(duì)話框的,放置兩個(gè)按紐add和subtract,響應(yīng)按紐消息,調(diào)用這個(gè)Dll的add和subtract函數(shù)。使用這兩個(gè)函數(shù)前要先聲明函數(shù),//extern int add(int a,int b);//extern int subtract(int a,int b);還需要將Dll1.lib和Dll1.dll拷貝到當(dāng)前目錄下!另外還需要在Project->Setting->Link->Object/Library中加入Dll1.lib,此種方式為隱式調(diào)用!OK!用Dumpbin-imports DllTest.exe查看它的輸入信息,可以看到它加載了dll1.dll。同時(shí)也可以用depends程序查看程序需要哪些dll文件!除了用extern外,還可以用//_declspec(dllimport)int add(int a,int b);//_declspec(dllimport)int subtract(int a,int b);告訴編譯器,此函數(shù)是動(dòng)態(tài)鏈接庫(kù)中的函數(shù),這樣可以提高效率。
4.通常寫Dll時(shí)在dll1.h中聲明函數(shù),然后在DllTest.h中包含這個(gè)頭文件,另外會(huì)用一組宏來(lái)取代_declspec(dllimport)Dll1.h #ifdef DLL1_API #else #define DLL1_API extern “C” _declspec(dllimport)#endif DLL1_API int _stdcall add(int a,int b);DLL1_API int _stdcall subtract(int a,int b);Dll1.cpp的代碼:
#define DLL1_API extern “C” _declspec(dllexport)#include “Dll1.h” #include
6.我們希望導(dǎo)出的函數(shù)名不被改變,加extern “C”大寫的C!即可,#define DLL1_API extern “C” _declspec(dllexport),但它只能導(dǎo)出全局函數(shù),不能導(dǎo)出類的成員函數(shù),并且如果調(diào)用約定被改成了別的方式,此時(shí)函數(shù)名也被改變。所以這種方式不太好。
7.解決之道是用模塊定義文件。1.新建dll2.dll工程;
2.加dll2.cpp中寫兩個(gè)函數(shù)add和subtract 3.在目錄中新建dll2.def文件,增加到工程。4.在dll2.def中加入如下代碼: LIBRARY Dll2 EXPORTS add subtract 5.編譯后用dumpbin查看函數(shù)名是否被改變?
6.測(cè)試,我們這次用動(dòng)態(tài)加載的方法來(lái)調(diào)用dll文件。以前是用隱式鏈接的方法,嘿嘿。動(dòng)態(tài)加載的好處是需要時(shí)再加載,可以提高執(zhí)行的效率。代碼如下: HINSTANCE hInst;hInst=LoadLibrary(“Dll3.dll”);typedef int(/*_stdcall*/ *ADDPROC)(int a,int b);//ADDPROC Add=(ADDPROC)GetProcAddress(hInst,“?add@@YAHHH@Z”);ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));if(!Add){ MessageBox(“獲取函數(shù)地址失?。 ?;return;} CString str;str.Format(“5+3=%d”,Add(5,3));MessageBox(str);FreeLibrary(hInst);7.此時(shí)你改變調(diào)用約定,函數(shù)名不會(huì)被改變,但如果你加上_stdcall定義函數(shù),調(diào)用時(shí)也需要加入_stdcall,否則會(huì)出錯(cuò)!
8.DllMain()是Dll的入口點(diǎn),不過(guò)不是必須的。但在DllMain中不要做復(fù)雜的調(diào)用。為什么?因?yàn)镈llMain加載時(shí),某些核心Dll文件不一定已經(jīng)被加載。9.創(chuàng)建一個(gè)基于MFC的DLL工程,簡(jiǎn)介。
10.當(dāng)不使用DLL時(shí),調(diào)用FreeLibrary減少DLL的使用計(jì)數(shù),釋放DLL資源,減少系統(tǒng)負(fù)擔(dān)。明白?
11.上面總結(jié):1.*.def使函數(shù)名不改變;
2.定義時(shí)為_stdcall,調(diào)用時(shí)也必須用_stdcall.第20課 鉤子與數(shù)據(jù)庫(kù)編程
1.Hook簡(jiǎn)介:作用是攔截某些消息,關(guān)鍵函數(shù)是SetWindowsHookEX()2.示例程序:
1.新建一基于對(duì)話框工程,InnerHook,此過(guò)程的鉤子是只攔截本進(jìn)程的。2.在OnInitDialog()中添加代碼: g_hWnd=m_hWnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());設(shè)置了鼠標(biāo)鉤子
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());設(shè)置了鍵盤鉤子 3.完成鉤子函數(shù)的編寫: HHOOK g_hKeyboard=NULL;HHOOK g_hMouse;HWND g_hWnd=NULL;
LRESULT CALLBACK MouseProc(int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates){ return 1;}
LRESULT CALLBACK KeyboardProc(int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information){ //if(VK_SPACE==wParam || VK_RETURN==wParam)如果是空格鍵 /*if(VK_F4==wParam &&(1==(lParam>>29 & 1)))攔截ALT+F4按鍵!return 1;else return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/ if(VK_F2==wParam)按F2時(shí)程序可以退出,這是留的后門。否則程序無(wú)法關(guān)閉,只能用任務(wù)管理器來(lái)關(guān)閉它了。{ ::SendMessage(g_hWnd,WM_CLOSE,0,0);UnhookWindowsHookEx(g_hKeyboard);當(dāng)程序退出時(shí)最好將鉤子移除。UnhookWindowsHookEx(g_hMouse);} return 1;} 3.編寫一個(gè)屏屏蔽所有進(jìn)程和所有線程的鉤子程序。此時(shí)這個(gè)鉤子必須安裝在DLL中,然后被某個(gè)程序調(diào)用才行。1.新建一個(gè)DLL工程名為Hook 2.增加Hook.cpp 3.代碼如下:
#include
HHOOK g_hMouse=NULL;HHOOK g_hKeyboard=NULL;
#pragma data_seg(“MySec”)新建了一個(gè)節(jié),用于將下 面的這個(gè)變量設(shè)為全局共享。
HWND g_hWnd=NULL;這個(gè)變量是全局共享的。#pragma data_seg()
//#pragma comment(linker,“/section:MySec,RWS”)/*HINSTANCE g_hInst;
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved){ g_hInst=hinstDLL;}*/
LRESULT CALLBACK MouseProc(int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates){ return 1;攔截了鼠標(biāo)消息。}
LRESULT CALLBACK KeyboardProc(int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information){ if(VK_F2==wParam)如果是F2鍵,則退出。{ SendMessage(g_hWnd,WM_CLOSE,0,0);UnhookWindowsHookEx(g_hMouse);當(dāng)退出時(shí)將鉤子卸掉。UnhookWindowsHookEx(g_hKeyboard);} return 1;}
void SetHook(HWND hwnd)此函數(shù)設(shè)置了鉤子。{ g_hWnd=hwnd;注意這種傳遞調(diào)用它的進(jìn)程的句柄的方法,比較巧妙!
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle(“Hook”),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(“Hook”),0);} Hook.DEF的代碼如下: LIBRARY Hook EXPORTS SetHook @2 SEGMENTS MySec READ WRITE SHARED 也可以設(shè)置節(jié)的屬性。
4.新建一個(gè)工程調(diào)用此鉤子函數(shù)。工程名為HookTest,基于對(duì)話框的。在OnInitDialog()中調(diào)用SetHook(),要事先聲明_declspec(dllimport)void SetHook(HWND hwnd);然后在Project->Setting->Link->加入..HookDebugHook.lib,并將Hook.Dll拷貝到當(dāng)前目錄。int cxScreen,cyScreen;cxScreen=GetSystemMetrics(SM_CXSCREEN);cyScreen=GetSystemMetrics(SM_CYSCREEN);SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);將窗口保持在最前面。SetHook(m_hWnd);5.DLL的調(diào)試方法,設(shè)置斷點(diǎn),然后運(yùn)行時(shí)斷點(diǎn)時(shí),step into即可。4.數(shù)據(jù)庫(kù)編程
1.ODBC,ADO簡(jiǎn)介:ADO可以認(rèn)為是建立在ODBC上的。ADO的三個(gè)核心對(duì)象 Connection對(duì)象
Connection對(duì)象表示了到數(shù)據(jù)庫(kù)的連接,它管理應(yīng)用程序和數(shù)據(jù)庫(kù)之間的通信。Recordset和Command對(duì)象都有一個(gè)ActiveConnection屬性,該屬性用來(lái)引用Connection對(duì)象。Command對(duì)象
Command對(duì)象被用來(lái)處理重復(fù)執(zhí)行的查詢,或處理需要檢查在存儲(chǔ)過(guò)程調(diào)用中的輸出或返回參數(shù)的值的查詢。Recordset對(duì)象
Recordset對(duì)象被用來(lái)獲取數(shù)據(jù)。Recordset對(duì)象存放查詢的結(jié)果,這些結(jié)果由數(shù)據(jù)的行(稱為記錄)和列(稱為字段)組成。每一列都存放在Recordset的Fields集合中的一個(gè)Field對(duì)象中。
2.演示在VB中使用ADO的方法,方法比較簡(jiǎn)單,使用方便。另外在VB中演示了Connection和Command和Recordset的方法,用這三種方法都可以執(zhí)行SQL語(yǔ)句。
3.在VC中利用ADO訪問(wèn)數(shù)據(jù)庫(kù)。
1.新建一個(gè)基于對(duì)話框的工程,名為ADO。
2.在對(duì)話框中放一ListBox和一個(gè)Button控件。
3.在使用時(shí)須導(dǎo)入MSADO15.dll,方法是在StdAfx.h中#import “D:Program FilesCommon FilesSystemadomsado15.dll” no_namespace rename(“EOF”,“rsEOF”)至少于將EOF改名為rsEOF,是為了避免與文件中的EOF重名。然后編譯程序,將產(chǎn)生的debug目錄下的兩個(gè)文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我們查看而已。并不是編譯需要它。
ADO也是COM組件,須初始化COM庫(kù)方法是CoInitialize(NULL);使用完后須CoUninitialize();代碼如下:
void CAdoDlg::OnBtnQuery(){ // TOD Add your control notification handler code here CoInitialize(NULL);初始化
_ConnectionPtr pConn(__uuidof(Connection));產(chǎn)生connection智能指針 _RecordsetPtr pRst(__uuidof(Recordset));產(chǎn)生recordset智能指針 _CommandPtr pCmd(__uuidof(Command));產(chǎn)生command智能指針
pConn->ConnectionString=“Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs”;數(shù)據(jù)庫(kù)信息 pConn->Open(“",”“,”“,adConnectUnspecified);打開數(shù)據(jù)庫(kù) //pRst=pConn->Execute(”select * from authors“,NULL,adCmdText);用記錄集查詢數(shù)據(jù)
//pRst->Open(”select * from authors“,_variant_t((IDispatch*)pConn), // adOpenDynamic,adLockOptimistic,adCmdText);pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));pCmd->CommandText=”select * from authors“;用這種方法也可以查詢數(shù)據(jù) pRst=pCmd->Execute(NULL,NULL,adCmdText);while(!pRst->rsEOF)將查詢到的數(shù)據(jù)加到列表框咯。{((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect(”au_lname"));pRst->MoveNext();}
pRst->Close();pConn->Close();pCmd.Release();pRst.Release();pConn.Release();CoUninitialize();} 至此20課筆記全部記完,關(guān)于數(shù)據(jù)庫(kù)的比較簡(jiǎn)單些。
第五篇:VC課程設(shè)計(jì)教學(xué)和任務(wù)
VC++ 課程設(shè)計(jì)指導(dǎo)書
江蘇科技大學(xué)南徐學(xué)院電子信息系
2011年9月
《計(jì)算機(jī)程序設(shè)計(jì)(vc++)課程設(shè)計(jì)》課程設(shè)計(jì)指導(dǎo)書
一. 課程設(shè)計(jì)教學(xué)和任務(wù)
《計(jì)算機(jī)程序設(shè)計(jì)(vc++)課程設(shè)計(jì)》是實(shí)踐性教學(xué)環(huán)節(jié),是學(xué)生必修的一門計(jì)算機(jī)實(shí)踐課程。
本課程設(shè)計(jì)的目的是通過(guò)綜合性程序設(shè)計(jì)訓(xùn)練,使學(xué)生進(jìn)一步鞏固對(duì)計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言(vc++)基本語(yǔ)法,基本算法的理解,加深對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)的理解與應(yīng)用,并使學(xué)生養(yǎng)成模塊化,結(jié)構(gòu)化程序設(shè)計(jì)的良好風(fēng)格,以及一定的程序組織能力,掌握基本程序設(shè)計(jì)的方法和技巧,為學(xué)習(xí)后續(xù)課程和實(shí)際編程打下良好的基礎(chǔ)。
本課程設(shè)計(jì)的重點(diǎn)要求學(xué)生掌握基本程序設(shè)計(jì)理念和方法,培養(yǎng)學(xué)生基本程序設(shè)計(jì)的應(yīng)用和開發(fā)能力。二. 課程設(shè)計(jì)要求與內(nèi)容
1.本課程設(shè)計(jì)要求
(1)學(xué)生必須完成本指導(dǎo)書中所有的小綜合設(shè)計(jì)題,并且完成大綜合設(shè)計(jì)題中的任意一題(具體題目由任課教師指定)。要求:對(duì)主要變量及函數(shù)要加注釋,以說(shuō)明其功能。
(2)每個(gè)學(xué)生必須完成課程設(shè)計(jì)報(bào)告一篇。(報(bào)告格式見(jiàn)附錄)2.課程設(shè)計(jì)的內(nèi)容
本課程設(shè)計(jì)內(nèi)容包括兩個(gè)部分:小綜合設(shè)計(jì)題和大綜合設(shè)計(jì)題。
====================================== 附:課程設(shè)計(jì)報(bào)告格式一、二、課程設(shè)計(jì)目的 課程設(shè)計(jì)內(nèi)容
1、小綜合題
2、大綜合題
三、課程設(shè)計(jì)體會(huì)及建議
小綜合設(shè)計(jì)題
1.二維數(shù)組的操作運(yùn)算
定義一個(gè)n×n的二維數(shù)組a,將該二維數(shù)組中周邊元素的值全部置為2,其他元素全部置為0。
例如: 當(dāng)n為8時(shí)生成并輸出的矩陣為:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 定義類MAT,具體要求如下:
(1)私有數(shù)據(jù)成員
int n;二維數(shù)組的階數(shù)
int *p;將二維數(shù)組以一維數(shù)組方式存儲(chǔ),p是起始指針。
(2)公有成員函數(shù)
MAT(int n1);初始化n,并動(dòng)態(tài)申請(qǐng)數(shù)組空間,令p指向該空間。
void create();給數(shù)組賦值。
void print();按矩陣方式輸出二維數(shù)組。
~ MAT();析構(gòu)函數(shù),釋放動(dòng)態(tài)數(shù)組空間。
(3)在主函數(shù)中完成對(duì)該類的測(cè)試。鍵盤輸入二維數(shù)組的階數(shù)n(如8或6),定義一個(gè)MAT類的對(duì)象m,用n初始化m,按要求生成并輸出數(shù)組的值。
2.鏈表
建立一條無(wú)序鏈表,結(jié)點(diǎn)名為node,用一個(gè)函數(shù)實(shí)現(xiàn)將這條鏈表構(gòu)成一條新的逆序鏈表,即將鏈表頭當(dāng)鏈表尾,鏈表尾當(dāng)鏈表頭。輸出這兩條鏈表上各個(gè)節(jié)點(diǎn)的值。
3.字符串處理
將字符串中指定的英語(yǔ)單詞(字母子串)進(jìn)行單數(shù)變復(fù)數(shù)的處理,單詞之間用非字母分隔。為了簡(jiǎn)化編程,將單詞的單數(shù)變復(fù)數(shù)的規(guī)則是:直接在單詞后加s。例如單詞student的復(fù)數(shù)為students。例如,有下列字符串:
We are student, you are student, too.指定單詞student,將字符串中所有的student修改為students。處理后的字符串為:
We are students, you are students, too.試建立一個(gè)類Modistr,完成以上工作。具體要求如下:
(1)私有數(shù)據(jù)成員
char *str;存放指定的字符串;
(2)公有成員函數(shù)
Modistr(char *s);構(gòu)造函數(shù),動(dòng)態(tài)申請(qǐng)字符串空間,用s所指向的串初
始化str;
void print();輸出字符串str;
void modify(char *wordp);將wordp所指向的單詞轉(zhuǎn)換為復(fù)數(shù)。
~Modistr();析構(gòu)函數(shù)
(3)在主函數(shù)中完成對(duì)該類的測(cè)試。定義類Modistr的對(duì)象mys,用字符串“We are student, you are student, too.”初始化mys,調(diào)用函數(shù)modify(char *)完成將單詞“student”單數(shù)變復(fù)數(shù)的處理。
輸出變換前和變換后的字符串。
提示:判斷一個(gè)字符ch是否為字母,可用系統(tǒng)庫(kù)函數(shù)isalpha(ch)。該函數(shù)的功能是:若ch是字母,返回真,否則返回假。使用該函數(shù)必須包含頭文件ctype.h。
4.素?cái)?shù)問(wèn)題
建立一個(gè)類PRIME,求指定范圍內(nèi)的所有素?cái)?shù)(質(zhì)數(shù))。具體要求如下:
(1)私有數(shù)據(jù)成員
int data[200];依次存放指定范圍內(nèi)的所有素?cái)?shù)。
int min,max;存放待求素?cái)?shù)的數(shù)值范圍的下限和上限。
int num;存放min與max之間的素?cái)?shù)個(gè)數(shù)。
(2)公有成員函數(shù)
構(gòu)造函數(shù)PRIME(int n1, int n2);用n1和n2初始化待求素?cái)?shù)的范圍 min、max及num(值為0)。
void process();求指定范圍內(nèi)的所有素?cái)?shù),把它們存放在數(shù)組data中。求素?cái)?shù)的算法必須是:首先將min與max之間的所有奇數(shù)依次放入數(shù)組data中,然后依次判斷data中的每一個(gè)元素是否為素?cái)?shù)。
若不是素?cái)?shù),則將其值賦為0。最后,數(shù)組data中不為0的元素均為素?cái)?shù)。將不為0的元素值集中連續(xù)存放到數(shù)組的前面,同時(shí)統(tǒng)計(jì)素?cái)?shù)個(gè)數(shù)。
void print();輸出求出的所有素?cái)?shù),同時(shí)輸出素?cái)?shù)個(gè)數(shù)。
(3)在主程序中對(duì)該類進(jìn)行測(cè)試。
定義一個(gè)PRIME類的對(duì)象test,并用待求素?cái)?shù)范圍min =10, max=200初始化test。通過(guò)test調(diào)用成員函數(shù)求出10至200之間的所有素?cái)?shù),并輸出結(jié)果。[提示] 素?cái)?shù)的定義是“只能被1和它本身整除的正整數(shù)”,素?cái)?shù)也稱為質(zhì)數(shù)。
5.信號(hào)系統(tǒng)問(wèn)題
定義一個(gè)類為形狀,由它公有派生出正方體、球體和圓柱體。利用虛函數(shù)的多態(tài)性形式完成計(jì)算正方體、球體和圓柱體的體積。具體要求如下:(1)基類: shape 保護(hù)數(shù)據(jù)成員:double a,b;
公有構(gòu)造函數(shù):shape(double,double); 公有純虛函數(shù):double volume();(2)派生類
正方體、球體和圓柱體的類名分別為cube,sphere,cylinder, 各派生類均需要定義公有的構(gòu)造函數(shù)以及求體積的虛函數(shù)double volume()。(3)派生類為球體時(shí),a為半徑,b為0。
派生類為正方體時(shí),a表示邊長(zhǎng),b為0。
派生類為圓柱體時(shí),a為圓柱體的邊長(zhǎng),b為圓柱體的高。
(4)設(shè)計(jì)一個(gè)完整的程序,分別計(jì)算正方體、球體和圓柱體的體積并輸出結(jié)果。
測(cè)試數(shù)據(jù)如下:
形狀類指針變量:p、球體對(duì)象:C(0.8)、正方體對(duì)象:S(3.2)和圓柱體類對(duì)象:R(4.1,5)。用指針p分別指向派生類對(duì)象。
輸出結(jié)果為:
球體的體積是2.14357
正方體的體積是32.768
長(zhǎng)方體的體積是263.917 提示:球體的體積公式=4/3*π*半徑*半徑*半徑(其中π取常數(shù)3.14)
正方體的體積=棱長(zhǎng)×棱長(zhǎng)×棱長(zhǎng)
圓柱的體積=底面積×高
6.求兩個(gè)日期之間相差的天數(shù)。
設(shè)計(jì)一個(gè)日期類Date,包括日期的年份、月份和日號(hào),編寫一個(gè)友元函數(shù),求兩個(gè)日期之間相差的天數(shù)。具體要求如下:(1)私有數(shù)據(jù)成員
int year, month, day;
(2)公有成員函數(shù)
Date(int y,int m,int d);//構(gòu)造函數(shù),初始化日期。void disp();//輸出日期。
friend int count day(Date &d,int);// 使用二維數(shù)組存放各月天數(shù),第一行對(duì)應(yīng)非閏年,第二行對(duì)應(yīng)閏年。
friend int leap(int year);
//判斷是否閏年,是返回1,否則返回0。friend int subs(Date &d1,Date &d2);
//求兩個(gè)日期之間相差的天數(shù)。
(3)在主函數(shù)中完成對(duì)該類測(cè)試,定義兩個(gè)對(duì)象d1(2000,1,1)和d2(2002,10,1),調(diào)用subs函數(shù)。程序正確的運(yùn)行結(jié)果是: 2000.1.1與2002.10.1之間有1002天
7.身份證。
已知舊身份證號(hào)碼共15位,其中第7~12位是以2位年份+2位月份+兩位日期組成,而新身份證號(hào)碼共18位,其中第7~14位是以4位年份+2位月份+兩位日期組成。試定義一個(gè)類ID,根據(jù)居民的出生日期檢查其身份證號(hào)是否正確。
具體要求如下: 1)私有成員:
char s[19] : 存放身份證號(hào)。
int yy, mm, dd : 分別存放居民出生日期的年(4位)、月(10~12月兩位,其余1 位)、日(兩位)。
2)公有成員:
ID(char str[]):構(gòu)造函數(shù)。
int val(char *p): 將數(shù)字字符串p轉(zhuǎn)換為相應(yīng)的十進(jìn)制數(shù),如“123”轉(zhuǎn)換為數(shù)值123,“08”轉(zhuǎn)換為數(shù)值8;
int fun(): 根據(jù)出生日期檢驗(yàn)身份證號(hào)是否正確,如果正確,函數(shù)值為1,否則為0。
必須使用如下算法:先分別取出身份證中的表示年份、月份、日期的子字符串,然后利用上述int val(char *p)函數(shù)轉(zhuǎn)換為數(shù)值,再與出生日期的相應(yīng)成員數(shù)據(jù)比較。
void print(): 輸出所有成員數(shù)據(jù)。
3)在主函數(shù)中輸入兩個(gè)身份證號(hào)(一個(gè)18位:***910,另一個(gè)15位***),分別用這兩個(gè)身份證號(hào)生成類ID的對(duì)象,在主函數(shù)中通過(guò)成員函數(shù)fun確定身份證號(hào)是否正確并輸出相應(yīng)的信息(身份證號(hào)、出生日期、檢驗(yàn)結(jié)果)。
8.9×9乘法口訣表。
定義一個(gè)類MUL,生成如下的9×9乘法口訣表,要求口訣表存儲(chǔ)在動(dòng)態(tài)數(shù)組中,并輸出到屏幕上。運(yùn)行結(jié)果如下: 1 2 3 4
5
6
7
8
9
具體要求如下:(1)私有數(shù)據(jù)成員
nt(*a)[9];a是一個(gè)行指針變量,其指向的數(shù)組空間是動(dòng)態(tài)生成的,用于存放口訣表??谠E表存放在二維數(shù)組的左下三角形中。
(2)公有成員函數(shù)
MUL();構(gòu)造函數(shù),動(dòng)態(tài)生成數(shù)組空間。void process();生成乘法口訣表。void print();輸出乘法口訣表。
~MUL();析構(gòu)函數(shù),釋放動(dòng)態(tài)數(shù)組空間。
(3)在主函數(shù)中完成對(duì)該類的測(cè)試。定義一個(gè)MUL類的對(duì)象a,通過(guò)a調(diào)用成員函數(shù)求出并輸出乘法口訣表。
9.字符串分類。
輸入一個(gè)字符串,串內(nèi)有數(shù)字和非數(shù)字字符。
例如:
ABC2345
345rrf678
jfkld945
將其中連續(xù)的數(shù)字作為一個(gè)整數(shù),依次存放到另一個(gè)整型數(shù)組b中。如對(duì)于上面的輸入,將2345存放到b[0]、345放入b[1]………
統(tǒng)計(jì)出字符串中的整數(shù)個(gè)數(shù),并輸出這些整數(shù)。要求:
(1)在主函數(shù)中完成輸入和輸出工作。
(2)設(shè)計(jì)一個(gè)函數(shù),把指向字符串的指針和指向整數(shù)的指針作為函數(shù)的參數(shù),并完成從字符串中依次提取出整數(shù)的工作。
10.?dāng)?shù)組元素排序
將含有12個(gè)元素的數(shù)組作如下處理:先將所有數(shù)據(jù)按其在數(shù)組中的次序分成4等分,然后以每一組數(shù)據(jù)為單位按其平均值從小到大排序。例如,原數(shù)組為:{5,6,7,1,2,3,7,8,9,2,3,5 }處理后的數(shù)組為:{1,2,3,2,3,5,5,6,7,7,8,9}試定義一個(gè)類DATA完成上述功能,具體要求如下:
(1)私有數(shù)據(jù)成員int a[12], b[12];數(shù)組a用以存放原始數(shù)據(jù),數(shù)組b用以存放處理后的數(shù)據(jù)。
(2)公有成員函數(shù)DATA(int x[], int n);構(gòu)造函數(shù)。用參數(shù)x初始化a,將b的所有元素初始化為0,n為數(shù)組x的元素個(gè)數(shù)。
void convert(int x[4][3]);將a中的數(shù)據(jù)進(jìn)行分組,并轉(zhuǎn)換為二維數(shù)組x,其中每一組依次為數(shù)組x的一行。
void sort();按每組的平均值實(shí)現(xiàn)分段排序,并將排序后的數(shù)據(jù)存放到數(shù)據(jù)成員b中。
算法要求:利用函數(shù)convert()將a轉(zhuǎn)換為二維數(shù)組,再求二維數(shù)組每一行的平均值,然后根據(jù)該平均值從小到大對(duì)該二維數(shù)組進(jìn)行行排序,并將結(jié)果按題意轉(zhuǎn)換為一維數(shù)組存放到b中。
void print();輸出a和b的所有元素。
(3)在主函數(shù)中利用給定的數(shù)組生成類DATA的對(duì)象test,并對(duì)該類進(jìn)行測(cè)試。假設(shè)給定數(shù)組為{5, 6, 7, 1, 2, 3, 7, 8, 9, 2, 3, 5}。輸入/輸出示例:
處理前的數(shù)組:5 6 7 1 2 3 7 8 9 2 3 5
處理后的數(shù)組:1 2 3 2 3 5 5 6 7 7 8 9
大綜合設(shè)計(jì)題
設(shè)計(jì)題目一:學(xué)生學(xué)籍成績(jī)管理系統(tǒng)
每個(gè)學(xué)生的信息包括:姓名、學(xué)號(hào)、性別、和學(xué)生的成績(jī)信息 如:英語(yǔ)、數(shù)學(xué)、程序設(shè)計(jì)及體育成績(jī)等各門課的成績(jī),要求程序能自動(dòng)增加一門或是幾門課的成績(jī),同時(shí)可以刪除課程。
從鍵盤輸入數(shù)據(jù),然后,完成如下處理:
1.對(duì)學(xué)生姓名或?qū)W號(hào)進(jìn)行查詢,顯示其信息,求出其總成績(jī)、平均成績(jī)、平均基點(diǎn),并且顯不在全班的學(xué)成績(jī)排名。2.對(duì)所有學(xué)生,按班級(jí)計(jì)算平均。
設(shè)計(jì)題目二:通訊錄管理系統(tǒng)
1.系統(tǒng)概要
該系統(tǒng)的功能是實(shí)現(xiàn)通訊錄管理。2.基本功能要求
(1)輸入姓名、單位、電話號(hào)碼(2)顯示上述內(nèi)容(3)按姓名查找后顯示(4)刪除有關(guān)記錄(5)增加記錄
(6)保存修改后的文件(7)顯示修改后的文件
3.各功能模塊的程序流程圖。(學(xué)生完成)4.完整的源程序代碼。(學(xué)生設(shè)計(jì)完成)
設(shè)計(jì)題目三:小型特殊計(jì)算器
1.系統(tǒng)概要
本程序的功能是實(shí)現(xiàn)一個(gè)特殊的計(jì)算器,可以實(shí)現(xiàn)復(fù)數(shù)、有理數(shù)、矩陣和集合的特殊計(jì)算。程序可以實(shí)現(xiàn)復(fù)數(shù)、有理數(shù)的加、減、乘、除,可以實(shí)現(xiàn)矩陣的加法、減法和乘法運(yùn)算,也可以實(shí)現(xiàn)集合的求交集、并集、子集的運(yùn)算。注:可任選兩種運(yùn)算。
2.基本功能要求
(1)功能選擇可以用菜單來(lái)實(shí)現(xiàn) 例如:請(qǐng)選擇您的計(jì)算內(nèi)容: 1.復(fù)數(shù)計(jì)算 2.有理數(shù)計(jì)算 3.矩陣計(jì)算 4.集合計(jì)算 0.退出
用戶通過(guò)輸入不同的數(shù)字進(jìn)入不同的菜單。次級(jí)菜單主要顯示本程序的功能,主要的功能有加法、減法、乘法和除法以及集合的求交集、求并集、求子集。(2)運(yùn)行時(shí)給出明確的提示信息。
比如,輸入一個(gè)什么類型的數(shù)據(jù)。根據(jù)用戶的輸入計(jì)算輸出結(jié)果。由于數(shù)據(jù)類型比較多,可以一次輸入第一個(gè)復(fù)數(shù)的實(shí)部,第一個(gè)復(fù)數(shù)的虛部,再輸入第二個(gè)復(fù)數(shù)的實(shí)部、虛部。矩陣運(yùn)算需要先輸入矩陣的行數(shù)和列數(shù),然后依次輸出矩陣的第一行第一列的元素、第一行第二列的元素等等,依次類推。有理數(shù)運(yùn)算需要一次輸入有理數(shù)的分子、分母。集合運(yùn)算需要輸入集合的元素個(gè)數(shù),然后依次輸入集合中的每一個(gè)元素。
3.各功能模塊的程序流程圖。(學(xué)生完成)4.完整的源程序代碼。(學(xué)生設(shè)計(jì)完成)
設(shè)計(jì)題目四:選修課小系統(tǒng)
1.系統(tǒng)概要
通過(guò)這一款選修課小系統(tǒng),學(xué)生可以登入學(xué)生端進(jìn)行選課及其他的操作,管理者通過(guò)登入管理端可以進(jìn)行對(duì)選修課系統(tǒng)的數(shù)據(jù)的管理和維護(hù)。在學(xué)生端主要設(shè)置了3個(gè)基本功能:學(xué)生選課、學(xué)生情況、選課情況等;在管理端主要設(shè)置了9個(gè)基本功能:增加/刪除學(xué)生、增加/刪除課程、更改學(xué)分、填寫成績(jī)、學(xué)生情況、選課情況、保存數(shù)據(jù)等。這些功能基本上能滿足選課的基本要求。此程序可以初步體現(xiàn)課程設(shè)計(jì)的目標(biāo)。2.基本功能要求
用VC++編寫一個(gè)界面美觀流暢學(xué)生選課系統(tǒng)。學(xué)生有名字,學(xué)生最多可學(xué)五門課程,學(xué)生實(shí)際學(xué)的門數(shù),可以給定學(xué)生的名字,可以得到學(xué)生的名字,可以得到學(xué)生給定課程的成績(jī),可以得到學(xué)生所學(xué)課程的平均成績(jī),可以給學(xué)生增加一門課(同時(shí)在該課程中增加一個(gè)學(xué)生)。課程最多有30個(gè)學(xué)生,課程有實(shí)際學(xué)生
數(shù),課程有實(shí)際學(xué)生名單,課程有學(xué)分?jǐn)?shù),課程有每個(gè)學(xué)生成績(jī),課程可以得到學(xué)分?jǐn)?shù),課程可以設(shè)置學(xué)分?jǐn)?shù),課程可以得到班平均成績(jī),課程可以得到某個(gè)學(xué)生成績(jī)。
3.各功能模塊的程序流程圖。(學(xué)生完成)4.完整的源程序代碼。(學(xué)生設(shè)計(jì)完成)
設(shè)計(jì)題目五:學(xué)生成績(jī)管理系統(tǒng)
系統(tǒng)上采用VC++為開發(fā)環(huán)境,這個(gè)編譯器功能完善,使用方便。課程設(shè)計(jì)《學(xué)生成績(jī)管理系統(tǒng)》,它的主要功能是對(duì)學(xué)生的成績(jī)進(jìn)行修改和管理。
系統(tǒng)功能要求:(1)界面
************************************ 學(xué)生成績(jī)管理系統(tǒng)
************************************ ************************************ ** 1--輸入數(shù)據(jù) ** ** 2-查詢成績(jī) ** ** 3--修改成績(jī) ** ** 4--輸出所有學(xué)生成績(jī) ** ** 5--統(tǒng)計(jì)及格和優(yōu)秀人數(shù) ** ** 6--退出系統(tǒng) ** *************************************(2)功能
程序的主要功能是輸入學(xué)生姓名、成績(jī),學(xué)號(hào)自動(dòng)生成,并可以對(duì)學(xué)生的成績(jī)按學(xué)號(hào)和姓名進(jìn)行查詢。該系統(tǒng)具有存貯學(xué)生數(shù)據(jù),按學(xué)號(hào)、姓名查詢,按需要修改學(xué)生成績(jī),列出學(xué)生成績(jī)和統(tǒng)計(jì)功能。