




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1VC++面向對象與可視化程式設計2第一講VC++集成開發(fā)環(huán)境第一講VC++集成開發(fā)環(huán)境第一講VC++集成開發(fā)環(huán)境第一講VC++集成開發(fā)環(huán)境第一講VC++集成開發(fā)環(huán)境31VisualC++簡介是Windows環(huán)境下最主要的應用開發(fā)系統(tǒng)之一是C++語言的集成開發(fā)環(huán)境與Win32緊密相連強大的調試功能為大型複雜軟體的開發(fā)提供了有效的排錯手段2可視化指軟體開發(fā)階段的可視化利用電腦圖形技術和方法一、VisualC++6.0簡介及開發(fā)環(huán)境的構成43開發(fā)環(huán)境開發(fā)環(huán)境是程式員同VC++的交互介面通過它,可以創(chuàng)建工程檔訪問資源編輯器使用內部調試器訪問程式源代碼54菜單簡介Edit菜單File菜單View菜單Insert菜單6Project菜單Build菜單Tools菜單Windows菜單7File->New->Files(1)VC++的菜單欄File菜單8File->New->Projects9中斷點作用:中斷程式的執(zhí)行過程,以便檢查程式代碼、變數(shù)和寄存器值位置中斷點數(shù)據(jù)中斷點消息中斷點用來設置刪除和查看中斷點(a)Breakpoints選項(2)VC++的菜單欄Edit菜單10位置中斷點通常在源代碼的指定行、函數(shù)的開始或指定的記憶體地址處設置,當程式執(zhí)行到指定位置時,位置中斷點將中斷程式的執(zhí)行在位置中斷點中還可以設置中斷點條件,此時必須先指定位置,然後再設置條件中斷點數(shù)據(jù)中斷點是在變數(shù)或運算式上設置,當變數(shù)或運算式的值改變時,數(shù)據(jù)斷點將中斷程式的執(zhí)行消息中斷點是在窗口函數(shù)WndProc上設置,當接收到指定的消息時,消息斷點將中斷程式的執(zhí)行11(b)ListMembers選項利用此選項,可減輕輸入代碼的工作量。如在變數(shù)名之後鍵入“.”或“->”,系統(tǒng)就會自動顯示所有有效的成員名供選擇(c)TypeInfo選項
如果在源代碼中將滑鼠指針停在某一變數(shù)或函數(shù)上,那麼系統(tǒng)將顯示所指變數(shù)或函數(shù)等的語法提供有效的成員名12(d)ParameterInfo選項
當輸入代碼時,若在輸入函數(shù)名之後鍵入左括弧,系統(tǒng)將顯示該函數(shù)的完整原型,並用黑體顯示其第一個參數(shù)。輸入第一個參數(shù)之後,接著就會出現(xiàn)第二個參數(shù),依此類推(e)CompleteWord選項
系統(tǒng)自動完成當前語句其餘部分的輸入。如果不能自動完成,則給出適當?shù)奶崾据o助用戶完成13在View菜單中可以:改變窗口改變工具欄的顯示方式檢查源代碼啟動調試等View->ClassWizard選項(a)ClassWizard選項(3)VC++的菜單欄View菜單14(a-1)ClassWizard中的MessageMaps選項卡為窗口、對話框、控件、菜單選項和加速鍵等對象映射消息創(chuàng)建或刪除消息處理函數(shù)查看消息處理函數(shù)的代碼15(a-2)MemberVariables選項卡:定義成員變數(shù)用於自動初始化其中:
ControlIDs是映射到成員變數(shù)的控件ID值
Type是成員變數(shù)的類型
Member是成員變數(shù)名16(a-3)Automation選項卡:
此選項卡主要將在創(chuàng)建新類時,添加自動化方法和屬性列出已經添加到當前類中的方法和屬性的名稱Externalnames中的方法和屬性的實現(xiàn)方法17(a-4)ClassInfo選項卡:提供有關類的資訊18(b)ResourceSymbols選項
該選項將打開資源符號流覽器,從中可以流覽資源編輯符號資源編輯符號是映射到整數(shù)值上的一串字元,相當於資源的一個代號,在同一個程式中,資源編輯符號不能重複19(c)ResourceIncludes選項
該對話框包含資源符號頭檔案名和預處理指令。20(d)Workspace選項
如果工作區(qū)沒有顯示或者不是處於當前狀態(tài),則選擇該項將顯示工作區(qū)窗口。(e)Output選項
在輸出窗口中顯示程式建立過程(如編譯、鏈接等)的有關資訊或錯誤資訊,並且顯示調試運行時的輸出結果。21(a)NewClass選項該選項用來創(chuàng)建新類並添加到專案中(4)VC++的菜單欄Insert菜單22(b)NewForm選項該選項用來創(chuàng)建新的表單並添加到專案中(c)Resource選項該選項將打開InsertResource對話框,用以創(chuàng)建新的資源或插入資源檔中(d)ResourceCopy選項要選中該選項必須先選中某個資源,否則呈灰色。該選項用於複製選定的資源23(e)NewATLObject選項該選項將啟動ATLObjectWizard,以便添加新的ATL對象24使用Project可以創(chuàng)建、修改和存儲正在編輯的工程檔
工程檔組合了一個應用程式的所有原始檔案的組成部分。工程檔包含在擴展名為.MAK的檔中。(5)VC++的菜單欄Project菜單25(b)AddToProject選項
選擇該選項將打開一個級聯(lián)子菜單通過級連子菜單,可以把檔、檔夾、資料鏈接以及VC組件或控件添加到當前工程檔中在該子菜單中可以進行如下操作:(1)New:創(chuàng)建新的檔;(2)NewFolder:插入新的檔夾;(3)Files:插入已有檔;(4)DataConnection:添加資料鏈接;(5)ComponentandControls:通過該項將可以插入VC組件或者已註冊的ActiveX控件。插入時相當於插入相關的頭檔(.h檔)和實現(xiàn)檔(.cpp檔),並且更新工作區(qū)窗口的資訊。(a)SetActiveProject選項設定指定的專案為工作區(qū)的活動專案26(c)Settings選項選擇該選項將彈出ProjectSettings對話框,其中General選項卡用來設置基礎類用法和目錄指出應用程式與MFC的鏈接方式指出所建立的應用程式的缺省位置為Debug目錄輸出檔的位置27Build菜單用於編譯、建立和執(zhí)行應用程式(b)Build選項對最後修改過的原始檔案進行編譯和鏈接(a)Compile選項只編譯當前檔而不調用鏈接器或其他工具。輸出窗口將顯示編譯過程檢查出的錯誤或警告資訊,在錯誤資訊處單擊滑鼠右鍵,可以得到錯誤代碼的位置(c)
RebuildAll選項該選項允許用戶編譯所有的原始檔案,而不管它們何時曾經被修改過(6)VC++的菜單欄Build菜單28(d)BatchBuild選項
該選項能單步重新建立多個工程檔,並允許用戶指定要建立的專案類型Win32Release(發(fā)行版)、Win32Debug(調試版)。VC提供了兩種應用程式類型29(e)
StartDebug選項從當前語句開始執(zhí)行程序直到遇到斷點或遇到程式結束單步執(zhí)行程式,並在遇到函數(shù)調用時進入函數(shù)內部再從頭單步執(zhí)行使程式在運行到當前光標所在位置時停止(相當於設置一個臨時中斷點)調試過程中直接進入到正在運行的進程中30(a)SourceBrowse選項
編譯器在建立項目時會創(chuàng)建與專案中每一程式檔資訊有關的.SBR檔。BSCMAKE程式將這些.SBR檔彙編為單個流覽資訊資料庫
選擇SourceBrowse將彈出流覽窗口,它顯示與程式中所有符號(類、函數(shù)、數(shù)據(jù)、宏和類型)有關的資訊Tools菜單允許用戶快速地訪問多個不同的開發(fā)工具(7)VC++的菜單欄Tools菜單31(b)VisualComponentManager選項
該工具可以在某個工程中組織、尋找和插入相關組件,而且還可以識別已存在的且可利用的對象。選擇該選項將彈出如圖所示的窗口32在工作區(qū)中添加專案:
用File->Open選項可打開已存在的專案;通過New對話框的Projects選項卡創(chuàng)建新的專案,並選擇Addtocurrentworkspace複選框。
VC以專案工作區(qū)的形式來組織檔、專案和專案配置1.創(chuàng)建新的專案工作區(qū)創(chuàng)建新的空工作區(qū)步驟:(a)File->New->Workspaces->輸入工作區(qū)名字並指定工作區(qū)目錄二、專案與專案工作區(qū)332.專案工作區(qū)窗口簡介
VC專案工作區(qū)由ClassView、ResourceView及FileView三個面板組成34在VC中,源代碼或資源編輯器為了引用資源和用戶自定義的其他對象,於是就引入了一種與資源一一對應的符號即資源符號,使之能夠以字串的方式被引用。
資源符號是映射到整數(shù)值上的一串字元,是一種識別字。每當創(chuàng)建一個新的資源或資源對象時,系統(tǒng)就會為其提供一個缺省的資源符號名稱並賦一個整數(shù)值,該定義保存在resource.h檔中。資源圖示游標菜單位圖對話框資源是一種介面元素,用戶可以從中獲得資訊並在其中執(zhí)行某個動作三、資源及資源編輯器35單擊New按鈕新建資源符號輸入新資源符號的名稱由於資源符號不能重複,因此應按照一種標準來定義資源符號進行符號定義View->ResourceSymbols(1)資源的建立36資源符號的取值範圍一般為0~32767(2)資源符號定義的常用首碼
37程式調試工具包括根源程式語法檢查、可執(zhí)行程式修改和運行監(jiān)視等應用程式Help和Setup開發(fā)工具包系統(tǒng)函數(shù)庫和系統(tǒng)函數(shù)開發(fā)工具資源管理器包括圖形化窗口及組成元素的多種對象的編輯器可選擇並構成具體語句或根源程式結構的例程庫及Help根源程式編輯器和編譯器可視化開發(fā)系統(tǒng)集成了一系列系統(tǒng)可用資源和開發(fā)工具一、Windows編程基礎38採用互動式方法時,可視化開發(fā)平臺給出了許多選用的對象,程式員可選擇所需對象並確定其屬性,由此搭建起應用程式的“大框架”,並可根據(jù)需要進一步編寫必要的細節(jié)代碼段,最後構成完整的應用程式Windows的程式設計語言VCVBVJ都是“面向對象”的程式設計語言對象是Windows的規(guī)範部件窗口菜單按鈕對話框程式模組編寫Windows程式相當一部分工作是在創(chuàng)建對象和為對象屬性賦值對象特徵:具有規(guī)範形態(tài)和操作模式編程方法傳統(tǒng)編寫法-->API互動式方法-->MFC39APIAPI函數(shù)的功能為應用程式提供Windows系統(tǒng)特殊函數(shù)及數(shù)據(jù)結構Win應用程式可以利用標準大量API函數(shù)調用系統(tǒng)功能是Win系統(tǒng)與Win應用程式間的標準程式介面窗口管理函數(shù)實現(xiàn)窗口的創(chuàng)建、移動和修改功能系統(tǒng)服務函數(shù):實現(xiàn)與操作系統(tǒng)有關的多種功能圖形設備(GDI)函數(shù):實現(xiàn)與設備無關的圖形操作功能40
利用Windows
API函數(shù)編寫Windows應用程式必須首先瞭解以下內容:(1)窗口的概念(2)事件驅動的概念(3)句柄(4)消息41(1)窗口 一個應用程式的窗口一般包含下列成分:窗口邊界工作區(qū)控制菜單框下拉菜單水準滾動條垂直滾動條最大化按鈕最小化按鈕標題欄42編寫一個Windows應用程式首先應創(chuàng)建一個或多個窗口,隨後應用程式的運行過程即是窗口內部、窗口與窗口之間、窗口與系統(tǒng)之間進行數(shù)據(jù)處理與數(shù)據(jù)交換的過程。應用程序與用戶之間交互的介面環(huán)境系統(tǒng)管理應用程式的基本單位Win應用程式基本的操作單元43Windows程式設計是針對事件或消息的處理進行
消息是描述事件發(fā)生的資訊(如按下滑鼠或鍵盤)事件驅動編程方法對於編寫互動式程式很有用處,它避免了死板的操作模式Windows程式的執(zhí)行順序取決於事件發(fā)生的順序,程式的執(zhí)行順序是由順序產生的消息驅動的,但是消息的產生往往並不要求有次序之分。(2)事件驅動
44常用句柄類型及其說明句柄是一個4位元組長的數(shù)值,用於標識應用程式中不同的對象和同類對象中不同的實例窗口按鈕圖示滾動條輸出設備控制檔(3)句柄應用程式通過句柄訪問相應的對象資訊HWND 窗口句柄 HDC 設備環(huán)境句柄HBITMAP 位圖句柄 HCURSOR 游標句柄HICON 圖示句柄 HFONT 字體句柄HMENU 菜單句柄 HPEN 畫筆句柄HFILE 檔句柄 HBRUSH 畫刷句柄
HINSTANCE 當前實例句柄45
Windows應用程式利用Windows消息(Message)與應用程式及系統(tǒng)進行資訊交換。typedefstructtagMSG
{HWNDhwnd; 窗口句柄,為null,則可檢索所有駐留在消息佇列中的消息
UINTmessage;消息值,由Windows.h頭檔中的宏定義來標識
WPARAMwParam; 包含有關消息的附加資訊,不同消息其值有所不同
LPARAMlParam;
DWORDtime;指定消息送至佇列的時間
POINTpt;指定消息發(fā)送時螢幕游標的位置,其數(shù)據(jù)類型POINT也是一個結構體}MSG;消息號:由事先定義好的消息名標識字參數(shù)(wParam):用於提供消息的附加資訊長字參數(shù)(lParam):用於提供消息的附加資訊消息附加資訊與具體消息號的值有關,在Win中消息用結構體MSG表示typedefstructtagPOINT{LONGx;
LONGy;}POINT;(4)消息46(4)消息
VC中存在幾種系統(tǒng)定義的消息分類,不同的首碼符號經常用於消息宏識別消息附屬的分類,系統(tǒng)定義的消息宏首碼如下:BM 表示按鈕控制消息CB 表示組合框控制消息DM 表示默認下壓式按鈕控制消息EM 表示編輯控制消息LB 表示列表框控制消息SBM 表示滾動條控制消息WM 表示窗口消息窗口管理消息初始化消息輸入消息系統(tǒng)消息剪貼板消息控制處理消息控制通知消息滾動條通知消息非用戶區(qū)消息MDI消息DDE消息應用程式自定義的消息Windows編程常用消息47二、Windows應用程式常用消息1.WM_LBUTTONDOWN:產生單擊滑鼠左鍵的消息此外,相似的消息還有:WM_LBUTTONUP:放開滑鼠左鍵時產生;WM_RBUTTONDOWN:單擊滑鼠右鍵時產生;WM_RBUTTONUP:放開滑鼠右鍵時產生;WM_LBUTTONDBLCLK:雙擊滑鼠左鍵時產生;WM_RBUTTONDBLCLK:雙擊滑鼠右鍵時產生。lParam高位元組包含當前游標的Y座標值低位元組包含當前游標的X座標值wParam包含一整數(shù)值以標識滑鼠鍵的按下狀態(tài)MK_LBUTTON 按下滑鼠左鍵MK_MBUTTON 按下滑鼠中鍵MK_RBUTTON 按下滑鼠右鍵482.WM_KEYDOWN:按下一個非系統(tǒng)鍵時產生的消息
系統(tǒng)鍵是指實現(xiàn)系統(tǒng)操作的組合鍵,例如Alt與某個功能鍵的組合以實現(xiàn)系統(tǒng)菜單操作等。3.WM_CHAR:按下一個非系統(tǒng)鍵時產生的消息wParam為按鍵的ASCII碼lParam與WM_KEYDOWN的相同wParam:按下鍵的虛擬鍵碼,用以標識按下或釋放的鍵lParam:記錄了按鍵的重複次數(shù)、掃描碼、轉移代碼、先前鍵的狀態(tài)等資訊。相似的消息還有WM_KEYUP,在放開非系統(tǒng)鍵時產生如F1的虛擬鍵碼在Windows.h文件中定義為VK_F1494.WM_CREATE:由CreateWindow函數(shù)發(fā)出的消息wParam:未用lParam:包含一個指向CREATESTRUCT數(shù)據(jù)結構的指針5.WM_CLOSE:關閉窗口時產生的消息wParam和lParam均未用。6.WM_DESTROY:由DestroyWiodow函數(shù)發(fā)出的消息wParam和lParam均未用。507.WM_QUIT:由PostQuitMessage函數(shù)發(fā)出的消息退出應用程式時發(fā)出的消息wParam:含退出代碼,標識程式退出運行時的有關資訊1Param:未用8.WM_PAINT用戶區(qū)移動或顯示用戶窗口改變大小程式通過滾動條滾動窗口下拉式菜單關閉並需要恢復被覆蓋的部分Windows清除對話框等對象,並需要恢復被覆蓋的部分均產生WM_PAINT消息51三、Windows中的事件驅動程式設計啟動輸入姓名輸入第一次測試成績輸入第二次測試成績輸入第三次測試成績計算平均成績結束過程驅動方法計算平均成績啟動消息處理結束輸入姓名輸入第一次成績輸入第二次成績輸入第三次成績計算平均成績事件驅動方法計算平均成績52四、Windows應用程式組成及編程步驟
1.
應用程式的組成一個完整的Windows應用程式通常由五種類型的檔組成。1.C語言根源程式檔2.頭檔 3.模組定義檔 4.資源描述檔 5.專案檔 532.根源程式組成結構入口函數(shù)WinMain窗口函數(shù)WndProcWindows應用程式構成基本框架包含各種數(shù)據(jù)類型、數(shù)據(jù)結構與函數(shù)等1.所有應用程式的入口,類似Main函數(shù),2.完成一系列的定義和初始化,並產生消息迴圈WinMain和WinProc是Windows應用程式的主體54(1)WinMain函數(shù)三個基本的組成部分:函數(shù)說明、初始化和消息迴圈功能註冊窗口類,建立窗口及執(zhí)行必要的初始化進入消息迴圈,據(jù)接受的消息調用相應的處理過程當消息迴圈檢索到WM_QUIT時終止程式運行WinMain函數(shù)WinMain函數(shù)說明WinMain函數(shù)的說明如下:intWINAPIWinMain(
HINSTANCEhThisInst, ∥應用程式當前實例句柄
HINSTANCehPrevInst, ∥應用程式其他實例句柄
LPSTRlpszCmdLine, ∥指向程式命令行參數(shù)的指針
IntnCmdShow ∥應用程式開始執(zhí)行時窗口顯示方式的整數(shù)值標識)注意!Win是多任務管理的,同一應用程式的多個窗口可能會同時存,Win系統(tǒng)對每個窗口的執(zhí)行稱為一個實例,並用一個實例句柄來唯一標識55(2)初始化(a)窗口類定義
通過給窗口類數(shù)據(jù)結構WNDCLASS賦值完成,該數(shù)據(jù)結構中包含窗口類的各種屬性。窗口類定義常用以下函數(shù):LoadIcon的作用是在應用程式中加載一個窗口圖示。其原型為:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName)圖示資源名或系統(tǒng)預定義圖示標識名圖示資源所在的模組句柄,NULL則使用系統(tǒng)預定義圖示初始化顯示窗口創(chuàng)建窗口實例窗口類的註冊:窗口類必須先註冊後使用窗口類的定義:定義窗口的形式與功能LoadIconLoadCursorGetStockObjectRegisterClassCreateWindowShowWindow,UpdateWindow56LoadCursor的作用是在應用程式中加載一個窗口游標HCURSORLoadCursor(HINSTANCEhInstance, LPCTSTRlpCursorName)游標資源所在的模塊句柄,NULL則使用系統(tǒng)預定義游標游標資源名或系統(tǒng)預定義游標標識名應用程式調用函數(shù)GetStockObject獲取系統(tǒng)提供的背景刷HBRUSHGetStockObject(intnBrush);57(b)註冊窗口類Win系統(tǒng)本身提供部分預定義的窗口類,程式員也可以自定義窗口類,窗口類必須先註冊後使用。窗口類的註冊由函數(shù)RegisterClass()實現(xiàn)。
RegisterClass(&wndclass);//wndclass為窗口類結構
RegisterClass函數(shù)的返回為布爾值,註冊成功則返回真58(c)創(chuàng)建窗口實例創(chuàng)建一個窗口類的實例由函數(shù)CreateWindow()實現(xiàn)函數(shù)原型如下:HWNDCreateWindow(
LPCTSTRlpszClassName,∥窗口類名
LPCTSTRlpszTitle, ∥窗口標題名
DWORDdwStyle, ∥創(chuàng)建窗口的樣式
intx,y, ∥窗口左上角座標
intnWidth,nHeight, ∥窗口寬度和度高
HWNDhwndParent, ∥該窗口的父窗口句柄
HMENUhMenu, ∥窗口主菜單句柄
HINSTANCEhInstance,∥創(chuàng)建窗口的應用程式當前句柄
LPVOIDlpParam ∥指向一個傳遞給窗口的參數(shù)值的指針
)5960(d)顯示窗口窗口類的顯示由ShowWindow和UpdateWindow函數(shù)實現(xiàn)。應用程式調用ShowWindow函數(shù)在螢幕上顯示窗口ShowWindow(hwnd,nCmdshow);//nCmdshow為窗口顯示形式標識顯示窗口後,應用程式調用UpdateWindow更新並繪製用戶區(qū),併發(fā)出WM_PAINT消息。
UpdateWindow(hwnd);61(3)消息迴圈消息迴圈的常見格式如下:MSGMsg;…while(GetMessage(&Msg,NULL,0,0)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}將消息的虛擬鍵轉換為字元資訊將消息傳送到指定窗口函數(shù)從消息佇列中讀取一條消息,並將消息放在MSG結構中
其中函數(shù)GetMessage形式為:GetMessage(lpMSG, //指向MSG結構的指針
hwnd,
nMsgFilteMin,//用於消息過濾的最小消息號值
nMsgFilterMax//用於消息過濾的最大消息號值)返回零值,即檢索到WM_QUIT消息,程序結束迴圈並退出將消息傳遞給窗口函數(shù)的相應過程處理消息隊列Windows將產生的消息WinMain函數(shù)622.窗口函數(shù)WinProcWinProc函數(shù)由一個或多個switch語句組成。每一條case語句對應一種消息,當應用程式接收到一個消息時,相應的case語句被啟動並執(zhí)行相應的回應程式模組。WinProc包含了對各種可能接收到的消息的處理過程定義了應用程式對接收到的不同消息的回應63窗口函數(shù)的一般形式如下:LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessgae, WPARAMwParam,LPARAMlParam){
…
switch(message) ∥message為標識的消息
{
case…
…break;
…
caseWM_DESTROY:
PostQuitMessage(0);
default:returnDefWindowProc(hwnd,message,wParam,lParam);
}return(0);}
在消息處理程式段中一般都有對WM_DESTROY的處理,該消息是關閉窗口時發(fā)出的。它向應用程式發(fā)出WM_QUIT消息,請求退出處理函數(shù):
voidPostQuitMessage(intnExitCode)
//nExitCode為應用程式的退出代碼為未定義處理過程的消息提供缺省處理643.數(shù)據(jù)類型
在Windows.h中定義了Windows
應用程式中包含種類繁多的數(shù)據(jù)類型654.一些重要的數(shù)據(jù)結構MSG:包含一個消息的全部資訊,是消息發(fā)送的格式WNDCLASS:包含一個窗口類的全部資訊及屬性POINT:定義了螢幕上或窗口中的一個點的X和Y座標RECT:定義了一個矩形區(qū)域及其左上角和右下角的座標幾種重要的結構66五、應用程式舉例【例2-1】創(chuàng)建應用程式框架。本例的目的在於說明創(chuàng)建Windows應用程式的方法及過程#include<windows.h> //包含應用程式中所需的數(shù)據(jù)類型和數(shù)據(jù)結構的定義LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數(shù)說明//以下初始化窗口類intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){
HWNDhwnd;
MSGMsg;
WNDCLASSwndclass;
charlpszClassName[]="窗口"; //窗口類名
charlpszTitle[]="My_Windows"; //窗口標題名67
//窗口類的定義wndclass.style=0; //窗口類型為缺省類型wndclass.lpfnWndProc=WndProc; //定義窗口處理函數(shù)wndclass.cbClsExtra=0; //窗口類無擴展wndclass.cbWndExtra=0; //窗口實例無擴展wndclass.hInstance=hInstance; //當前實例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化圖示為缺省圖示wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口採用箭頭游標wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); //窗口背景為白色wndclass.lpszMenuName=NULL; //窗口中無菜單wndclass.lpszClassName=lpszClassName; //窗口類名為"窗口"68
//以下進行窗口類的註冊if(!RegisterClass(&wndclass))//如果註冊失敗則發(fā)出警告
{
MessageBeep(0);
returnFALSE;
}//創(chuàng)建窗口
hwnd=CreateWindow (
lpszClassName, //窗口類名
lpszTitle, //窗口實例的標題名
WS_OVERLAPPEDWINDOW, //窗口的風格
CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角座標為缺省值
CW_USEDEFAULT, CW_USEDEFAULT,, //窗口的高和寬為缺省值
NULL, //此窗口無父窗口
NULL, //此窗口無主菜單
hInstance, //創(chuàng)建此窗口的應用程式的當前句柄
NULL //不使用該值
);69//顯示窗口ShowWindow(hwnd,nCmdShow);//繪製用戶區(qū)UpdateWindow(hwnd);//消息循環(huán)
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}returnMsg.wParam; //消息迴圈結束即程式終止時將資訊返回系統(tǒng)}1.GDI的一些基本概念
設備描述表即為設備環(huán)境的屬性的集合應用程式與輸出設備之間的橋樑Win系統(tǒng)外設直接訪問不允許統(tǒng)一的設備環(huán)境(DC)提供使應用程式與設備相連用戶為確保圖形輸出的設備無關性應用程式設備描述表及其屬性通過設備描述表的句柄來間接地存取應用程式每一次圖形操作均參照設備描述表中的屬性執(zhí)行2.圖形刷新圖形刷新是繪圖過程中必須考慮的重要問題刷新請求對刷新請求的回應刷新方法包括(1)刷新請求
應用程式在窗口中繪製了一個橢圓,顏色列表框覆蓋了橢圓的一部分關閉顏色選框後,應用程式需要恢複被覆蓋部分的顏色和形狀窗口大小的調整窗口移動被覆蓋後的恢復(2)系統(tǒng)對刷新請求的回應
當用戶區(qū)的內容需要刷新時,系統(tǒng)向應用程式消息佇列發(fā)送WM_PAINT消息,系統(tǒng)在應用程式的消息佇列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理三種刷新窗口移動後的刷新被覆蓋區(qū)域的刷新對象穿越後的刷新(系統(tǒng)自動完成)用戶區(qū)移動或顯示用戶窗口大小改變程式通過滾動條滾動窗口窗口被另一個窗口覆蓋的恢復如下拉式菜單關閉等游標穿過用戶區(qū)圖示拖過用戶區(qū)窗口被另一個窗口覆蓋的區(qū)域稱為無效區(qū)域。
Windows系統(tǒng)為每個窗口建立了一個PAINTSTRUCT結構,該結構中包含了包圍無效區(qū)域的一個最小矩形的結構RECT,應用程式可以根據(jù)這個無效矩形執(zhí)行刷新操作。
typedefstructtagPAINTSTRUCT{HDChdc; //設備環(huán)境句柄
BOOLfErase; //一般取真值,表示擦除無效矩形的背景
RECTrcPaint; //無效矩形標識
BOOLfRestore; //系統(tǒng)保留
BOOLfIncUpdate; //系統(tǒng)保留
BYTErgbReserved[32];//系統(tǒng)保留
}PAINTSTRUCT;rcPaint為標準的RECT數(shù)據(jù)結構,其作用是標識無效矩形,它包含了無效矩形的左上角和右下角的座標常用的Windows應用程式刷新窗口的方法保存副本。刷新時將副本拷貝到相應的窗口中記錄事件。刷新時重新執(zhí)行這個曾經發(fā)生的事件重新繪製。將圖形繪製處理程式放在消息WM_PAINT回應模組中,刷新時重繪圖形(3)有效的刷新方法3.獲取設備環(huán)境的方法獲取設備環(huán)境是應用程式輸出圖形的先決條件,常用的兩種方法是調用函數(shù)BeginPaint或GetDC(1)調用BeginPaint函數(shù)
應用程式回應WM_PAINT消息進行圖形刷新時,主要通過調用BeginPaint函數(shù)獲取設備環(huán)境
hdc=BeginPaint(hwnd,&ps);//ps為PAINTSTRUCT類型結構定義方式為:PAINTSTRUCTps;
系統(tǒng)獲取設備環(huán)境的同時填寫ps結構,以標識無效矩形區(qū)由BeginPaint函數(shù)獲取的設備環(huán)境要用EndPaint函數(shù)釋放BOOLEndPaint(HWNDhwnd,PAINTSTRUCT&ps)(2)調用GetDC函數(shù)
如果繪圖工作並非由WM_PAINT消息驅動,則調用GetDC函數(shù)獲取設備環(huán)境。hdc=GetDC(hwnd);
由GetDC函數(shù)獲取的設備環(huán)境必須用ReleaseDC函數(shù)釋放
voidReleaseDC(HWNDhwnd);4.映像模式 映像模式定義了將邏輯單位轉化為設備的度量單位以及設備的x方向和y方向,程式員可在一個統(tǒng)一的邏輯坐標系中操作而不必考慮輸出設備的坐標系情況窗口:對應邏輯坐標系上程式員設定的區(qū)域視口:對應實際輸出設備上程式員設定的區(qū)域窗口和視口如何映射?缺省的映射模式將窗口中的對稱圖形映射到視口時仍為對稱圖形按照窗口和視口的座標比例進行映射坐標系統(tǒng)邏輯坐標系統(tǒng)設備坐標系統(tǒng)螢幕坐標系統(tǒng)窗口坐標系統(tǒng)用戶區(qū)坐標系統(tǒng)
應用程式可獲取設備環(huán)境的當前映像模式,並根據(jù)需要設置映像模式。相關函數(shù)設置設備環(huán)境的映像模式SetMapMode(hdc,nMapMode);
nMapMode為映像模式的整型識別字獲取當前設備環(huán)境的映像模式nMapMode=GetMapMode(hdc);窗口區(qū)域的定義由SetWindowExtEx函數(shù)完成,其函數(shù)原型形為:BOOLSetWindowExtEx(HDChdc, intnHeight,nWidth,//以邏輯單位表示的窗口區(qū)域高寬度
LPSIZElpSize,//函數(shù)調用前窗口區(qū)域尺寸的SIZE結構地址);視口區(qū)域的定義由SetViewportExtEx函數(shù)完成,函數(shù)原型為:BOOLSetViewportExtEx(HDChdc, intnHeight,nWidth,//以物理設備單位表示的新視口區(qū)域高寬度LPSIZElpSize );只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義視口的缺省原點和窗口的缺省原點均為(0,0)。可通過調用函數(shù)SetViewportOrgEx和SetWindowOrgEx設定窗口與視口的原點。SetWindowOrgEx函數(shù)的原形為:BOOLSetWindowOrgEx(HDChdc,intX,Y, //以邏輯單位表示的窗口原點座標LPPOINTlpPoint //函數(shù)調用前原點座標的POINT結構的地址);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義二、繪圖工具與顏色1.畫筆(1)畫筆的創(chuàng)建使用畫筆之前必須事先定義一個畫筆句柄。形式如下:HPENhP;然後調用函數(shù)GetStockObject獲取Windows系統(tǒng)定義的四種畫筆例如獲取畫筆BLACK_PEN的形式如下:
hP=GetStockObject(BLACK_PEN);WHITE_PENBLACK_PENDC_PENNULL_PEN畫筆的操作創(chuàng)建畫筆將畫筆選入設備環(huán)境刪除畫筆(2)創(chuàng)建新畫筆,形式如下:hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);創(chuàng)建畫筆後,必須調用SelectObject函數(shù)將其選入設備環(huán)境。
SelectObject(hdc,hP);//hP為所創(chuàng)建或獲取的畫筆句柄不再使用當前畫筆時,需刪除畫筆,以免占記憶體
DeleteObject(hP);PS_DASH: 虛線 PS_DASHDOT: 點劃線 PS_DASHDOTDOT: 雙點劃線PS_DOT: 點線 PS_INSIDEFRAME: 實線PS_NULL: 無 PS_SOLID: 實線2.畫刷畫刷的創(chuàng)建與應用與畫筆很相似,操作畫刷也包括創(chuàng)建、選入設備環(huán)境和刪除。(1)畫刷的創(chuàng)建使用畫刷需事先定義一個畫刷句柄。形式如下:
HBRUSHhBr;//hBr為畫刷句柄
然後調用函數(shù)GetStockObject獲取Windows系統(tǒng)提供的7種畫刷
hBr=(HBRUSH)GetStockObject(nBrushStyle)畫刷樣式BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷 WHITE_BRUSH 白色畫刷指定顏色畫刷如何獲得?可調用函數(shù)CreateSolidBrush和CreateHatchBrush創(chuàng)建畫刷,hBr=CreateSolidBrush(rgbColor);
創(chuàng)建具有指定顏色的單色畫刷創(chuàng)建指定陰影圖案和顏色的畫刷(2)選入設備環(huán)境
創(chuàng)建畫刷後,通過SelectObject(hdc,hBr);將其選入設備環(huán)境(3)刪除畫刷不使用畫刷時,可用DeleteObject(hBr);刪除畫刷,釋放記憶體hBr=CreateHatchBrush(intnHctchStyle,COLORREFrgbColor );HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水準陰影線HS_VERTICAL 垂直陰影線3.顏色
Windows使用宏RGB定義繪圖的顏色,其形式為:
RGB(nRed,nGreen,nBlue)
紅色值藍色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、常用繪圖函數(shù)1.設置畫筆當前位置的函數(shù)MoveToEx,
BOOLMoveToEx(HDChdc,intX,Y, //X、Y分別為新位置的邏輯座標
LPPOINTlpPoint //存放原畫筆位置的POINT結構地址)2.從當前位置向指定座標點畫直線的函數(shù)LineToEx,BOOLLineToEx(HDChdc,intX,intY)//X和Y為線段的終點座標3.從當前位置開始,依次用線段連接lpPoints中指定的各點BOOLPolyline(HDChdc,LPPOINTlpPoints,//指向包含各點座標的POINT結構數(shù)組的指針
intnCount //nCount為POINT數(shù)組中點的個數(shù))4.繪製橢圓弧線的函數(shù)Arc,BOOLArc(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標intX2,intY2, //邊框矩形右下角的邏輯座標intX3,intY3, //橢圓弧起始點座標intX4,intY4 //橢圓弧終止點座標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所畫曲線5.繪製餅圖,並用當前畫刷進行填充BOOLPie(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯座標intX2,intY2, //邊框矩形右下角的邏輯座標intX3,intY3, //橢圓弧起始經線的確定點座標intX4,intY4 //橢圓弧終止經線的確定點座標)(x1,y1)(x2,y2)(x3,y3)(x4,y4)所填區(qū)域6.繪製矩形,並用當前畫刷進行填充BOOLRectangle(HDChdc,intX1,intY1,intX2,intY2)(X1,Y1)和(X2,Y2)分別為矩形的左上角和右下角的邏輯座標7.繪製圓角矩形,並用當前畫刷填充BOOLRoundRect(HDChdc,intX1,intY1,intX2,intY2,
intnHeight,intnWidth)圓角的高度和寬度8.繪製橢圓,並用當前畫刷填充
BOOLEllipse(HDChdc,intX1,intY1,intX2,intY2)9.繪製多邊形,並用當前畫刷填充
BOOLPolygon(HDChdc,LPPOINTlpPoints,intnCount)包含各點座標的POINT數(shù)組的地址多邊形點的個數(shù)四、應用實例【例4-1】利用繪圖函數(shù)創(chuàng)建填充區(qū)。共有三個填充圖形,第一個是用深灰色畫刷填充帶圓角的矩形,第二個是採用亮灰色畫刷填充一個橢圓型圖,第三個是用虛畫刷填充餅形圖。#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc ( HWNDhWnd, UINTiMessage, UINTwParam, LONGlParam );使用虛畫刷填充時,看不出填充效果!!!BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);intWINAPIWinMain //主函數(shù)
(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow){ MSGMessage; if(!InitWindowsClass(hInstance)) returnFALSE; if(!InitWindows(hInstance,nCmdShow)) returnFALSE;
while(GetMessage(&Message,0,0,0)) //消息迴圈
{ TranslateMessage(&Message); DispatchMessage(&Message); } returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam){HDChDC; //定義指向設備的句柄
HBRUSHhBrush; //定義指向畫刷的句柄
HPENhPen; //定義指向畫筆的句柄
PAINTSTRUCTPtStr;//定義指向包含繪圖資訊的結構體變數(shù)消息處理函數(shù)switch(iMessage) //處理消息{caseWM_PAINT:
//處理繪圖消息
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC);//設置映像模式
hPen=(HPEN)GetStockObject(BLACK_PEN); //黑色畫筆
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//畫刷
SelectObject(hDC,hBrush);//選擇畫刷
SelectObject(hDC,hPen);//選擇畫筆
RoundRect(hDC,50,120,100,200,15,15);//繪製圓角矩形
hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//採用亮灰色畫刷下麵只改變畫刷,不改變筆SelectObject(hDC,hBrush); //選擇畫刷
Ellipse(hDC,150,50,200,150); //繪製橢圓
hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH);//虛畫刷
SelectObject(hDC,hBrush); //選擇畫刷
Pie(hDC,250,50,300,100,250,50,300,50); //繪製餅形
EndPaint(hWnd,&PtStr); //結束繪圖
return0;caseWM_DESTROY:
//結束應用程式
PostQuitMessage(0);return0;default: //其他消息處理程式
return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd;
hWnd=CreateWindow("WinFill",//生成窗口
"填充示例程式", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口
UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,"END");WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName="WinFill";WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}例4-2:應用畫筆和畫刷等工具繪製如圖所示的圖形1…#include<windows.h>2…#include<stdlib.h>3…#include<string.h>4…
longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);5…BOOLInitWindowsClass(HINSTANCEhInstance);6…BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);7…//主函數(shù)8…intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)9…{ MSGMessage;10… if(!InitWindowsClass(hInstance)) returnFALSE;11… if(!InitWindows(hInstance,nCmdShow)) returnFALSE;12… while(GetMessage(&Message,0,0,0)) //消息迴圈13… { TranslateMessage(&Message);14… DispatchMessage(&Message);}15… returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)1…{HDChDC; //定義設備環(huán)境句柄2…HBRUSHhBrush; //定義畫刷的句柄3…HPENhPen; //定義畫筆的句柄4…PAINTSTRUCTPtStr; //定義指向包含繪圖資訊的結構體變數(shù)
//定義一個POINT數(shù)組,包括6個點
5…POINTpoints[6]={{100,212},{70,227},{70,250},{130,250},{130,227},{100,212}};6…switch(iMessage) //處理消息
7…{caseWM_PAINT: //處理繪圖消息
8… hDC=BeginPaint(hWnd,&PtStr);9… hPen=(HPEN)GetStockObject(NULL_PEN);//獲取系統(tǒng)定義的空畫筆10… SelectObject(hDC,hPen); //選擇畫筆11… hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);//獲取系統(tǒng)定義的畫刷12… SelectObject(hDC,hBrush); //選擇畫刷13… LineTo(hDC,50,50); //畫線14… DeleteObject(hPen); //刪除畫筆15… hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));//創(chuàng)建畫筆16… SelectObject(hDC,hPen); //選擇畫筆
//畫一個三角形17… LineTo(hDC,150,50);18… LineTo(hDC,100,137);19… LineTo(hDC,50,50);1… Polyline(hDC,points,6); //畫一個五邊形2… Arc(hDC,63,137,138,212,100,137,100,137); //畫一個圓3… Pie(hDC,213,137,288,212,240,137,260,137); //畫一個圓餅4… Rectangle(hDC,213,212,287,250); //畫一個長方形5… RoundRect(hDC,213,100,287,137,20,20);//畫一個圓角長方形6… DeleteObject(hPen);//刪除畫筆7… DeleteObject(hBrush);//刪除畫刷8… EndPaint(hWnd,&PtStr);//結束繪圖9… return0;10…caseWM_DESTROY://結束應用程式11… PostQuitMessage(0);12… return0;13…default://其他消息處理程式14… return(DefWindowProc(hWnd,iMessage,wParam,lParam));}}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{ HWNDhWnd; hWnd=CreateWindow("WinFill", //生成窗口
"填充示例程式", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if(!hWnd) returnFALSE; ShowWindow(hWnd,nCmdShow); //顯示窗口
UpdateWindow(hWnd); returnTRUE;}BOOLInitWindowsClass(HINSTANCEhInstance) //定義窗口類{WNDCLASSWndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,"END");WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WndProc;WndClass.lpszClassName="WinFill";WndClass.lpszMenuName=NULL;WndClass.style=CS_HREDRAW|CS_VREDRAW;returnRegisterClass(&WndClass);}【例4-3】設置映射與使用映射模式。程式的初始階段按模式MM_TEXT繪圖,用戶單擊滑鼠以改變映射模式,單擊左鍵,產生WM_LBUTTONDOWN消息,通知應用程式設置映射模式為ISOTROPIC,並調用InvalidateRect函數(shù)刷新用戶區(qū),在用戶單擊滑鼠右鍵時,產生WM_RBUTTONDOWN消息,應用程式將映射模式設置成ANSIOTROPIC,同時刷新用戶區(qū)。LRESULTCALLBACKWndProc(…,…,…,…){HDChdc;PAINTSTRUCTps;HBRUSHhB1,hB2;switch(message){caseWM_LBUTTONDOWN: //單擊滑鼠左鍵的消息
nMode=MM_ISOTROPIC; //更改映射模式為MM_ISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區(qū)
break;caseWM_RBUTTONDOWN: //單擊滑鼠右鍵消息
nMode=MM_ANISOTROPIC; //更改顯示模式為MM_ANISOTROPIC InvalidateRect(hwnd,NULL,1); //刷新用戶區(qū)
break;caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); //取得設備環(huán)境句柄
SetMapMode(hdc,nMode); //設置映射模式
SetWindowExtEx(hdc,150,150,NULL); //設置窗口區(qū)域
SetViewportExtEx(hdc,150,100,NULL); //設置視口區(qū)域
SetViewportOrgEx(hdc,150,60,NULL); //設置視口原點
hB1=(HBRUSH)GetStockObject(WHITE_BRUSH);//定義白色畫刷
hB2=(HBRUSH)GetStockObject(BLACK_BRUSH);//定義黑色畫刷
SelectObject(hdc,hB1); //將黑白刷選入設備環(huán)境
RoundRect(hdc,0,0,150,150,30,30); //繪製圓角矩形並填充
SelectObject(hdc,hB2); //更改當前畫刷為黑色畫刷
Ellipse(hdc,0,10,150,140); //繪製橢圓並填充
EndPaint(hwnd,&ps); //釋放設備環(huán)境句柄
DeleteObject(hB1); //刪除畫刷句柄
DeleteObject(hB2); break;caseWM_DESTROY: PostQuitMessage(0); break;default: returnDefWindowProc(hwnd,message,wParam,lParam);}return0;}【例4-4】編寫一個程式,在螢幕上出現(xiàn)一個圓心沿正弦曲線軌跡移動的實心圓,而且,每隔四分之一週期,圓的填充色和圓的周邊顏色都發(fā)生變化,同時,圓的半徑在四分之一週期之內由正弦曲線幅值的0.2倍至0.6倍線性增長。(1)正弦曲線是此題的基礎。在WndMain()函數(shù)消息迴圈前,生成正弦曲線各點的座標。把正弦曲線一個週期的橫坐標分成100個等分點,存儲在數(shù)組lpSin[100]中,100個點的座標計算如下:for(intj=0;j<100;j++) //生成正弦曲線的點座標
{ lpSin[j].x=(long)(j*2*Pi/100*60); lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));}(2)動態(tài)顯示圓在正弦曲線上移動數(shù)組lpSin[100]的長度為100設定圓在正弦曲線移動時共有100個位置數(shù)組中每一個值是圓移動時圓心的座標每四分之一週期有25個位置i<=25 處於第1個1/4週期,創(chuàng)建紅色畫筆和畫刷;25<i<50 處於第2個1/4週期,創(chuàng)建綠色畫筆和畫刷;50<i<75 處於第3個1/4週期,創(chuàng)建藍色畫筆和畫刷;75<i<100 處於第4個1/4週期,創(chuàng)建黃色畫筆和畫刷;if(i<=25) //第一個1/4週期{hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑}在消息WM_PAINT處理程式中,調用函數(shù)BeginPaint()獲得設備環(huán)境句柄。由此經過線性差分計算圓半徑的大小lRadious,第1個1/4週期的程式代碼如下:創(chuàng)建的畫筆和畫刷選入設備環(huán)境後,調用函數(shù)Ellipse(…)繪製圓形下麵這段代碼是動態(tài)顯示的關鍵:
Sleep(100); //停0.1秒
if(i<100)InvalidateRect(hWnd,NULL,1);//刷新用戶區(qū)調用Sleep(100)函數(shù)使程式暫停0.1秒。所含參數(shù)100代表暫停的時間,使用毫秒作單位。i<100時調用函數(shù)刷新用戶區(qū)發(fā)送WM_PAINT消息消息發(fā)到的窗口的句柄代表刷新整個用戶區(qū)代表清除用戶區(qū)中所有的顯示內容#include<windows.h>#include<stdlib.h>#include<string.h>#include<math.h>#definePi3.1415926longWINAPIWndProc(HWNDhWnd,UINTiMessage, UINTwParam,LONGlParam);doubledfTheta=0,dfRange=100.0; //正弦曲線的角度變數(shù).longi=0,j=0;longlCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange); //定義圓心座標和圓半徑.POINTlpSin[100]; //定義正弦曲線的點座標.intWINAPIWinMain(…,…,…,...){ ……//填寫窗口類屬性
if(!RegisterClass(&WndClass)) //註冊窗口. { MessageBeep(0); returnFALSE;}hWnd=CreateWindow ("SIN", //窗口類名. "4_6", //標題名.
WS_OVERLAPPEDWINDOW, //帶標題欄,最大/小按鈕的窗口
CW_USEDEFAULT, //窗口左上角座標. 0, CW_USEDEFAULT, //採用缺省的寬度和高度. 0, NULL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物質能源在建筑材料的研發(fā)與應用考核試卷
- 影視錄放設備的D打印技術應用考核試卷
- 初中數(shù)學聽課記錄
- 小學一年級下冊數(shù)學100以內口算綜合集錦
- 臨床肝膽胰脾影像診斷
- 上海紐約大學《亞洲地理及歷史》2023-2024學年第二學期期末試卷
- 四川省攀枝花市鹽邊縣2024-2025學年三下數(shù)學期末教學質量檢測模擬試題含解析
- 湘南學院《錄音藝術與聲音剪輯》2023-2024學年第一學期期末試卷
- 石家莊幼兒師范高等??茖W?!豆こ谭治龀绦蛟O計》2023-2024學年第二學期期末試卷
- 山西省太原市2024-2025學年五下數(shù)學期末經典試題含答案
- 第36講 第二次世界大戰(zhàn)與戰(zhàn)后國際秩序的形成
- 紡織創(chuàng)新材料的應用
- 北師版小學六年級下學期《數(shù) 學 好 玩》教案
- 醫(yī)院培訓課件:《靜脈中等長度導管臨床應用專家共識》
- 新生兒科護理文書
- 奇特的視覺圖形 課件 -2023--2024學年浙教版初中美術八年級下冊
- 《公路橋梁施工監(jiān)控技術規(guī)程》(JTGT3650-01-2022)
- 人教版高中地理必修第二冊第二章鄉(xiāng)村和城鎮(zhèn)
- 花籃拉桿式懸挑式腳手架施工施工工藝技術
- 廣西壯族自治區(qū)貴港市覃塘區(qū)2023-2024學年七年級下學期7月期末歷史試題(無答案)
- 食堂生物防治制度
評論
0/150
提交評論