圖像編程與文字處理.ppt
《圖像編程與文字處理.ppt》由會員分享,可在線閱讀,更多相關《圖像編程與文字處理.ppt(29頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第6章圖像編程與文字處理 精雕細琢 美化應用程序 教學內(nèi)容 6 1圖形設備接口 6 2常用繪圖函數(shù) 6 3繪圖工具 6 4字體與文字處理 6 5位圖 6 6綜合實例 建立賓館管理系統(tǒng)的啟動界面 6 7小結思考與練習 6 1圖形設備接口 6 1 1設備環(huán)境類在Windows程序中 應用程序的輸出并不直接面向物理的設備 如顯示屏或打印機 而是針對一個稱之為設備環(huán)境 DeviceContext 的邏輯設備進行操作 設備環(huán)境與實際設備之間的信息傳送由Windows直接管理 在MFC應用程序中 所有的繪制調(diào)用均通過相應的設備環(huán)境對象實現(xiàn) 設備環(huán)境對象封裝了相應的WindowsAPI功能 由一個32位的HDC類型句柄標識 在MFC類庫中 用CDC類封裝設備文本對象 6 1圖形設備接口 6 1 1設備環(huán)境類1 設備環(huán)境類 CDC CDC類直接繼承自CObject類 它是設備上下文對象的基類 CDC基類定義了設備描述表對象 并且提供在顯示器 打印機或Windows用戶區(qū)上繪圖的方法 它封裝了使用設備環(huán)境的GDI函數(shù) 所有的繪圖操作都是直接或間接運用了CDC的成員函數(shù) 這些函數(shù)有的進行設備描述表操作 有的是用來畫圖的 還有的函數(shù)是用來獲取或設置繪圖屬性 為映像和視圖服務的 2 派生類CPaintDCCPaintDC是從CDC派生出來的設備描述表類 它常常在窗口的OnPaint函數(shù)中使用 查看MFC的源代碼 Studio VC98 MFC SRC viewcore cpp 中的OnPaint函數(shù)的實現(xiàn)可以知道 OnPaint函數(shù)首先構造一個CPaintDC對象 再調(diào)用OnPrepareDC 函數(shù)將其準備好 最后以這個準備好的CPaintDC對象指針為參數(shù) 來調(diào)用OnDraw函數(shù)進行各種圖形處理 6 1圖形設備接口 6 1 1設備環(huán)境類3 派生類CClientDC 管理客戶區(qū) CClientDC類只能在客戶區(qū)繪圖 所謂客戶區(qū)是指窗口區(qū)域中去掉邊框 標題欄 菜單欄 工具欄 狀態(tài)欄等以外的部分 它是用戶可以操作的區(qū)域 例如打開Word文檔將是將某個 doc文件顯示在其客戶區(qū)域中 在使用CClientDC進行繪圖時 一般要調(diào)用GetClientRect函數(shù)來獲取客戶區(qū)域的大小 4 派生類CWindowDC 管理框架窗口 CWindowDC類直接從CDC派生 它使調(diào)用和釋放整個窗口 包括客戶區(qū)和非客戶區(qū) 的設備環(huán)境過程自動化 CWindowDC對象在構造時調(diào)用WindowsAPI函數(shù)GetWindowDC 在析構時調(diào)用相應的API函數(shù)ReleaseDC 這意味著CWindowtDC對象可訪問CWnd所指向的整個屏幕區(qū)域 6 1圖形設備接口 6 1 2使用GDI對象在選擇GDI對象進行繪圖時 往往遵循著下列的步驟 1 在堆棧中定義一個GDI對象 如CPen CBrush對象 然后用相應的函數(shù) 如CreatePen CreateSolidBrush 創(chuàng)建此GDI對象 2 將構造的GDI對象選入當前設備環(huán)境中 但不要忘記將原來的GDI對象保存起來 3 繪圖結束后 恢復當前設備環(huán)境中原來的GDI對象 4 由于GDI對象是在堆棧中創(chuàng)建中 當程序結束后 框架會自動刪除程序創(chuàng)建的GDI對象 6 1圖形設備接口 6 1 3坐標映射Windows的GDI graphicsdeviceinterface 支持兩種坐標系 即邏輯坐標系和物理坐標系 分別連接應用程序和圖形物理設備 物理坐標是指物理設備的坐標系 它的單位是真正的長度單位 有英寸 in 和毫米 mm 兩種 它的原點在屏幕的左上角 X軸向右遞增 Y軸向下遞增 邏輯坐標指的是在窗口下的坐標 邏輯坐標的單位是邏輯像素 在Windows系統(tǒng)中 總共有三種物理坐標 又叫設備坐標 分別是屏幕坐標 用戶區(qū)坐標 全窗口坐標 1 客戶區(qū)坐標系統(tǒng) 客戶區(qū)坐標系統(tǒng)是最常見的坐標系統(tǒng) 以窗口客戶區(qū)左上角為原點 0 0 主要用于窗口客戶區(qū)繪圖輸出以及處理窗口的一些消息 鼠標消息WM LBUTTONDOWN WM MOUSEMOVE傳給框架的消息參數(shù)以及CDC一些用于繪圖的成員都是使用客戶區(qū)坐標 2 屏幕坐標系統(tǒng) 屏幕坐標系統(tǒng)是另一類常用的坐標系統(tǒng) 以屏幕左上角為原點 0 0 一些與窗口客戶區(qū)不相關的函數(shù)均以屏幕坐標為單位 例如設置和取得光標位置的函數(shù)SetCursorPos 和GetCursorPos 由于光標可以在任何一個窗口之間移動 它不屬于任何一個單一的窗口 因此使用屏幕坐標 彈出式菜單使用的也是屏幕坐標 另外 CreateWindow 和MoveWindow 等函數(shù)用于設置窗口相對于屏幕的位置 使用的也是屏幕坐標系統(tǒng) 3 窗口坐標系統(tǒng) 窗口坐標系統(tǒng)以窗口左上角為坐標原點 它包含了窗口控制菜單 標題欄等內(nèi)容 一般情況下很少在窗口標題欄上繪圖 因此這種坐標系統(tǒng)很少使用 6 1圖形設備接口 6 1 4與繪圖有關的類和結構在圖形繪制操作中 常常需要使用MFC中的CPoint CSize和CRect等簡單數(shù)據(jù)類由于CPoint 點 CSize 大小 和CRect 矩形 是對Windows的POINT SIZE和RECT結構的封裝 因此它們可以直接使用各自結構的數(shù)據(jù)成員 如下所示 typedefstructtagPOINT LONGx 點的x坐標LONGy 點的y坐標 POINT typedefstructtagSIZE LONGcx 矩形的長度LONGcy 矩形的寬度 SIZE typedefstructtagRECT LONGleft 矩形左上角點的x坐標LONGtop 矩形左上角點的y坐標LONGright 矩形右下角點的x坐標LONGbottom 矩形右下角點的y坐標 RECT 6 2常用繪圖函數(shù) 6 2 1畫點與畫線1 畫點畫點是最基本的繪圖操作之一 它是通過調(diào)用CDC SetPixel或CDC SetPixelV函數(shù)來實現(xiàn)的 這兩個函數(shù)都是用來在指定的坐標上設置指定的顏色 只不過SetPixelV函數(shù)不需要返回實際像素點的RGB值 正是因為這一點 函數(shù)SetPixelV要比SetPixel快得多 COLORREFSetPixel intx inty COLORREFcrColor COLORREFSetPixel POINTpoint COLORREFcrColor BOOLSetPixelV intx inty COLORREFcrColor BOOLSetPixelV POINTpoint COLORREFcrColor 其中參數(shù)point指定所繪制的點 crColor指定畫點所用的顏色 倘若要在屏幕的 100 100 處畫一個紅色點 則代碼為 pDC SetPixel CPoint 100 100 RGB 255 0 0 實際顯示像素的顏色未必等同于crColor所指定的顏色值 因為有時受設備限制 不能顯示crColor所指定的顏色值 而只能取其近似值 與上述函數(shù)相對應的GetPixel函數(shù)是用來獲取指定點的顏色 COLORREFGetPixel intx inty const COLORREFGetPixel POINTpoint const 6 2常用繪圖函數(shù) 6 2 1畫點與畫線2 畫線畫線也是特別常用的繪圖操作之一 CDC的LineTo和MoveTo函數(shù)就是用來實現(xiàn)畫線功能的兩個函數(shù) 通過這兩個函數(shù)的配合使用 可完成任何直線和折線的繪制操作 CDC MoveTo用來移動當前點到指定點 返回當前點的坐標 它有兩種調(diào)用形式 其函數(shù)原型如下 CPointMoveTo intx inty CPointMoveTo POINTpoint 參數(shù)x為新位置的x坐標 y為新位置的y坐標 point為新位置的坐標 CDC LineTo函數(shù)用來繪制一條從當前點到指定點的直線 返回是否繪制成功的標志 其原型如下 BOOLLineTo intx inty BOOLLineTo POINTpoint 參數(shù)x為指定點的x坐標 y為指定點的y坐標 point為指定點的坐標 6 2常用繪圖函數(shù) 6 2 1畫點與畫線3 折線除了LineTo函數(shù)可用來畫線之外 CDC中還提供了一系列用于畫各種折線的函數(shù) 它們主要是Polyline PolyPolyline和PolylineTo 這三個函數(shù)中 Polyline和PolyPolyline既不使用當前位置 也不更新當前位置 而PolylineTo總是把當前位置作為起始點 并且在折線畫完之后 還把折線終點所在位置設為新的當前位置 這幾個函數(shù)的原型如下 BOOLPolyline LPPOINTlpPoints intnCount BOOLPolylineTo constPOINT lpPoints intnCount 這兩個函數(shù)用來畫一系列連續(xù)的折線 參數(shù)lpPoints是POINT或CPoint的頂點數(shù)組 nCount表示數(shù)組中頂點的個數(shù) 它至少為2 BOOLPolyPolyline constPOINT lpPoints constDWORD lpPolyPoints intnCount 此函數(shù)可用來繪制多條折線 其中l(wèi)pPoints同前定義 lpPolyPoints表示各條折線所需的頂點數(shù) nCount表示折線的數(shù)目 6 2常用繪圖函數(shù) 6 2 2矩形和圓角矩形CDC提供的Rectangle和RoundRect函數(shù)分別用于矩形和圓角矩形的繪制 它們的原型如下 BOOLRectangle intx1 inty1 intx2 inty2 BOOLRectangle LPCRECTlpRect BOOLRoundRect intx1 inty1 intx2 inty2 intx3 inty3 BOOLRoundRect LPCRECTlpRect POINTpoint 參數(shù)lpRect的成員left top right bottom分別表示x1 y1 x2 y2 point的成員x y分別表示x3 y3 而x1 y1表示矩形的左上角坐標 x2 y2表示矩形的右上角坐標 x3 y3表示繪制圓角的橢圓大小 6 2常用繪圖函數(shù) 6 2 3圓弧和橢圓通過調(diào)用CDC的Arc函數(shù)可以畫一條橢圓弧線或者整個橢圓 這個橢圓的大小是由其外接矩形 本身并不可見 所決定的 Arc函數(shù)的原型如下 BOOLArc intx1 inty1 intx2 inty2 intx3 inty3 intx4 inty4 BOOLArc LPCRECTlpRect POINTptStart POINTptEnd 使用CDC的成員函數(shù)Ellipse 可以使用當前筆繪制一個用當前畫刷填充的橢圓或圓 其函數(shù)原型如下 BOOLEllipse intx1 inty1 intx2 inty2 BOOLEllipse LPCRECTlpRect 6 3繪圖工具 6 2 1畫筆畫筆是最簡單的一種繪圖工具 同時也是最重要的一種繪圖對象 在現(xiàn)實世界中 可以用不同的筆產(chǎn)生不同的線 這正如繪圖用的彩筆 不同顏色筆產(chǎn)生不同顏色的線 Windows也是利用這種面向?qū)ο蟮拿枋鍪挛锏姆椒?把筆作為一個對象 和現(xiàn)實世界一樣 不同的筆產(chǎn)生不同的線 一個畫筆通常具有寬度 風格和顏色三種屬性 畫筆的寬度用來確定所畫的線條寬度 它是用設備單位表示的 默認的畫筆寬度是一個像素單位 畫筆的顏色確定了所畫的線條顏色 畫筆的風格確定了所繪圖形的線型 它通常有實線 虛線 點線 點劃線 雙點劃線 不可見線和內(nèi)框線等七種風格 6 3繪圖工具 6 2 1畫筆1 畫筆的創(chuàng)建創(chuàng)建一個修飾畫筆 可以使用CPen類的CreatePen函數(shù) 其原型如下 BOOLCreatePen intnPenStyle intnWidth COLORREFcrColor 參數(shù)nPenStyle nWidth crColor分別用來指定畫筆的風格 寬度和顏色 此外 還有一個CreatePenIndirect函數(shù)也是用來創(chuàng)建畫筆對象 它的作用與CreatePen函數(shù)是完全一樣的 只是畫筆的三個屬性不是直接出現(xiàn)在函數(shù)參數(shù)中 而是通過一個LOGPEN結構間接地給出 BOOLCreatePenIndirect LPLOGPENlpLogPen 此函數(shù)用由LOGPEN結構指針指定的相關參數(shù)創(chuàng)建畫筆 LOGPEN結構如下 typedefstructtagLOGPEN UINTlopnStyle 畫筆風格 同上POINTlopnWidth POINT結構的y不起作用 而用x表示畫筆寬度COLORREFlopnColor 畫筆顏色 LOGPEN 6 3繪圖工具 6 2 1畫筆2 使用畫筆在VC NET 通常按照如下步驟來使用畫筆 1 聲明CPen對象 2 初始化畫筆 通過調(diào)用CreatePen成員函數(shù)可以初始化筆 3 將新建的畫筆對象選進設備場景中 同時保存原畫筆對象的指針 pOldPen pDC SelectObject 4 調(diào)用繪圖函數(shù)生成圖形 5 選擇設備場景的原有筆對象 3 畫筆工具的操作示例 6 3繪圖工具 6 2 2畫刷1 畫刷的屬性畫刷的屬性通常包括填充色 填充圖案和填充樣式三種 畫刷的填充色和畫筆顏色一樣 都是使用COLORREF顏色類型 畫刷的填充圖案通常是用戶定義的8 8位圖 而填充樣式往往是CDC內(nèi)部定義的一些特性 它們都是以HS 為前綴的標識 2 畫刷的創(chuàng)建CBrush類根據(jù)畫刷屬性提供了相應的創(chuàng)建函數(shù) 例如創(chuàng)建填充色畫刷和填充樣式畫刷的函數(shù)為CreateSolidBrush和CreateHatchBrush 它們的原型如下 BOOLCreateSolidBrush COLORREFcrColor 創(chuàng)建填充色畫刷BOOLCreateHatchBrush intnIndex COLORREFcrColor 創(chuàng)建填充樣式畫刷其中 nIndex用來指定畫刷的內(nèi)部填充樣式 而crColor表示畫刷的填充色 與畫筆相類似 也有一個LOGBRUSH邏輯結構用于畫刷屬性的定義 并通過CBrush的成員函數(shù)CreateBrushIndirect來創(chuàng)建 其原型如下 BOOLCreateBrushIndirect constLOGBRUSH lpLogBrush 6 3繪圖工具 6 2 2畫刷3 畫刷的使用在VC NET 通常按照如下步驟來使用畫刷 1 生成CBrush的實例 刷子以多種樣式和顏色出現(xiàn)在CBrush CBrush CBrush CBrush COLORREFcrColor CBrush intnIndex COLORREFcrColor 上述函數(shù)的參數(shù)crColor指定刷子顏色 nIndex參數(shù)指定刷子圖案 其值如表8 7所示 2 調(diào)用相應的成員函數(shù)初始化刷子 3 將所創(chuàng)建的畫刷選入設備環(huán)境 同時保存原畫刷對象的指針 4 調(diào)用繪圖函數(shù)生成圖形 5 恢復原先設備環(huán)境中的畫刷 6 3繪圖工具 6 2 2畫刷3 畫刷的使用 6 3繪圖工具 6 2 3繪圖示例EX06B 6 4字體與文字處理 6 4 1字體的屬性字體的屬性有很多 但其主要屬性有字樣 風格和尺寸三個 字樣是字符書寫和顯示時表現(xiàn)出的特定模式 例如 對于漢字 通常有宋體 楷體 仿宋 黑體 隸書以及幼圓等多種字樣 字體風格主要表現(xiàn)為字體的粗細和是否傾斜等特點 字體尺寸是用來指定字符所占區(qū)域的大小 通常用字符高度來描述 字體尺寸可以取毫米或英寸作為單位 但為了直觀起見 也常常采用一種稱為 點 的單位 一點約折合為1 72英寸 對于漢字 還常用 號 數(shù)來表示字體尺寸 初號字最大 以下依次為小初 一號 小一 二號 小二 如此類推 字號越大 字體尺寸越小 6 4字體與文字處理 6 4 2字體的創(chuàng)建在VC NET中 創(chuàng)建字體需要調(diào)用CFont類的成員函數(shù)CreateFont Indirect 或CreatePointFont Indirect 來初始化 創(chuàng)建字體函數(shù)CFont類的字體創(chuàng)建成員函數(shù)的原型為 BOOLCreateFont intnHeight intnWidth intnEscapement intnOrientation intnWeight BYTEbItalic BYTEbUnderline BYTEcStrikeOut BYTEnCharSet BYTEnOutPrecision BYTEnClipPrecision BYTEnQuality BYTEnPitchAndFamily LPCTSTRlpszFaceName BOOLCreateFontIndirect constLOGFONT lpLogFont BOOLCreatePointFont intnPointSize LPCTSTRlpszFaceName CDC pDC NULL BOOLCreatePointFontIndirect constLOGFONT lpLogFont CDC pDC NULL 其中CreatePointFont提供了創(chuàng)建字體的一種簡單方法 nPointSize為字體的大小 以0 1點 像素 墨點 磅數(shù) 為單位lpszFaceName為字體名稱字符串的指針若pDC非空 則系統(tǒng)會將設備單位點自動轉換為pDC中的映射模式所指定的邏輯單位 6 4字體與文字處理 6 4 3文本輸出函數(shù)文本的最終輸出不僅依賴于文本的字體 而且還跟文本的顏色 對齊方式等有很大關系 CDC類提供了四個輸出文本的成員函數(shù) TextOut ExtTextOut DrawText和TabbedTextOut virtualBOOLTextOut intx inty LPCTSTRlpszString intnCount BOOLTextOut intx inty constCString 6 4字體與文字處理 6 4 4文本屬性控制1 設置文本的背景色缺省時 在繪制圖形或者輸出文本時 背景顏色是白色 可以使用CDC的成員函數(shù)SetBkColor函數(shù)來設置新的背景顏色 函數(shù)原型為 virtualCOLORREFSetBkColor COLORREFcrcolor 2 控制文本的背景色背景模式可用函數(shù)SetBkMode來設置 它設置當前的背景模式并返回原來的背景模式 該函數(shù)的原型為 intSetBkMode intnBkMode 參數(shù)nkbmode指定背景模式 其值可以是OPAQUE或者TRANSPARENT 如果值為OPAQUE 則顯示時背景都改變?yōu)楫斍氨尘邦伾?如果值為TRANSPARENT 則不改變背景顏色 此時 任何SetBkColor函數(shù)調(diào)用都無效 缺省的背景模式為OPAQUE 3 設置文本的排列方式在文本顯示時遇到的另一個問題是文本的排列方式 它控制文本和給定點的相對位置 在一個圖形中加字符說明時 常常知道一個字符串的某一個邊界 如左邊界不應超過某個位置 或右邊界不應超過某個位置 或顯示的幾行字符串的中心點對齊等 利用CDC的成員函數(shù)SetTextAlign函數(shù)就能方便地實現(xiàn)這種控制 其原型為 UINTSetTextAlign UINTnFlags 6 4字體與文字處理 6 4 5字體示例EX06C 6 5位圖 6 5 1位圖文件的格式DIB位圖文件分為四部分 1 位圖文件頭BITMAPFILEHEADER 位圖文件頭BITMAPFILEHEADER是一個結構體 長度為14字節(jié) 2 位圖信息頭BITMAPINFOHEADER 位圖信息頭BITMAPINFOHEADER也是一個結構體 長度為40字節(jié) 3 調(diào)色板Palette調(diào)色板Palette針對的是需要調(diào)色板的位圖 即單色 16色和256色位圖 對于不以調(diào)色板方式存儲的位圖 則無此項信息 調(diào)色板是一個數(shù)組 共有biClrUsed個元素 如果該值為0 則有2biBitCount個元素 數(shù)組中每個元素是一個RGBQUAD結構體 長度為4個字節(jié) 4 實際的位圖數(shù)據(jù)ImageDate對于用到調(diào)色板的位圖 實際的圖象數(shù)據(jù)ImageDate為該象素的顏色在調(diào)色板中的索引值 對于真彩色圖 圖象數(shù)據(jù)則為實際的R G B值 a 單色位圖 用1bit就可以表示象素的顏色索引值 b 16色位圖 用4bit可以表示象素的顏色索引值 c 256色位圖 1個字節(jié)表示1個象素的顏色索引值 d 真彩色 3個字節(jié)表示1個象素的顏色R G B值 6 5位圖 6 5 2CBitmap的使用方法 6 6綜合實例 建立賓館管理系統(tǒng)的啟動界面 思考與練習1 在MFC中常用的設備環(huán)境類有哪些 它們有什么不同 2 在繪圖程序中怎樣設置圖形的顏色 3 什么是字體 如何構造和定義字體 4 CDC中文本繪制函數(shù)有哪些 它們有何不同 5 什么是位圖 如何將項目中的位圖顯示出來 6 畫筆的屬性有哪幾種 如何使用畫筆 7 編寫一個記事本程序 實現(xiàn)文本的格式化 要求使用字體對話框來設置文本字體的格式 8 編寫一個簡單的繪圖程序 當單擊工具欄上圖形時 可以用選定的顏色繪出相應的圖形- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 圖像 編程 文字處理
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-8754619.html