freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

漢字點陣字模自動生成及鑲邊處理程序編程開發(fā)畢業(yè)論文(編輯修改稿)

2025-07-25 00:45 本頁面
 

【文章內(nèi)容簡介】 示方式,是否只許輸入數(shù)字,輸入信息的對齊方式等信息。 對于下拉框ComboBox,可以預設下拉框中的下拉選項數(shù)據(jù),及下拉框的類型,是否允許編輯框中的信息或添加新的選項等。 對于按鈕Button,可以選擇按鈕顯示類型,編輯按鈕文字等。 程序中還要設置控件與變量的映射關系。在界面編輯中,按Ctrl+W調(diào)出映射關系表,設置控件與變量及消息的映射關系。 對于控件與變量的關系,通過Member Variables進行設置。例如文本編輯框的變量設置如圖62所示。圖62 文本框變量對應設置 圖62中設置了文本框的數(shù)據(jù)變量m_input,格式為CString,文本框中允許輸入的字符長度為12。 變量的數(shù)據(jù)類型有數(shù)據(jù)變量和控制變量兩種,根據(jù)不同的情況使用不同的變量,對于文本輸入信息等使用數(shù)據(jù)變量,可以直接訪問用戶輸入的數(shù)據(jù),而對于下拉框則使用控制變量CComboBox,以便調(diào)用其相關函數(shù)選取處理數(shù)據(jù),如設置初始選項,獲得當前選項等。 對于消息映射,則通過Message Maps進行設置。如對按鈕的單擊事件產(chǎn)生的消息進行處理,就需要添加消息處理函數(shù),如圖63所示。圖63 按鈕消息事件處理 圖63中,按鈕消息表中的BN_CLICKED消息為按鈕單擊消息,而下面的對應函數(shù)中的OnShow1函數(shù)就是處理這個消息所對應的方法。 點陣字體生成顯示模塊制作 點陣字體的生成模塊是把矢量字體載入并轉(zhuǎn)換為點陣字體,而顯示模塊是把每個字的點陣數(shù)據(jù)通過畫圖函數(shù)畫在屏幕上。 字體的生成 定義CFont字體類的對象,之后根據(jù)用戶輸入的字體類型及點陣尺寸建立新的字體,關鍵代碼如下: CFont cFont。 (nHeight, OUT_TT_ONLY_PRECIS, LPCTSTR(fontname))。上述代碼建立了一個尺寸為nHeight大小的,字體名稱為fontname的字體,其中的OUT_TT_ONLY_PRECIS參數(shù)指定系統(tǒng)使用TTF的字體文件。建立字體過程中,Windows會自動檢索字體庫文件,找到與提供信息最匹配的字體文件,如fontname的值為“宋體”,則系統(tǒng)自動找尋宋體的字庫文件。之后,通過dcSelectObject(amp。cFont)命令將該類字體送入設備環(huán)境中,此時在此設備中輸出地字體就是所選的字體,這就完成了字體的載入過程。此時,使用m_input變量獲取用戶在界面的文本框中輸入的字符信息,通過(((0) amp。 0x00ff)8) + ((1) amp。 0x00ff)命令,獲得輸入的字符代碼,即對應字符的區(qū)位碼加上0xA0A0,用一個字符變量nChar存儲字符代碼。然后通過系統(tǒng)自帶的功能函數(shù)GetGlyphOutline(nChar, GGO_BITMAP, amp。gm, cBuf, pBuf, amp。mat2),將nChar對應的字符轉(zhuǎn)換成比特圖的形式,生成比特圖的大小保存在cBuf中,而比特圖的數(shù)據(jù)保存在pBuf中。再從pBuf中取出各行各列的數(shù)據(jù)存在一個數(shù)組中,該數(shù)組即為點陣字體的數(shù)據(jù)矩陣。其關鍵代碼為:btCode = pBuf[i* nByteCount + j]。for (int k = 0。 k 8。 k++){ if (btCode amp。 (0x80k)) border[l++] = 1。 else border[l++] = 0。}其中btCode從pBuf中取出一個字節(jié),再按位判斷每個比特,按01存入數(shù)組border中。程序中nByteCount的值為(( +31) 5) 2,這是因為GetGlyphOutline函數(shù)的默認格式的影響。GetGlyphOutline函數(shù)將比特圖的每一行保存成32個比特的整數(shù)倍,也就是4個字節(jié)的數(shù)據(jù)為一組,如16x16的點陣尺寸,生成的pBuf的每一行應有16個點的值,也就是每一行只需2個字節(jié)就能保存,而實際上每一行卻有4個字節(jié)的存儲空間,前兩個字節(jié)保存點的值,余下的2個字節(jié)函數(shù)默認為0,所以在將pBuf中的數(shù)據(jù)保存至數(shù)組中時,應注意行列的標號。 字體的顯示 字體的顯示是通過在對應點處畫出一個小矩形來表示一個點,而一系列點的排列構成了一個字符。其關鍵代碼如下: for (int i = 0。 i 。 i++){ for (int j = 0。 j 8 * nx。 j++) if (border[8 * nx * i + j] == 1){ dcSelectStockObject(WHITE_BRUSH)。 dcRectangle(m, n, m + sizex, n + sizey)。 }n += sizey。 m = startx。}其中nx的值為( + 7) 3,其意義為每一行所對應的字節(jié)數(shù),比如16x16的點陣字體,一行有16個點,而8個點的數(shù)據(jù)保存為一個字節(jié),則其每一行就有2個字節(jié),其nx的值為2 代碼通過遍歷點陣數(shù)據(jù)找尋值為1的點,即有筆畫的點,對這樣的點進行屏幕繪圖,使用SelectStockObject(WHITE_BRUSH)載入白色的畫刷來填充每個點的顏色,再用Rectangle(m, n, m + sizex, n + sizey)畫出一個sizex*sizey大小的矩形,以此來表示一個點,而其中的m,n表示的是該點的起始行列位置。要注意的是,每顯示一個點n的值都需要增加一個sizey,而m不變,但當一行結束后m,n的值需要改回起始處,否則下一行的點會偏離預定的地方。如圖64為24*24宋體格式的“我”字的顯示結果。圖64 “我”字的點陣顯示 鑲邊模塊的制作 鑲邊模塊是建立在顯示模塊之上的,由于采用的是實時的鑲邊算法,只需在顯示的過程中增加邊界判斷即可,其代碼大多類似于顯示模塊的。 字體的鑲邊 在顯示模塊的基礎上,改變顯示的條件,將if (border[8 * nx * i + j] == 1)改為if(MyIsBorder(j, i, 8 * nx, ) amp。amp。 border[8 * nx * i + j] != 1),將畫刷的顏色改為黑色即可,繪出的黑色點即是邊界,而白色的點就是筆畫。 其中關鍵的就是MyIsBorder這個邊界判斷函數(shù),此函數(shù)判斷該點周圍是否有筆畫存在,其算法為:依次判斷該點周圍的8個點是否存在且有筆畫,一旦周圍有筆畫就返回TRUE值,否則就返回FALSE值。其關鍵代碼為: if (ty 1 = 0) //判斷當前點上一行是否存在 { //判斷當前點左上方是否存在且有筆畫 if (tx 1 = 0 amp。amp。 border[(ty 1) * xmax + tx 1]) return TRUE。 //判斷當前點上方是否存在且有筆畫 if (border[(ty 1) * xmax + tx]) return TRUE。 //判斷當前點右上方是否存在且有筆畫 if (tx + 1 xmax amp。amp。 border[(ty 1) * xmax + tx + 1]) return TRUE。 } …… return FALSE。 上述代碼中,tx為列, ty為行, xmax為最大列數(shù), ymax為最大行數(shù),以此來判斷邊界信息。鑲邊的結果如圖65所示。圖65 “我”字的鑲邊顯示結果 我們可以比較鑲邊前后的顯示結果,如圖66所示,從圖中我們可以明顯地看出鑲邊前后點陣字體與背景對比度的差異,鑲邊前的“我”字并不十分清晰,而鑲邊后的“我”字卻很清晰,更加容易辨識,這就達到了我們鑲邊的目的。圖66 “我”字的鑲邊前后比較 字庫生成載入模塊的制作 根據(jù)GB2312的區(qū)位格式,生成指定字體的字庫,并實現(xiàn)載入功能。 字庫的生成 在界面中定制一個生成字庫的按鈕,并添加按鈕點擊事件處理函數(shù)。在此函數(shù)中,遍歷所有的區(qū)位碼,將生成的點陣信息按比特存入文件中。 此過程中,需要用到MFC中的CFile類庫,其中的函數(shù)可以定制文件的讀寫方式,權限及格式等,打開文件的關鍵代碼為: CString strFilter, strFileName。 strFilter = 自制點陣字庫 MyDot File (*.mydot)|*.mydot||。//定義過濾字符串 //創(chuàng)建保存文件對話框?qū)ο?,默認的文件擴展名為:.mydot CFileDialog fdlg(FALSE, mydot, NULL, OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXIST,strFilter)。 if (() == IDOK)//顯示文件保存對話框 { strFileName = ()。//獲取文件名 //構造CFile對象 CFile myfile(strFileName, CFile::modeCreate|CFile::modeWrite)?!?其中,CFileDialog建立了一個保存文件對話框(如圖67所示),并定義文件的后綴名為*.mydot,而myfile對象建立了一個指向生成字庫文件的文件指針,通過CFile類中的Write函數(shù)可以方便地向文件中寫入所要保存的數(shù)據(jù)。 寫入字庫數(shù)據(jù)時,通過循環(huán)區(qū)位碼,(amp。btCode, sizeof(BYTE))函數(shù)將對應的字節(jié)信息寫入至文件中即可,要注意的是有些字符的行列數(shù)并不一定是所指定的尺寸大小,如字符“一”,它的行數(shù)很小,但是存放至字庫的時候每一個字符都是分配指定大小的空間,需要對空白的部分進行補零的操作,在程序中則由btCode = ((k ) amp。amp。 (l nx)) ? pBuf[k* nByteCount + l] : 0命令來進行補零。 在文件對象不使用時,需要用Close()命令關閉文件對象。圖67 生成字庫保存對話框 字庫的載入 字庫的載入和生成有相似之處,都是文件的操作,使用的都是CFile類庫,不同的是一個是寫入,一個是讀取。在上一節(jié)生成字庫時,使用的是按順序?qū)懭氲姆椒?,但讀取的時候可能需要讀取文件的某個特定的位置,這就對文件定位有了一定的要求。 首先還是使用CFileDialog類,不過現(xiàn)在是建立打開文件對話框,只要將對話框命令中的FLASE值改為TRUE即可,命令如:CFileDialog fdlg(TRUE, mydot, *.mydot, OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,strFilter),()命令調(diào)出對話框,()命令可以得到用戶想要打開的文件的路徑名稱。 然后使用CFile myfile(FileName, CFile::modeRead)命令構造指定字庫文件的讀取指針,根據(jù)用戶輸入的區(qū)位碼信息設置文件偏移量offset = ((qu 1) * 94 + wei 1) * dotsz * dotsz / 8,(offset, CFile::begin)命令可以是文件指針指向所需的數(shù)據(jù)位置,(amp。btCode, sizeof(BYTE))函數(shù),即可方便地從指定的位置讀取所需字符的字節(jié)信息,并存至btCode變量中,這是只需根據(jù)前幾節(jié)中的內(nèi)容即可實現(xiàn)字符的顯示,甚至鑲邊處理。 各模塊的整合 各個模塊都完成以后就可以進行整合,整合的目的是讓每個模塊組合在一起,形成一個完整的功能,并將可以提取的部分抽象出來。在整合的過程中,要避免模塊之間的沖突,調(diào)整變量的影響范圍,使得功能的實現(xiàn)先后不影響結果,并將整體中存在的問題進行修整。 主要的就是顯示模塊和鑲邊模塊的整合處理。在顯示之前不能進行鑲邊處理,為解決這一問題,在鑲邊函數(shù)起始處加一條判斷信息,判斷顯示按鈕是否按下。 程序運行時由于是基于對話框模式,因此當按下回車或Esc健的時候,對話框就自動結束,程序即關閉了,為了解決這一問題,需要重新定義OnOK、OnCancel函數(shù),重新指定確定和取消鍵的執(zhí)行結果,然后還要重新定義ON_WM_CLOSE關閉消息,并重寫OnClose函數(shù),在其中添加程序關閉命令。 第七章 程序的改進和不足 改進和完善 可以看出,程序中每次只能對一個字符進行處理,但現(xiàn)實中卻需要顯示連續(xù)的字符,甚至是一句話或一篇文章,這是需要程序可以顯示多個字符,于是對程序進行改進,在顯示函數(shù)中加入循環(huán)遍歷輸入,并隨之改變每個字符的點陣起始位置,使得顯示一行文字成為可能。 界面變更如圖71所示:圖71 變更后的程序界面 在顯示功能的外圍加一層循環(huán)for (int k = 0。 k ()。 k++),使得程序可以遍歷用戶的輸入,將用戶輸入的每個字符都進行處理。為了區(qū)分輸入的數(shù)據(jù)是否為漢字,添加一個條件判斷,代碼如下:if ((k)0) nChar = (k)。//獲得數(shù)字、英文字符代碼 else ……//漢字的處理 這樣可以使得程序不僅可以處理漢字,同時也可以處理英文和數(shù)字等一些特殊字符。 圖72中為程序的完整功能演示。圖72 程序的完整功能演示 圖中為“南京郵電大學”的32*32楷體鑲邊顯示結果,背景色為黃色,而模塊二中的則是程序生成的72*72的楷體字庫中區(qū)位碼4650的字體顯示結果。在字體的選擇上,程序中只提供了四種字體的選擇,而實際中使用的字體是多種多樣的,在載入字體的過程中可以使用字體枚舉函數(shù)將系統(tǒng)的字體都枚舉出來之后存入下拉框中,即可解決此類問題。具體實現(xiàn)過程中使用回調(diào)函數(shù),從系統(tǒng)的字體信息中篩選合適的字體,并將其字體名稱存入下拉框中。其關鍵代碼如下://回調(diào)函數(shù),枚舉系統(tǒng)已經(jīng)安裝的字體BOOL CALLBACK MyEnumFontProc(ENUMLOGFONTEX* lpelf, NEWTEXTMETRICEX* lpntm, int FontType, LPVOID
點擊復制文檔內(nèi)容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1