版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual C+面向?qū)ο缶幊?Visual C+ Object Oriented Programming 第第9章章 圖形繪制圖形繪制l圖形處理的基本原理圖形處理的基本原理圖形設(shè)備接口圖形設(shè)備接口設(shè)備環(huán)境設(shè)備環(huán)境GDI坐標系坐標系映射模式映射模式l使用畫筆和畫刷繪制圖形使用畫筆和畫刷繪制圖形l文本與字體文本與字體l位圖、圖標和光標位圖、圖標和光標 第第9章章 圖形繪制圖形繪制內(nèi)容提要內(nèi)容提要 Windows是一個圖形操作系統(tǒng),其所有的圖形可視效果都是通過繪制操作而完成的。圖形顯示的實質(zhì)就是利用Windows提供的圖形設(shè)備接口將圖形繪制在顯示器上。大多數(shù)應(yīng)用程序都需要在客戶區(qū)繪制一些圖形,如繪
2、制文本、幾何圖形、位圖和光標等。 前面幾章已經(jīng)涉及到有關(guān)圖形處理的內(nèi)容,只是使用了Windows系統(tǒng)默認的圖形設(shè)備接口和設(shè)備環(huán)境,繪制的圖形沒有顏色、線型和字體的變化。lWindows提供了一個稱為圖形設(shè)備接口GDI(Graphics Device Interface)的抽象接口。GDI作為Windows的重要組成部分,它負責管理用戶繪圖操作時功能的轉(zhuǎn)換。用戶通過調(diào)用GDI函數(shù)與設(shè)備打交道,GDI通過不同設(shè)備提供的驅(qū)動程序?qū)⒗L圖語句轉(zhuǎn)換為對應(yīng)的繪圖指令,避免了直接對硬件進行操作,從而實現(xiàn)所謂的設(shè)備無關(guān)性。l編程時采用MFC方法繪制圖形也很方便,MFC對GDI函數(shù)和繪圖對象進行了封裝。 l圖形設(shè)
3、備接口GDI管理Windows應(yīng)用程序圖形的繪制,在應(yīng)用程序中,通過調(diào)用GDI函數(shù)繪制不同尺寸、顏色、風格的幾何圖形、文本和位圖。這些圖形處理函數(shù)組成了圖形設(shè)備接口GDI。 l GDI是形成Windows核心的動態(tài)鏈接庫之一,MFC將GDI函數(shù)封裝在一個名為CDC的設(shè)備環(huán)境類中,可以通過調(diào)用CDC類的成員函數(shù)來完成繪圖操作。 l所謂設(shè)備無關(guān)性,是指操作系統(tǒng)屏蔽了硬件設(shè)備的差異,使用戶編程時一般無需考慮設(shè)備的類型,如不同種類的顯示器或打印機。 GDI處于設(shè)備驅(qū)動程序的上一層,當程序調(diào)用繪圖函數(shù)時,GDI將繪圖命令傳送給當前設(shè)備的驅(qū)動程序,以調(diào)用驅(qū)動程序提供的接口函數(shù)。驅(qū)動程序的接口函數(shù)將Wind
4、ows繪圖命令轉(zhuǎn)化為設(shè)備能夠執(zhí)行的輸出命令,實現(xiàn)圖形的繪制。不同設(shè)備具有不同的驅(qū)動程序,設(shè)備驅(qū)動程序是設(shè)備相關(guān)的。l為了實現(xiàn)設(shè)備無關(guān)性,應(yīng)用程序的輸出不直接面向顯示器等物理設(shè)備,而是面向一個稱之為設(shè)備環(huán)境DC(Device Context)的虛擬邏輯設(shè)備。l設(shè)備環(huán)境也稱設(shè)備描述表或設(shè)備上下文,它是由Windows管理的一個數(shù)據(jù)結(jié)構(gòu),它保存了繪圖操作中一些共同需要設(shè)置的信息,如當前的畫筆、畫刷、字體和位圖等圖形對象及其屬性,以及顏色和背景等影響圖形輸出的繪圖模式。l形象地說,一個設(shè)備環(huán)境提供了一張畫布和一些繪畫的工具,我們可以使用不同顏色的工具在上面繪制點、線、圓和文本。l設(shè)備環(huán)境中的“設(shè)備”是
5、指任何類型的顯示器或打印機等輸出設(shè)備,繪圖時用戶不用關(guān)心所使用設(shè)備的編程原理和方法。所有的繪制操作必須通過設(shè)備環(huán)境進行間接的處理,Windows自動將設(shè)備環(huán)境所描述的結(jié)構(gòu)映射到相應(yīng)的物理設(shè)備上。l從根本上來說,設(shè)備環(huán)境DC是一個Windows數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)存儲著程序向設(shè)備輸出時所需要的信息,應(yīng)用程序利用它定義圖形對象及其屬性,并實現(xiàn)應(yīng)用程序、設(shè)備驅(qū)動程序和輸出設(shè)備之間繪圖命令的轉(zhuǎn)換。l在Windows中不使用DC無法進行輸出,在使用任何GDI繪圖函數(shù)之前,必須建立一個設(shè)備環(huán)境。獲取設(shè)備環(huán)境獲取設(shè)備環(huán)境DC的方法:的方法: l在程序中不能直接存取DC數(shù)據(jù)結(jié)構(gòu),只能通過系統(tǒng)提供的一系列函數(shù)或使用
6、設(shè)備環(huán)境的句柄HDC來間接地獲取或設(shè)置設(shè)備環(huán)境結(jié)構(gòu)中的各項屬性,如顯示器高度和寬度、支持的顏色數(shù)及分辨率等。l如果采用SDK方法編程,獲取DC的方法有兩種:在WM_PAINT消息處理函數(shù)中通過調(diào)用API函數(shù)BeginPaint()獲取設(shè)備環(huán)境,在消息處理函數(shù)返回前調(diào)用API函數(shù)EndPaint()釋放設(shè)備環(huán)境。在其他函數(shù)中通過調(diào)用API函數(shù)GetDC()獲取設(shè)備環(huán)境,調(diào)用API函數(shù)ReleaseDC()釋放設(shè)備環(huán)境。l如果采用MFC方法編程,MFC提供了不同類型的DC類,每一個類都封裝了DC句柄,并且它們的構(gòu)造函數(shù)自動調(diào)用獲取DC的API函數(shù),析構(gòu)函數(shù)自動調(diào)用釋放DC的API函數(shù)。因此,在程序
7、中通過聲明一個MFC設(shè)備環(huán)境類的對象就自動獲取了一個DC,而當該對象被銷毀時就自動釋放了獲取的DC。MFC AppWizard應(yīng)用程序向?qū)?chuàng)建的OnDraw()函數(shù)自動支持所獲取的DC。lMFC的DC類包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC類是MFC設(shè)備環(huán)境類的基類,其它的MFC設(shè)備環(huán)境類都是CDC的派生類。 lCDC類既作為其它MFC設(shè)備環(huán)境類的基類,又可以作為一個一般的設(shè)備環(huán)境類使用??梢栽L問設(shè)備屬性和設(shè)置繪圖屬性,對GDI的所有繪圖函數(shù)進行了封裝。lCPaintDC類是OnPaint()函數(shù)使用的設(shè)備環(huán)境類,它代表一個窗
8、口的繪圖畫面。如果添加WM_PAINT消息處理函數(shù)OnPaint(),就需要使用CPaintDC類來定義一個設(shè)備環(huán)境對象。 lCClientDC類代表了客戶區(qū)設(shè)備環(huán)境。當在客戶區(qū)實時繪圖時,需要利用CClientDC類定義一個客戶區(qū)設(shè)備環(huán)境。lCWindowDC類代表了整個程序窗口設(shè)備環(huán)境,可以在整個窗口區(qū)域繪圖。 lWindows坐標系分為邏輯坐標系和設(shè)備坐標系兩種,GDI支持這兩種坐標系。一般而言,GDI的文本和圖形輸出函數(shù)使用邏輯坐標,而在客戶區(qū)移動或按下鼠標的鼠標位置是采用設(shè)備坐標。 l邏輯坐標系是面向DC的坐標系,這種坐標不考慮具體的設(shè)備類型,在繪圖時,Windows會根據(jù)當前設(shè)置的
9、映射模式將邏輯坐標轉(zhuǎn)換為設(shè)備坐標。l設(shè)備坐標系是面向物理設(shè)備的坐標系,這種坐標以像素或設(shè)備所能表示的最小長度單位為單位,X軸方向向右,Y軸方向向下。設(shè)備坐標系的原點位置(0, 0)不限定在設(shè)備顯示區(qū)域的左上角。l設(shè)備坐標系分為屏幕坐標系、窗口坐標系和客戶區(qū)坐標系三種相互獨立的坐標系。l屏幕坐標系以屏幕左上角為原點,一些與整個屏幕有關(guān)的函數(shù)均采用屏幕坐標,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。彈出式菜單使用的也是屏幕坐標。l窗口坐標系以窗口左上角為坐標原點,它包括窗口標題欄、菜單欄和工具欄等范圍。l客戶區(qū)坐標系以窗口
10、客戶區(qū)左上角為原點,主要用于客戶區(qū)的繪圖輸出和窗口消息的處理。鼠標消息的坐標參數(shù)使用客戶區(qū)坐標,CDC類繪圖成員函數(shù)使用與客戶區(qū)坐標對應(yīng)的邏輯坐標。l編程時,有時需要根據(jù)當前的具體情況進行三種設(shè)備坐標之間或與邏輯坐標的相互轉(zhuǎn)換。lMFC提供了兩個函數(shù)CWnd:ScreenToClient()和CWnd: ClientToScreen()用于屏幕坐標與客戶區(qū)坐標之間的相互轉(zhuǎn)換。lMFC提供了兩個函數(shù)CDC:DPtoLP()和CDC: LPtoDP()用于設(shè)備坐標與邏輯坐標之間的相互轉(zhuǎn)換。 Windows鼠標位置使用設(shè)備坐標系,以客戶區(qū)窗口原點作為基準,而在OnDraw()函數(shù)中使用邏輯坐標。為了
11、在滾動視圖中重繪圖形,必須在存儲線段起點和終點之前將其坐標轉(zhuǎn)換為邏輯坐標。OnDraw()函數(shù)由OnPaint()函數(shù)調(diào)用,在調(diào)用OnDraw()函數(shù)前,OnPaint()函數(shù)已經(jīng)調(diào)用了函數(shù)OnPrepareDC()對設(shè)備環(huán)境進行了調(diào)整。 打開應(yīng)用程序項目MyDraw,修改單擊鼠標和鼠標移動的消息處理函數(shù)。void CMyDrawView:OnLButtonDown( UINT nFlags, CPoint point) / TODO: Add your message handler code here . . . CClientDC dc(this);OnPrepareDC(&dc
12、); / 調(diào)整設(shè)備環(huán)境的屬性調(diào)整設(shè)備環(huán)境的屬性dc.DPtoLP(&point); / 將設(shè)備坐標轉(zhuǎn)換為邏輯坐標將設(shè)備坐標轉(zhuǎn)換為邏輯坐標SetCapture(); / 捕捉鼠標:SetCursor(m_hCross); / 設(shè)置十字光標m_ptOrigin=point;m_bDragging=TRUE; / 設(shè)置拖拽標記/CScrollView:OnLButtonDown(nFlags, point);void CMyDrawView:OnMouseMove(UINT nFlags, CPoint point) if(m_bDragging) CMyDrawDoc *pDoc=GetD
13、ocument(); ASSERT_VALID(pDoc);CClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);pDoc-AddLine(m_ptOrigin, point); dc.MoveTo(m_ptOrigin); dc.LineTo(point);m_ptOrigin=point; /CScrollView:OnMouseMove(nFlags, point);l映射模式確定了在繪制圖形時所依據(jù)的坐標系,它定義了邏輯單位的實際大小、坐標增長方向,所有映射模式的坐標原點均在設(shè)備輸出區(qū)域(如客戶區(qū)或打印區(qū))的左上角。
14、此外,對于某些映射模式,用戶還可以自定義窗口的長度和寬度,設(shè)置視圖區(qū)的物理范圍。lWindows定義了8種映射模式:MM_TEXT、MM_ LOMETRIC、MM_HIMETRIC、MM_LOE- NGLISH、MM_HIENGLISH、MM_TWIPS、MM _ISOTROPIC、MM_ANISOTROPICl映射模式使得程序員可不必考慮輸出設(shè)備的具體設(shè)備坐標系,而在一個統(tǒng)一的邏輯坐標系中進行圖形的繪制。 映射模式映射模式邏輯單位邏輯單位坐標系設(shè)定坐標系設(shè)定MM_TEXT一個像素X軸正方向朝右,Y軸正方向朝下MM_LOMETRIC0.1毫米X軸正方向朝右,Y軸正方向朝上MM_HIMETRIC
15、0.01毫米X軸正方向朝右,Y軸正方向朝上MM_LOENGLISH0.01英寸X軸正方向朝右,Y軸正方向朝上MM_HIENGLISH0.001英寸X軸正方向朝右,Y軸正方向朝上MM_TWIPS1/1440英寸X軸正方向朝右,Y軸正方向朝上MM_ISOTROPIC系統(tǒng)確定X、Y軸可任意調(diào)節(jié),X、Y軸比例為1:1MM_ANISOTROPIC系統(tǒng)確定X、Y軸可任意調(diào)節(jié),X、Y軸比例任意l通過調(diào)用函數(shù)CDC:SetWindowOrg()設(shè)置設(shè)備環(huán)境的窗口原點的坐標,調(diào)用CDC:SetViewportOrg()重新設(shè)置設(shè)備的視口原點的坐標。這里,窗口是對應(yīng)于邏輯坐標系(設(shè)備環(huán)境)由用戶設(shè)定的一個區(qū)域,而
16、視口是對應(yīng)于實際輸出設(shè)備由用戶設(shè)定的一個區(qū)域。l窗口原點是指邏輯窗口坐標系的原點在視口(設(shè)備)坐標系中的位置,視口原點是指設(shè)備實際輸出區(qū)域的原點。l除了映射模式,窗口和視口也是決定一個點的邏輯坐標如何轉(zhuǎn)換為設(shè)備坐標的一個因素。一個點的邏輯坐標按照如下式子轉(zhuǎn)換為設(shè)備坐標: 設(shè)備(視口)坐標設(shè)備(視口)坐標 = 邏輯坐標邏輯坐標 窗口原點坐標窗口原點坐標 + 視口原點坐標視口原點坐標(1)pDC-SetMapMode(MM_TEXT); pDC-Rectangle(CRect(50, 50, 100, 100);(2)pDC-SetMapMode(MM_TEXT); pDC-SetWindowOr
17、g(50, 50);pDC-Rectangle(CRect(50, 50, 100, 100);(3)pDC-SetMapMode(MM_TEXT); pDC-SetViewportOrg(50,50);pDC-Rectangle(CRect(50, 50, 100, 100);(4)pDC-SetMapMode(MM_TEXT); pDC-SetViewportOrg(50,50);pDC-SetWindowOrg(50, 50);pDC-Rectangle(CRect(50, 50, 100, 100);lWindows用COLORREF類型的數(shù)據(jù)存放顏色,是一個32位整數(shù)。任何一種顏色都
18、是由紅、綠、藍三種基本顏色組成,COLORREF類型數(shù)據(jù)的低位字節(jié)存放紅色強度值,第2個字節(jié)存放綠色強度值,第3個字節(jié)存放藍色強度值,高位字節(jié)為0,顏色分量的取值范圍為0到255。 l直接設(shè)置COLORREF數(shù)據(jù)不太方便,Windows提供了RGB宏用于設(shè)置顏色,將其中的紅、綠、藍分量值轉(zhuǎn)換為COLORREF類型的顏色數(shù)據(jù): RGB(byRed, byGreen, byBlue) 其中參數(shù)byRed、byGreen和byBlue分別表示紅、綠、藍分量值(范圍0到255)。 很多涉及到顏色的GDI函數(shù)都需要使用COLORREF類型的參數(shù),如設(shè)置背景色的成員函數(shù)CDC:SetBkColor()、設(shè)
19、置文本顏色的成員函數(shù)CDC:SetTextColor()。例如: COLORREF rgbBkClr=RGB(192,192,192);/ 定義灰色 pDC-SetBkCorlor(rgbBkClr);/ 背景色為灰色 pDC-SetTextColor(RGB(0,0,255);/ 文本顏色為蘭色顏色顏色RGB分量值分量值顏色顏色RGB分量值分量值淺紅255,0,0深紅128,0,0淺綠0,255,0深綠0,128,0淺藍0,0,255深藍0,0,128淺黃255,255,0深黃128,128,0淺青0,255,255深青0,128,128紫色255,0,255灰色192,192,192白色2
20、55,255,255黑色0,0,0l在默認狀態(tài)下,當用戶創(chuàng)建一個設(shè)備環(huán)境并在其中繪圖時,系統(tǒng)使用設(shè)備環(huán)境缺省的繪圖工具及其屬性。如果要使用不同風格和顏色的繪圖工具進行繪圖,用戶必須重新為設(shè)備環(huán)境設(shè)置自定義的畫筆和畫刷等繪圖工具。l畫筆和畫刷是Windows中兩種最重要的繪圖工具,畫筆用于繪制點、線、矩形和橢圓等幾何圖形,畫刷用指定的顏色和圖案來填充繪圖區(qū)域,這些繪圖工具又統(tǒng)稱為GDI對象。 lWindows GDI提供了一些繪圖對象,程序通過這些GDI對象設(shè)置繪圖的工具和風格,這里的對象是指Windows數(shù)據(jù)結(jié)構(gòu),而不是C+類的對象。lGDI對象是Windows圖形設(shè)備接口的抽象繪圖工具。除了
21、畫筆和畫刷,GDI對象還包括字體、位圖和調(diào)色板。lMFC對GDI對象進行了很好的封裝,提供了封裝GDI對象的類,如CPen、CBrush、CFont、CBitmap和CPalette等,這些類都是GDI對象類CGdiObject的派生類。 CDC類提供了成員函數(shù)SelectObject()選擇用戶自己創(chuàng)建的GDI對象,該函數(shù)有多種重載形式,可以選擇定制好的畫筆、畫刷、字體和位圖等不同類型的GDI對象。 CPen* SelectObject(CPen* pPen); CBrush* SelectObject(CBrush* pBrush); virtual CFont* SelectObject
22、(CFont* pFont); CBitmap* SelectObject(CBitmap* pBitmap); 函數(shù)參數(shù)是一個指向用戶已定制好的GDI對象的指針,選擇操作成功函數(shù)將返回以前GDI對象的指針,否則返回NULL。 當用戶創(chuàng)建一個用于繪圖的設(shè)備環(huán)境時,該設(shè)備環(huán)境自動提供了一個寬度為一個像素單位、風格為實黑線(BLACK_PEN)的缺省畫筆。如果要在設(shè)備環(huán)境使用自己的畫筆繪圖,首先需要創(chuàng)建一個指定風格的畫筆,然后將創(chuàng)建的畫筆選入設(shè)備環(huán)境,最后,在使用該畫筆繪圖結(jié)束后需要釋放該畫筆。 1. 創(chuàng)建畫筆創(chuàng)建畫筆 創(chuàng)建畫筆最簡單的方法是調(diào)用CPen類的一個帶參數(shù)的構(gòu)造函數(shù)來構(gòu)造一個CPen類
23、畫筆對象,以下代碼創(chuàng)建了一個紅色虛線畫筆: CPen PenNew (PS_DASH, 1, RGB(255, 0, 0); 創(chuàng)建畫筆的第二種方法是首先構(gòu)造一個沒有初始化的CPen類畫筆對象,然后調(diào)用成員函數(shù)CPen:CreatePen()創(chuàng)建定制的畫筆工具: CPen PenNew; PenNew.CreatePen(PS_DASH, 1, RGB(255,0,0); 函數(shù)CreatePen()的參數(shù)類型與帶參數(shù)的CPen類構(gòu)造函數(shù)完全一樣。當畫筆對象的聲明與創(chuàng)建不在同一個地方時(如需要多次改變畫筆)只有采用這種方法。 樣樣 式式說說 明明樣樣 式式說說 明明PS_SOLID實線PS_DAS
24、HDOTDOT雙點劃線PS_DOT點線PS_NULL空的邊框PS_DASH虛線PS_INSIDEFRAME邊框?qū)嵕€PS_DASHDOT點劃線 創(chuàng)建畫筆后必須調(diào)用成員函數(shù)CDC: SelectObject()將創(chuàng)建的畫筆選入當前設(shè)備環(huán)境。如果選擇成功,函數(shù)SelectObject()將返回以前畫筆對象的指針。選擇新的畫筆時應(yīng)該保存以前的畫筆對象,如下代碼所示:CPen* pPenOldpPenOld =pDC-SelectObject(&PenNew); 創(chuàng)建和選擇畫筆工具后,應(yīng)用程序就可以使用該畫筆繪圖。當繪圖完成后,應(yīng)該通過調(diào)用成員函數(shù)CDC: SelectObject()恢復(fù)設(shè)備環(huán)
25、境以前的畫筆工具,并通過調(diào)用成員函數(shù)CGdiObject:DeleteObject()釋放GDI對象所占的內(nèi)存資源,如下代碼所示: pDC-SelectObject(pPenOld);/ 恢復(fù)設(shè)備環(huán)境DC中原來的畫筆 PenNew.DeleteObject();/ 刪除底層的GDI對象在OnDraw()函數(shù)中添加如下所示的代碼:CPen *pPenOld, PenNew;int nPenStyle= PS_SOLID, / 實線 PS_DOT, / 點線PS_DASH, / 虛線PS_DASHDOT, / 點劃線PS_DASHDOTDOT, / 雙點劃線 PS_NULL, / 空的邊框PS_I
26、NSIDEFRAME, / 邊框?qū)嵕€;char *strStyle=Solid,Dot,Dash,DashDot, DashDotDot,Null,InsideFrame;pDC-TextOut(60,10,用不同樣式的畫筆繪圖); for(int i=0; iSelectObject(&PenNew); / 選擇畫筆 pDC-TextOut(10,30+20*i,strStylei);pDC-MoveTo(100,40+20*i);pDC-LineTo(200,40+20*i);pDC-SelectObject(pPenOld); / 恢復(fù)原來的畫筆PenNew.DeleteObje
27、ct(); / 刪除底層的GDI對象 else MessageBox(不能創(chuàng)建畫筆!); char *strWidth=1,2,3,4,5,6,7;pDC-TextOut(260,10,用不同寬度的畫筆繪圖);for(i=0; iSelectObject(&PenNew); / 選擇畫筆pDC-TextOut(260,30+20*i,strWidthi);pDC-MoveTo(300,40+20*i);pDC-LineTo(400,40+20*i);pDC-SelectObject(pPenOld); / 恢復(fù)原來的畫筆PenNew.DeleteObject(); / 刪除底層的GDI
28、對象 else MessageBox(不能創(chuàng)建畫筆!); char *strColor=紅,綠,藍,黃,紫,青,灰; COLORREF rgbPenClr=RGB(255,0,0),RGB(0,255,0), RGB(0,0,255),RGB(255,255,0),RGB(255,0,255), RGB(0,255,255),RGB(192,192,192); pDC-TextOut(460,10,用不同顏色的畫筆繪圖); for(i=0; iSelectObject(pPenNew); / 選擇創(chuàng)建的畫筆pDC-TextOut(460,30+20*i, strColori);pDC-Move
29、To(500,40+20*i);pDC-LineTo(600,40+20*i);pDC-SelectObject(pPenOld); / 恢復(fù)原來的畫筆delete pPenNew; / 自動刪除底層的GDI對象 l當創(chuàng)建一個設(shè)備環(huán)境時,該設(shè)備環(huán)境自動提供了一個填充色為白色(WHITE_BRUSH)的缺省畫刷。與畫筆一樣,也可以利用MFC畫刷類CBrush創(chuàng)建自己的畫刷,用于填充圖形的繪制。l畫刷有三種基本類型:純色畫刷、陰影畫刷和圖案畫刷,CBrush類提供了多個不同重載形式的構(gòu)造函數(shù)。以下創(chuàng)建三種不同類型的畫刷:CBrush brush1(RGB(255,0,0);/ 創(chuàng)建純色畫刷CBru
30、sh brush2(HS_DIAGCROSS, RGB(0,255,0); / 創(chuàng)建陰影畫刷CBrush brush3(&bmp);/ 創(chuàng)建圖案畫刷l創(chuàng)建畫刷也可先構(gòu)造一個沒有初始化的CBrush類畫刷對象,然后調(diào)用CBrush類的初始化成員函數(shù)創(chuàng)建定制的畫刷工具。lCBrush類提供的常用創(chuàng)建函數(shù)有:CreateSolidBrush()用指定的顏色創(chuàng)建一個純色畫刷;CreateHatchBrush()用指定的陰影 樣式和顏色創(chuàng)建一個陰影畫刷;CreatePatternBrush()用位圖創(chuàng)建一個圖案畫刷;CreateSysColorBrush()用系統(tǒng)默認顏色創(chuàng)建一個指定陰影樣式的畫
31、刷。l如下代碼創(chuàng)建了一個填充色為紅色、圖案為垂直相交陰影線的畫刷: CBrush BrushNew; BrushNew.CreateHatchBrush(HS_CROSS, RGB(255, 0, 0);1建立一個基于對話框的應(yīng)用程序UseBrush,為對話框類CUseBrushDlg添加一個CBrush類型的成員變量m_BrushBkClr。在對話框初始化成員函數(shù)OnInitDialog()中創(chuàng)建一個自定義顏色的畫刷。BOOL CUseBrushDlg:OnInitDialog() . . . . . . / TODO: Add extra initialization here m_Bru
32、shBkClr.CreateSolidBrush(RGB(0,0,255); / 創(chuàng)建一個藍色畫刷 return TRUE; / return TRUE unless you set the focus . . .2利用ClassWzard為對話框類CUseBrushDlg添加WM_ CTLCOLOR的消息處理函數(shù),返回用戶自己創(chuàng)建的畫刷m_BrushBkClr。HBRUSH CUseBrushDlg:OnCtlColor(CDC* pDC,CWnd* pWnd, UINT nCtlColor) /HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlC
33、olor); / 不使用缺省的畫刷/ TODO: Return a different brush if the default . . .return m_BrushBkClr;lWindows預(yù)定義了一些簡單風格的GDI對象,用戶使用這些GDI對象時,無需自己創(chuàng)建它們,可以直接將它們選入當前的設(shè)備環(huán)境,這些GDI對象稱作為堆(堆(Stock)對象對象。堆對象包括堆畫筆、堆畫刷和堆字體等。l通過調(diào)用成員函數(shù)CDC:SelectStockObject()可以選擇一個堆對象繪圖工具,以下代碼將堆畫筆和堆畫刷作為當前的繪圖工具:pPenOld=(CPen*) pDC-SelectStockObje
34、ct(NULL_PEN); / 使用堆畫筆對象pBrhOld=(CBrush*) pDC-SelectStockObject(LTGRAY _BRUSH);/ 使用堆畫刷對象樣樣 式式說說 明明樣樣 式式說說 明明BLACK_PEN黑色畫筆WHITE_PEN白色畫筆NULL_PEN空畫筆BLACK_BRUSH黑色畫刷WHITE_BRUSH白色畫刷NULL_BRUSH空畫刷GRAY_BRUSH灰色畫刷DKGRAY_BRUSH深灰色畫刷LTGRAY_BRUSH淺灰色畫刷HOLLOW_BRUSH虛畫刷 也可以利用CGdiObject:CreateStockObject()將GDI對象設(shè)置成指定的堆對
35、象,這時需要首先聲明一個GDI對象,最后還需要調(diào)用函數(shù)SelectObject()將與堆對象關(guān)聯(lián)的GDI對象選入當前的設(shè)備環(huán)境,如下代碼所示:CBrush *pBrhOld, BrhNew;BrhNew.CreateStockObject(LTGRAY_BRUSH); / 設(shè)置堆畫刷對象pBrhOld= pDC-SelectObject(&BrhNew); 利用MFC AppWizard向?qū)?chuàng)建一個SDI應(yīng)用程序UseStock,利用ClassWizard為類CUseStockView添加WM_PAINT消息處理函數(shù)OnPaint():void CUseStockView:OnPain
36、t() CPaintDC dc(this); / device context for painting / TODO: Add your message handler code here CPen *pPenOld, PenNew; CBrush *pBrhOld, BrhNew; pPenOld=(CPen*)dc.SelectStockObject(BLACK_PEN); / 使用堆畫筆對象 pBrhOld=(CBrush*)dc.SelectStockObject(GRAY_BRUSH); / 使用堆畫刷對象 dc.Rectangle(100,100,300,300); PenNew
37、.CreateStockObject(NULL_PEN); / NULL_PEN用于繪制無邊界的填充圖形 dc.SelectObject(&PenNew); BrhNew.CreateStockObject(LTGRAY_BRUSH); dc.SelectObject(&BrhNew); dc.Ellipse(400,100,600,200); dc.SelectObject(pPenOld); / 恢復(fù)系統(tǒng)默認的GDI對象 dc.SelectObject(pBrhOld); dc.Ellipse(400,210,600,310);/ Do not call CView:OnP
38、aint() for painting messagesl生成設(shè)備環(huán)境、設(shè)置繪圖屬性和選擇繪圖工具后,就可以開始繪制不同形狀的幾何圖形,Windows中可以繪制的基本幾何圖形包括點、直線、曲線、矩形、橢圓、弧、扇形、弦形和多邊形等。lGDI為提供了繪制基本圖形的成員函數(shù),這些函數(shù)封裝在MFC的CDC類中。l繪圖函數(shù)使用的坐標都是邏輯坐標。 函函 數(shù)數(shù)功功 能能SetPixel用指定的顏色在指定的坐標畫一個點MoveTo移動當前位置到指定的坐標,函數(shù)返回以前位置的坐標。LineTo從當前位置到指定位置畫一條直線Polyline從當前位置開始,根據(jù)函數(shù)參數(shù)繪制多條折線。PolyBezier根據(jù)兩個
39、端點和兩個控制點繪制貝濟埃(Bezier)曲線。Rectangle根據(jù)指定的左上角和右下角坐標繪制一個矩形RoundRect繪制一個圓角矩形。Ellipse根據(jù)指定的矩形繪制一個內(nèi)切橢圓Arc根據(jù)指定的矩形繪制內(nèi)切橢圓上的一段弧邊ArcTo該函數(shù)功能與Arc函數(shù)相同,不同之處在于畫弧成功后Pie繪制扇形Chord繪制弦形,弦形是一條橢圓弧和其對應(yīng)的弦所組成的封閉圖形。Polygon根據(jù)兩個或兩個以上頂點繪制一個多邊形DrawIcon在指定位置畫一個圖標,如果成功函數(shù)返回非0,否則返回0。 利用MFC AppWizard建立一個SDI應(yīng)用程序,在OnDraw()函數(shù)中添加如下程序代碼: void
40、 CMyGraphView:OnDraw(CDC* pDC) CMyGraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here for(int xPos=20;xPosSetPixel(xPos,30,RGB(0,0,0); / 繪制像素點 POINT polylpt5=10,100,50,60,120,80,80,150,30,130; pDC-Polyline(polylpt,5); / 繪制五條折線 POINT polybpt4=150,160,220,60,
41、300,180, 330,20; pDC-PolyBezier(polybpt,4); / 繪制貝濟埃曲線 CBrush *pBrhOld; pBrhOld=(CBrush*)pDC-SelectStockObject( LTGRAY_BRUSH); / 使用淺灰色堆畫刷 pDC-RoundRect(400,30,550,100,20,20); / 繪制圓角矩形 pDC-Arc(20,200,200,300,200,250,20,200); / 繪制橢圓弧 pDC-Pie(220,200,400,380,380,270,240,220); / 繪制扇形 pDC-Chord(420,120,54
42、0,240,520,160,420,180); / 繪制弦形 POINT polygpt5=450,200,530,220,560,300,480,320,430,280; pDC-Polygon(polygpt,5); / 繪制五邊形 pDC-SelectObject(pBrhOld); / 恢復(fù)系統(tǒng)默認的畫刷l很多Windows應(yīng)用程序都需要顯示文本,并且,文本還是一些應(yīng)用程序的主要處理對象,如MS Word字處理軟件。l文本與字體密切相關(guān),輸出文本時選擇不同類型的字體在很大程度上影響程序的界面風格,合適的字體可以增強程序的感染力。因此,對軟件用戶來說,文本輸出也是很重要的。lWindow
43、s為文本的顯示提供了多種物理字體支持,而在程序中以創(chuàng)建不同風格的邏輯字體來輸出文本。 l以圖形方式進行文本的輸出是Windows操作系統(tǒng)一個特性,文本輸出實際上是按照指定的字體樣式將文本中的每個字符繪制出來。lWindows圖形設(shè)備接口GDI提供了很多有關(guān)文本輸出的函數(shù),CDC類對這些GDI文本輸出函數(shù)進行了封裝。l編程時最常用的文本輸出函數(shù)是TextOut()函數(shù),該函數(shù)只 能 輸 出 單 行 文 本 。 要 繪 制 多 行 文 本 可 以 調(diào) 用DrawText()函數(shù),另一個函數(shù)ExtTextOut()可以用一個矩形框?qū)敵鑫谋敬M行裁剪。SetTextColor()設(shè)置顯示文本的顏色G
44、etTextColor獲得當前文本的顏色SetBkColor()設(shè)置顯示文本的背景顏色GetBkColor()獲得當前文本的背景顏色SetBkMode()設(shè)置文本的背景模式GetBkMode()獲得當前文本的背景模式SetTextAlign()設(shè)置顯示文本的對齊方式GetTextAlign()獲得當前文本的對齊方式l文本與字體密切相關(guān),輸出文本的大小和外觀是由字體描述的。字體是指采用某種字樣的一套字符和符號,每一種字體都有字符集。l決定字體的三個要素是字樣、風格和大小。字樣是字母的樣式和文本的視覺外觀,字體的風格是字體的粗細和傾斜度。lWindows支持光柵字體、矢量字體和TrueType三種
45、字體。光柵字體即點陣字體,這種字體需要為每一種大小的字體創(chuàng)建獨立的字體文件。矢量字體以一系列線段存儲字符。TrueType字體是與設(shè)備無關(guān)的字體,字符以輪廓的形式存儲,包括線段和曲線。lTrueType字體正成為真正的主流,這種字體能夠以一種非常出色的字體技術(shù)繪制文本。TrueType字體能夠縮放為任何大小的字體,而不會降低圖形的質(zhì)量。Windows中提供的TrueType字體主要有Arial、Courier、Symbol、Time New Roman等,可以通過Windows“控制面板|字體”瀏覽系統(tǒng)已安裝的字體。l輸出文本時,默認情況下使用系統(tǒng)提供的缺省字體,如果需要可以改變顯示文本的字體
46、。與畫筆和畫刷一樣,字體也是一種GDI對象,MFC類CFont對GDI字體對象進行了封裝,我們一般利用CFont類創(chuàng)建自己的字體(GDI對象),然后把創(chuàng)建的字體選入設(shè)備環(huán)境,以用于在設(shè)備環(huán)境中繪制文本。 除了選擇任意尺寸TrueType字體,也可以選擇固定尺寸的系統(tǒng)字體(堆字體堆字體)。當選擇堆字體作為文本輸出的字體時,無需創(chuàng)建字體對象,只需簡單地調(diào)用成員函數(shù)CDC:SelectStockObject()將堆字體對象選入設(shè)備環(huán)境。 Windows提供了以下六種堆字體對象:ANSI_ FIXED_FONT、ANSI_VAR_FONT、SYSTEM_ FONT、SYSTEM_FIXED_FONT、
47、DEVICE _DEFAULT_ FONT、OEM_FIXED_FONT。 例如:pDC-SelectStockObject( ANSI_FIXED_FONT); 輸出文本時,Windows使用一個矩形框以位圖的方式繪制出每一個字符的形狀。文本的顯示是以像素為單位,有時需要精確地知道文本的詳細屬性,如高度、寬度等。 編程時可以通過訪問TEXTMETRIC結(jié)構(gòu)來獲取顯示器關(guān)于文本字符的屬性信息,因為每一種物理字體的信息由數(shù)據(jù)結(jié)構(gòu)TEXTMETRIC描述。調(diào)用函數(shù)CDC: GetTextMetrics()可得到當前字體的TEXTMETRIC結(jié)構(gòu)。 lWindows本身提供了豐富的字體,直接選用其中
48、的字體就能滿足一般需要。也可以根據(jù)Windows提供的字體創(chuàng)建自己的字體,但利用CFont類創(chuàng)建自定義字體并不是創(chuàng)建一種新的物理字體,而是創(chuàng)建一種邏輯字體。l邏輯字體是一種抽象的字體描述,是用與設(shè)備無關(guān)的方式來描述一個字體。邏輯字體只定義了字體的一般特征,如高度、寬度、旋轉(zhuǎn)角度、黑體、斜體及下劃線等宏觀特性,它并沒有描述字體詳細的微觀特性,也沒有生成對應(yīng)的字庫文件。l值得注意的是,有時不知道機器上是否安裝了需要的字體,因此,程序運行時顯示文本的字體可能并不是你想要的字體。實際上,在程序中創(chuàng)建一種字體并不是真正創(chuàng)建一種完全滿足程序要求的字體,而是僅尋找匹配的Windows字體并與之相關(guān)聯(lián)。l當
49、利 用 C F o n t 類創(chuàng)建邏輯字 體 并 利 用 成 員 函 數(shù)CDC:SelectObject()將它選入設(shè)備環(huán)境時,GDI字體映射器根據(jù)邏輯字體給出的特性,從現(xiàn)有的物理字體中選擇與之最匹配的物理字體,這就是所謂的字體實現(xiàn)(Font realization)。 1. 使用成員函數(shù)CFont:CreatPointFont() 2. 使用成員函數(shù)CFont:CreateFontIndirect()3. 使用成員函數(shù)CFont:CreateFont() CClientDC dc(this);CFont fntZdy, *pfntOld;VERIFY(fntZdy.CreatePointFo
50、nt(200, Arial, &dc); pfntOld=dc.SelectObject(&fntZdy); / 選入設(shè)備環(huán)境dc.TextOut(100, 100, Hello! This is 20 Pt Arial Font.);dc.SelectObject(pfntOld);/ 恢復(fù)原來字體 fntZdy.DeleteObject();/ 刪除自定義字體 例:例: CFont font;LOGFONT LogFnt;memset(&LogFnt, 0, sizeof(LOGFONT); / 清零結(jié)構(gòu)LogFontLogFnt.lfHeight = 22; /
51、字體高度為22像素strcpy(LogFnt.lfFaceName, Courier); / 匹配字體為CourierVERIFY(font.CreateFontIndirect(&LogFnt); / 創(chuàng)建字體CClientDC dc(this);CFont* def_font = dc.SelectObject(&font); / 選入設(shè)備環(huán)境dc.TextOut(100, 130, Hello! This is 22-pixel-height Courier Font.);dc.SelectObject(def_font);font.DeleteObject();例例 使
52、用CreateFontIndirect()函數(shù)和LOGFONT結(jié)構(gòu)。例例 編寫一個文本輸出程序UseFont,采用不同方法創(chuàng)建字體,并根據(jù)創(chuàng)建的字體輸出不同的文本串。 Windows還提供了一個公用字體對話框,很多程序都利用它來選擇不同的字體,并可以設(shè)置字體的大小和顏色。公用字體對話框?qū)?yīng)的MFC類是類CFontDialog,編程時可以通過訪問CFontDialog類的有關(guān)成員變量或調(diào)用成員函數(shù)獲得用戶所選擇的字體及其屬性,程序員無須具體定義這種字體就可以通過調(diào)用函數(shù)CreateFontIndirect()創(chuàng)建字體。l使用圖象形式的標志可以使用戶很快地找到某個程序或了解一個程序的大致功能,因此
53、在Windows環(huán)境中大量使用各種圖形圖像標志。Windows應(yīng)用程序中主要使用位圖、圖標和光標等幾種圖形資源。l利用Visual C+集成開發(fā)環(huán)境中的資源編輯器可以創(chuàng)建或編輯這幾種圖形資源,在程序中需要時可以通過編寫源代碼使用創(chuàng)建的圖形資源。 l位圖位圖是一個由位構(gòu)成的圖象,是由一系列數(shù)據(jù)排列而成的點陣結(jié)構(gòu),這些數(shù)據(jù)分別表示各點的顏色信息。Windows支持兩種不同形式的位圖:設(shè)備相關(guān)位圖DDB(Device Dependent Bitmap)和設(shè)備無關(guān)位圖DIB(Device Independent Bitmap)。lDDB又稱GDI位圖,它是某種顯示設(shè)備的內(nèi)部表示。DDB是針對某個設(shè)備創(chuàng)
54、建的位圖,顯示它依賴具體硬件的調(diào)色板。lDIB是不依賴硬件的位圖,包含了創(chuàng)建DIB位圖時所在設(shè)備的顏色格式、分辨率和調(diào)色板等信息。DIB位圖通常以BMP文件形式保存在磁盤中,或者以資源形式存在于EXE或DLL執(zhí)行文件中。 MFC只提供了處理DDB位圖的類CBitmap,要顯示DIB位圖,可以先將一個DIB位圖轉(zhuǎn)換為DDB位圖。類CBitmap提供了一個成員函數(shù),用于從程序的資源中裝載位圖,并可以將基于資源的DIB位圖轉(zhuǎn)換成GDI位圖,該函數(shù)聲明如下: BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDRe
55、source ); 參數(shù)lpszResourceName或nIDResource分別為資源名稱或資源標識,載入成功返回值為真,否則返回值為假。 位圖在顯示之前必須先裝入內(nèi)存,當駐留在內(nèi)存的位圖數(shù)據(jù)送到視頻內(nèi)存時,位圖就在顯示器上顯示。顯示一個DDB位圖步驟: (1) 調(diào)用CDC:CreateCompatibleDC()創(chuàng)建一個兼容的內(nèi)存設(shè)備環(huán)境; (2) 調(diào)用CBitmap:LoadBitmap()裝入位圖資源或調(diào)用CBitmap:CreateCompatibleBitmap()創(chuàng)建一個與內(nèi)存設(shè)備環(huán)境兼容的位圖; (3) 調(diào)用CDC:SelectObject()將位圖選入設(shè)備環(huán)境; (4) 調(diào)
56、用CDC:BitBlt()或CDC:StretchBlt()將位圖從內(nèi)存設(shè)備環(huán)境中復(fù)制到指定設(shè)備如顯示器。 利用向?qū)?chuàng)建一個SDI應(yīng)用程序MyBMP。執(zhí)行菜單命令I(lǐng)nsert|Resource插入一個Bitmap資源。利用資源編輯器對位圖進行編輯,并將其ID改為IDB_MYBITMAP。在函數(shù)OnDraw()中添加代碼:void CMyBMPView:OnDraw(CDC* pDC) CMyBMPDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CDC MemDC;
57、 MemDC.CreateCompatibleDC(pDC); / 內(nèi)存設(shè)備環(huán)境 CBitmap Bitmap; Bitmap.LoadBitmap(IDB_MYBITMAP); / 裝入位圖資源 CBitmap *pOldBitmap=MemDC.SelectObject(&Bitmap); / 將位圖對象選入設(shè)備環(huán)境 BITMAP bm; Bitmap.GetObject(sizeof(BITMAP), &bm); / 讀位圖信息 / 將內(nèi)存中的位圖復(fù)制到屏幕上 pDC-BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &MemDC,0,
58、0, SRCCOPY); MemDC.SelectObject(pOldBitmap); / 恢復(fù)位圖對象l在Windows中,每個文件都有一個圖標圖標(Icon)。應(yīng)用程序圖標通常會出現(xiàn)在程序標題欄的左上角、Windows底部的任務(wù)欄、資源管理器窗口和Windows桌面上。l圖標圖標實質(zhì)上是特殊形式的位圖,但圖標與位圖有兩個不同之處。首先,圖標大小尺寸只能有三種,一種是用于標題欄和最小化時的1616圖標,另外兩種是用于桌面、資源管理器的3232和4848圖標。其次,設(shè)計圖標時可以指定像素的顏色為屏幕顏色或屏幕反轉(zhuǎn)色。這樣,Windows在顯示圖標時,采用屏幕顏色的像素位置顏色不變,該位置圖標
59、部分看起來是透明的,而屏幕反轉(zhuǎn)色部分在任何彩色背景下都能顯示。 l應(yīng)用程序一般使用MFC提供的缺省圖標,也可以添加圖標。通過Insert|Resource命令插入Icon圖標資源,利用圖形資源編輯器編輯圖標,然后通過調(diào)用函數(shù)CWinApp: LoadIcon()加載圖標并獲得其句柄,該函數(shù)原型為: HICON LoadIcon(LPCTSTR lpszResourceName) const; HICON LoadIcon(UINT nIDResource) const;l對于圖標,MFC沒有提供對應(yīng)的類,編程時只有采用句柄的方式使用一個圖標。l用戶也可以通過調(diào)用CWinApp:LoadStan
60、dardIcon()加載Windows系統(tǒng)提供的預(yù)定義圖標。l圖標被加載后,為了在窗口顯示圖標,可以調(diào)用成員函數(shù)CDC:DrawIcon(),該函數(shù)原型為:BOOL DrawIcon(int x, int y, HICON hIcon);BOOL DrawIcon(POINT point, HICON hIcon); 其中,參數(shù)x、y或point指定圖標顯示的左上角坐標,hIcon為圖標句柄。l在初始化函數(shù)InitInstance()中可以通過調(diào)用成員函數(shù)CWnd:SetIcon()安裝圖標,此時應(yīng)該同時安裝1616和3232大小標準的圖標,該函數(shù)原型為:HICON SetIcon( HICON hIcon, BOOL bBigIcon ); 其中,參數(shù)hIcon為要安裝的圖標句柄,bBigIcon確定安裝何種大小的圖標。1利用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年自動化控制系統(tǒng)集成服務(wù)合同
- 2025年危險化學品運輸駕駛員勞動合同模板3篇
- 2025年E管材國際知識產(chǎn)權(quán)保護合同3篇
- 二零二五年個人抵押擔保信用卡合同參考3篇
- 2024年度房地產(chǎn)信托擔保借款合同三2篇
- 二零二五年醫(yī)療機構(gòu)食堂承包與健康管理服務(wù)合同樣本3篇
- 2024年版電商物流服務(wù)品質(zhì)協(xié)議3篇
- 2025版藝術(shù)品拍賣及收藏服務(wù)擔保合同3篇
- 2025年度高空作業(yè)安全防護培訓及安裝合同3篇
- 2024年員工創(chuàng)新項目借款及知識產(chǎn)權(quán)保護協(xié)議2篇
- 會計學原理期末測試練習題及答案
- 2024年7月國家開放大學法律事務(wù)??啤镀髽I(yè)法務(wù)》期末紙質(zhì)考試試題及答案
- 《教師法》培訓課件
- 常用護理評估表及注意事項
- 河北省唐山地區(qū)2023-2024學年上學期期末八年級歷史試卷
- 專題06直線與圓的位置關(guān)系、圓與圓的位置關(guān)系(課時訓練)原卷版
- 軍用裝備信息化融合與互聯(lián)
- 人才培養(yǎng)與團隊建設(shè)計劃三篇
- 2024年急性胰腺炎急診診治專家共識解讀課件
- 六年級地方課程教案
- 【寒假預(yù)習】部編版二年級語文下冊生字練字帖(帶拼音、筆順)
評論
0/150
提交評論