




已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1 35 Ultimate Chinese Editor 文檔文檔 Documents of UCE 1 0 哈爾濱工業(yè)大學(xué)計算機(jī)系哈爾濱工業(yè)大學(xué)計算機(jī)系 Last modified on 2002 9 12 2 35 目錄目錄 Contents 關(guān)于本軟件關(guān)于本軟件 3 軟件描述 3 背景 3 軟件的主要特色 4 參與人員 本軟件 4 功能模塊功能模塊 4 內(nèi)核模塊 4 鍵盤控制模塊 6 漢字輸入法模塊 7 UNDO模塊 8 MESSAGEBOX對話框模塊 8 顯示輸出模塊 9 文件列表文件列表 9 功能模塊函數(shù)列表功能模塊函數(shù)列表 10 LIST C 10 EDITOR C 11 BITMAP H 12 I How come 12 II Crack it 12 III First Use the Power 15 IV Future Improvement 16 WINFUNC H 16 I Design Purpose 16 II The Data Structure 17 II The Functions 19 III Apply The Header 21 GOUTPUT H 22 IMD H 24 功能函數(shù)的算法說明功能函數(shù)的算法說明 部分部分 25 APPENDCHAR 在末尾追加一個字符 25 VOID INTERRUPT FAR CURSORHANDLER 顯示光標(biāo)的時間中段句柄的函數(shù) 25 VOID SCROLLWINDOWUP UNSIGNED INT N 從第N行后顯示區(qū)域下滾 26 VOID GETHZ CHAR INCODE CHAR BYTES 獲取漢字字模 28 VOID PUTASCCOLOR 在特定位置用特定顏色顯示 ASCII 字符 28 3 35 VOID PUTCNCOLOR 在特定位置用特定顏色顯示漢字字符 28 問題解決及存在的問題問題解決及存在的問題 30 個人感受個人感受 30 虛空中的執(zhí)著 30 感受團(tuán)隊 ENJOY TEAMWORK 31 經(jīng)驗及教訓(xùn)經(jīng)驗及教訓(xùn) 32 致謝致謝 32 附錄附錄 32 西文方式下掛接 UCDOS 5 0 中的萬能漢字輸入法 32 4 35 關(guān)于本軟件關(guān)于本軟件 軟件描述軟件描述 軟件中文名稱 中文編輯器 軟件英文名稱 Ultimate Chinese Editor 運(yùn)行環(huán)境 DOS 環(huán)境 編寫語言 C 編譯環(huán)境 Turbo C V1 0 版本 Version 1 0 背景背景 本軟件是哈爾濱工業(yè)大學(xué)計算機(jī)系 2001 級本科生的年級作業(yè)作品 2001 年 7 月 和為等計算機(jī)系 2001 級 7 名本科生在關(guān)毅關(guān)毅老師的領(lǐng)導(dǎo)下組成開發(fā)小組 利用假期時間完成兩個題目 通訊錄和編輯器 本軟件即是編輯器小組的作品 此次活動的目 的是 通過年級大作業(yè)形式的活動來培養(yǎng)互相協(xié)作 互相配合的團(tuán)隊精神 通過活動中的 實際練習(xí)來加深已學(xué)知識的理解 同時又增加了學(xué)習(xí)新知識的樂趣 如果加學(xué)分就更好了 關(guān)老師考慮到 2001 級本科生所學(xué)的專業(yè)課有限 高級語言課程僅涉及 C 語言 要求軟件 的所有代碼用 C 編寫 這個編輯器的所有代碼可在 TurboC v1 0 中編譯通過 Turbo C V1 0 是 Borland 公 司的產(chǎn)品 編輯環(huán)境比 TurboC2 0 有較大的改善 而且對 C 支持的非常好 故此成為我們 的首選 而且我們還用工程管理 使各自的模塊相對獨(dú)立 方便管理 軟件的主要特色軟件的主要特色 Ultimate Chinese Editor V1 0 具有以下幾方面特色 較強(qiáng)的處理中文的能力 對中文整體識別 您不會看到 半個漢字 引起的屏幕 混亂 能夠脫離漢字系統(tǒng) 有獨(dú)立的輸入法 讓您在沒有漢字系統(tǒng)的情況下能夠自由錄 入 編輯文本 支持塊操作 有比較友好的界面 有提示對話框 幫助您更好的編輯 提供源代碼 期望與您交流 貽笑大方了 有詳細(xì)的文檔 值得一看哦 不是吹牛吧 5 35 參與人員 本軟件 參與人員 本軟件 楊碧輝 0103111 班 負(fù)責(zé)顯示模塊部分frozenwind 陳奐章 0103112 班 負(fù)責(zé)菜單和界面部分hanzac 高立琦 0103113 班 負(fù)責(zé)數(shù)據(jù)操作 管理模塊部分gao lq 功能模塊功能模塊 內(nèi)核模塊內(nèi)核模塊 內(nèi)核是對數(shù)據(jù)處理的核心程序 著名的計算機(jī)科學(xué)家沃斯 N Wirth 提出了 數(shù)據(jù)結(jié)構(gòu) 算法設(shè)計 程序 確定了合適的數(shù)據(jù)結(jié)構(gòu) 設(shè)計出精美的算法 我們的程序的功能的實現(xiàn) 才能變?yōu)榭赡?我們首先分析了一下編輯器的數(shù)據(jù)結(jié)構(gòu)特點(diǎn) 1 不定性 編輯器的行列是不定的 即我們不能預(yù)先知道要處理多大的文本 2 不規(guī)則性 每一行的數(shù)據(jù)量不定 不能用一個固定 通用的數(shù)組來存放 3 非連續(xù)性 編輯器需要頻繁的插入 刪除操作 如果用固定 連續(xù)的空間存放 勢必降低運(yùn)算的效率 這些特點(diǎn)是我們排除了數(shù)組 隊列等數(shù)據(jù)結(jié)構(gòu)類型 我們的目光鎖定在鏈表上 鏈表 具有可以動態(tài)添加 刪除節(jié)點(diǎn) 不需要連續(xù)的內(nèi)存區(qū)域等特點(diǎn) 適用于編輯器的數(shù)據(jù)要求 我們設(shè)計以每個字符為單位的基本結(jié)構(gòu) 為了方便處理中文 我們將一個漢字看作一個中 文自符 字符單元的結(jié)構(gòu)如下 struct CHAR NOTE char c c1 CHAR NOTE pNext pPre 若干個字符節(jié)點(diǎn)連在一起便形成了一行 行鏈表示意圖 我們又設(shè)計了一個行的結(jié)構(gòu)體 6 35 struct LINE NOTE int Len int MaxCaretx CHAR NOTE pHead pEnd LINE NOTE pNext pPre int Bx1 Bx2 用來管理一行的鏈表 如 pHead 用來記錄鏈表表頭的指針 pEnd 用來記錄鏈表最末一 個字符的指針 編輯器的核心任務(wù)就是維護(hù)這樣的一個復(fù)雜的 雙鏈表 文件 LIST C 中提供許多函數(shù) 如 InsertAfter AppendChar SeekChar 等函數(shù)來維護(hù)雙鏈 表 函數(shù)的功能在模塊功能中有詳細(xì)介紹 7 35 鍵盤控制模塊鍵盤控制模塊 鍵盤控制模塊示意圖 主干程序采用 while 循環(huán) 如代碼 while 1 do k GetInputWord s 取當(dāng)前輸入法模塊返回的字串 while k 0 if k 0 字串有效 p s while p AddChar p else 為不可顯示按鍵 key i k if key c 0 0 flag 1 switch key i 控制鍵 case C Y case C Z case C S 8 35 if flag switch key c 0 case ENTER case BACKSPACE KeyBackspace break case ESC default AddChar key c 0 break else switch key c 1 功能鍵 case UP case DOWN 每一按鍵對應(yīng)一個處理模塊 各個處理模塊調(diào)用 LIST C 中的模塊并協(xié)調(diào)顯示的數(shù)據(jù)和內(nèi)存 中的數(shù)據(jù)的一致性 比如 KeyUp KeyDown 為控制光標(biāo)鍵的處理模塊 改動內(nèi)存當(dāng)前 字符的指針并改變屏幕上當(dāng)前光標(biāo)的位置 漢字輸漢字輸入入法模塊法模塊 由于我們的編輯器獨(dú)立于漢字系統(tǒng) 且又要處理中文 故而我們必須提供中文輸入法 模塊以供用戶來輸入中文 漢字的輸入是通過 bioskey 取得鍵盤的掃描碼 根據(jù)鍵盤的掃 描碼算出漢字的輸入碼 最后根據(jù)輸入碼從字庫中查找相同的輸入碼 取得漢字的內(nèi)碼來 實現(xiàn)的 我們采用 UCDOS5 0 中的 IMD 輸入法碼表文件 該碼表文件有幾個優(yōu)點(diǎn) 1 UCDOS 中廣泛支持 提供眾多碼表文件 2 碼表文件結(jié)構(gòu)清晰 3 輸入法算法通用 可以掛接多種輸入法 關(guān)于輸入法碼表文件的結(jié)構(gòu) 輸入法算 法 請詳見附錄 這部分資料我們?nèi)∽跃W(wǎng)絡(luò) 9 35 Undo 模塊模塊 該模塊提供簡單的 Undo 功能 能恢復(fù)被刪除的 200 個字符 并將恢復(fù)的字符插入當(dāng) 前位置 Undo 模塊采用循環(huán)隊列的數(shù)據(jù)結(jié)構(gòu)來管被刪除節(jié)點(diǎn)的信息 一般的 隊列遵循先進(jìn)先 出的原則 FIFO First In First Out 普通的隊列在一個元素出列時 期它的元素都要向前 移動一個位置 在內(nèi)存中表現(xiàn)為所有單元的元素向前移動一個位置 這樣勢必會增加操作 時間 我們采用循環(huán)隊列 因為循環(huán)隊列采用兩個指針 Head 和 Tail 分別指向隊列的 第一個和最后一個元素 通過修改兩個指針實現(xiàn) 先進(jìn)先出 節(jié)省了操作時間 添加一個 元素時 Tail Tail mod maxsize 1 刪除一個元素時 Head Head mod maxsize 1 當(dāng) Head 與 Tail 相等時 表示該隊列為空 當(dāng) Head Tail mod maxsize 1 時 隊列為滿 環(huán)形隊列示意圖 MessageBox 對話框模塊對話框模塊 在編輯器中 我們增加了對話框模塊 如圖所示 對話框模塊存放在 MESSBOX H 和 MESSBOX C 文件中 主要調(diào)用函數(shù)聲明如下 int MessageBox char messtr char title MESSAGETYPE choice 參數(shù)說明 char messstr 為信息字符串 不能為空 10 35 char title為標(biāo)題字符串 可以為空 或 NULL MESSTYPEINFO choice為按鈕類型選擇參數(shù) 共有以下幾種選擇 Q YESNO 1Q YESQ YESNOCANCEL IN YESNOIN YESIN YESNOCANCELIN OK IM YESNOIM YESIM YESNOCANCEL E YESNOE YESE YESNOCANCELE OK INPUT 其中 Q xxx 為疑問對話框 Questioning IN xxx 為信息對話框 Information IM xxx 為重要信息對話框 Important information E xxx 為錯誤對話框 Error 特別 地 INPUT 為輸入對話框的入口參數(shù) 返回值說明 如果選擇左邊第一的按鈕 返回 1 左邊第二個按鈕 返回 2 以此類推 顯示輸顯示輸出出模塊模塊 顯示輸出模塊主要采用直接寫視屏內(nèi)存的方法來實現(xiàn) 通過視屏的端口 0 x3ce 0 x3cf 0 x3c4 0 x3c5 和視屏的內(nèi)存地址 0 xa0000000 的直接操作來組成視屏顯示的一系 列函數(shù) 雖然通過直接寫視屏的方式來實現(xiàn)的函數(shù)有一些移植性問題 但是大大提高了顯 示的速度 在魚和熊掌不可兼得的情況下只好采取這樣的措施 文件列表文件列表 LIST C內(nèi)核數(shù)據(jù)操作函數(shù)庫 CURSOR C光標(biāo)操作函數(shù)庫 EDITOR C鍵盤操作 IMD C輸入法操作函數(shù)庫 MAIN C主過程 OPENDLG C 打開 對話框的程序文件 UNDO CUndo 的程序文件 GOUTPUT H漢字顯示的函數(shù)文件 WINFUNC H窗口繪制的函數(shù)文件 FACE C界面的程序文件 HZK16漢字庫文件 XMS OBJ OBJ WB IMD五筆輸入法文件 PY IMD拼音輸入法文件 11 35 功能模塊函數(shù)列表功能模塊函數(shù)列表 LIST C 該文件中提供如下的功能函數(shù) 列表 函數(shù)名稱參數(shù)聲明功能介紹 InitDocument 初始化文檔 void InitLinenote LINE NOTE ln void InitDocument void AppendLine void AppendChar char c char c1 int AppendString const char s int option添加一個字符串 option 為 1 在末尾添加 option 為 0 在當(dāng)前位置添加 void ReleaseAll 釋放所有節(jié)點(diǎn) int NextLine 當(dāng)前行指針下移 int PreLine 當(dāng)前行指針上移 int GetLineLength 取得當(dāng)前行的長度 int GetLines 取得總行數(shù) int SeekLine int LineNo 按行號移動指針 int SeekLineTail 移動到最末行 int SeekLineHead 移動到首行 int SeekHead 移動到當(dāng)前行的開始 int SeekTail 移動到當(dāng)前行的最末節(jié)點(diǎn) int NextChar 下一個字符 int PreChar 前一個字符 int SeekChar int x 按標(biāo)號移動指針 int IsEmptyLine 測試該行是否為空 void InsertAfter char c char c1后插一個節(jié)點(diǎn) void InsertBefore char c char c1前插一個節(jié)點(diǎn) void DeleteBefore 刪除前一個節(jié)點(diǎn) void DeleteChar 刪除當(dāng)前節(jié)點(diǎn) void DeleteHead 刪除一行最先的一個節(jié)點(diǎn) void DeleteTail 刪除一行最后的一個節(jié)點(diǎn) void DisplayLine 顯示一行 int Free CHAR NOTE p 釋放節(jié)點(diǎn)空間 int WriteTxt char filename寫入文件 void InsertLineAfter 在當(dāng)前行后插一行 void EnterLine 在當(dāng)前實現(xiàn)換行功能 即把 當(dāng)前字符以后的字符下移一 行 12 35 void DeleteCurrentLine N A刪除當(dāng)前行 void Delete CHAR NOTE pChar刪除當(dāng)前字符 int Undo N A實現(xiàn) Undo 功能 void SetBlock int x1 int y1 int x2 int y2設(shè)置塊 void ClearBlock N A清除定義的塊 其中 Document 是由 DOCUMENT 的結(jié)構(gòu)體定義的變量 DOCUMENT 定義如下 struct DOCUMENT type LINE NOTE pHead LINE NOTE pTail LINE NOTE pCur 當(dāng)前行的指針 CHAR NOTE pCChar 點(diǎn)前字符指針 int Caretx int Lines 其中 pCur 指向當(dāng)前接受操作的一行 pCChar 指向當(dāng)前行中接受操作的一個字符 若為 NULL 則指向該行的最末 SeekChar NextChar PreChar SeekLine NextLine PreLine 等函數(shù)都是設(shè)定 pCChar 和 pLine 的函數(shù) 一些插入 刪除的函數(shù)要求在之前將 pCur 和 pCChar 設(shè)置好 EDITOR C 函數(shù)名稱參數(shù)聲明功能介紹 void DisplayAll int Lines 顯示當(dāng)前頁的模塊 void KeyUp 光標(biāo)鍵控制模塊 void KeyDown void KeyLeft void KeyRight void KeyEnter 回車換行控制模塊 void KeyEsc ESC 鍵控制模塊 void KeyCtrl Y 刪除一行 Ctrl Y 控制模塊 void KeyPagedown 翻頁控制模塊 void KeyPageup void KeyF3 快控制模塊 void KeyF4 void KeyF5 void KeyBackspace 回退鍵控制模塊 void KeyDelete 刪除鍵控制模塊 void KeyHome 將光標(biāo)移到行首 void KeyEnd 將光標(biāo)移到行末 void KeyCtrl Z Undo 模塊 int QuitBox 退出詢問模塊 13 35 int SaveBox 保存文件對話框 void CheckXY 檢查坐標(biāo)函數(shù) void AddChar char c 添加一個字符模塊 void AddString char s 添加字符串模塊 void EditorInit 編輯器初始化模塊 void Processor 編輯環(huán)境的主要處理模塊 int ScrollDown int n 滾屏函數(shù) int ScrollUp int n void Gotoxy int x int y 移動光標(biāo)函數(shù) void SetBlockStart 設(shè)置塊的起始和終點(diǎn)模塊 void SetBlockEnd void MakeBlock 生成一個塊 int Load char Filename 讀入一個文件 BITMAP H I How come 當(dāng)我們在設(shè)計圖形按鈕和菜單功能的時候 首先考慮使用即時繪圖來實現(xiàn)各種動態(tài)效 果 然而即時繪圖有很多缺憾 在程序中加入鼠標(biāo)支持后 即時繪圖會受鼠標(biāo)的影響 具體就是鼠標(biāo)指針也是位 圖 在繪圖時可能鼠標(biāo)指針會遮蓋部分區(qū)域?qū)е吕L圖函數(shù)不能正常工作 從而留 下這些區(qū)域沒有正常顯示 除非經(jīng)常刷新 繪圖函數(shù)是通過一個一個像素畫到屏幕上去的 可見效率是比較低的 因此 我們需要有能夠快速地把圖片顯示到屏幕上 通常有兩種做法 1 直接寫入屏 幕緩沖區(qū) 但使用了 Turbo C C 的圖形庫之后就不行了 我們這個程序已經(jīng)使用了圖形 庫 再更改就太 2 使用 Turbo C C 提供的一些直接寫屏的函數(shù) getimage putimage imagesize 這些函數(shù)是能夠?qū)崿F(xiàn)動畫效果的 但是我的想法是能夠動 態(tài)的生成菜單項 即根據(jù)菜單項中字符串的大小來決定菜單項的大小 于是就考慮自己來 生成 Turbo C C 使用的 Bitmap Buffer II Crack it 要直接生成 Bitmap Buffer 必然需要了解它的結(jié)構(gòu)和各方面的細(xì)節(jié) 然而 Borland 公 司從來就沒有仔細(xì)的描述 getimage 函數(shù)所使用的圖形緩沖 只是給出前兩個字分別是圖片 的寬和高 沒辦法了 破解吧 也好過過做個軟件黑客的癮 呵呵 14 35 首先 做個程序?qū)?16 種色素分別畫到屏幕上 原為豎立的 現(xiàn)將它橫過來便于顯示 將它用 getimage 保存到一塊內(nèi)存區(qū)域中 并且一個字節(jié)一個字節(jié)地顯示出來 00000f00 圖片的寬 width 和高 height 00000000 Palette 0 默認(rèn)為 BLACK 00000080 Palette 1 BLUE 00008000 Palette 2 GREEN 00008080 Palette 3 CYAN 00800000 Palette 4 RED 00800080 Palette 5 MAGENTA 00808000 Palette 6 BROWN 00808080 Palette 7 LIGHTGRAY 80000000 Palette 8 DARKGRAY 80000080 Palette 9 LIGHTBLUE 80008000 Palette 10 LIGHTGREEN 80008080 Palette 11 LIGHTCYAN 80800000 Palette 12 LIGHTRED 80800080 Palette 13 LIGHTMAGENTA 80808000 Palette 14 YELLOW 80808080 Palette 15 WHITE 0000 結(jié)束字 明白了嗎 Turbo C C 定義了 16 種調(diào)色板顏色通過四個字節(jié)來表示 哪種顏色使用 哪些字節(jié)一目了然吧 這些是通過一條豎直的 16 色線得到的 那么畫一條橫線的情況會是 怎么樣呢 好 首先畫一條 8 個像素的藍(lán)色橫線 再次用 getimage 的方法將緩沖區(qū)的字節(jié)都顯示出來 07000000 同上 但這次寬是 7 1 個像素 高為 1 個像素 000000FF 看到了吧 對比上文 藍(lán)色像素只同第四個字節(jié)相關(guān)哦 0000 15 35 通過以上的例子 我們已經(jīng)對 Turbo C C 的圖形緩沖區(qū)有了初步的了解 接下來 嗯 當(dāng)然是更深入的研究 呵呵 我們要從一個井底之蛙變成一只活蹦亂跳的青蛙哦 OK Let s go 通過再次的試驗 我們將藍(lán)色橫線伸長為 16 個像素 或者其它大于 8 個像素也可 主要用于驗證 我們會發(fā)現(xiàn)緩沖區(qū)變?yōu)?0F000000 寬為 15 1 個像素 000000000000FFFF 奇怪吧 為什么呢 0000 呵呵 這就是 Borland 公司的大師們設(shè)下的陷阱哦 一不小心就會迷失方向 其實那 是相當(dāng)容易的一個問題 那就是 等一下 別急 讓我們來具體探討一番 首先 在圖形緩沖區(qū)中 像素信息是一行一行記載的 每一行又由許多組數(shù)據(jù)組成 每一組數(shù)據(jù)由四個字節(jié)組成 并且一組數(shù)據(jù)可以保存 8 個像素 那么 每四個字節(jié)又是如 何保存 8 個像素的信息的呢 從上文可以知道 每一種調(diào)色板顏色在這四個字節(jié)中對應(yīng)特 定的幾個字節(jié) 而且一組數(shù)據(jù)中的第一個像素在對應(yīng)字節(jié)上的第一位設(shè)為 1 第二個像素 在第二位設(shè)為 1 以此類推 若還搞不明白 請看下面的圖示 00 第一個字節(jié) 00 第二個字節(jié) 00 第三個字節(jié) FF 第四個字節(jié) 第四個字節(jié)全賦值為 1 說明橫向連續(xù)畫 8 個藍(lán)點(diǎn) 如果有顏色不相同的像素彼此交錯呢 呵呵 很簡單 也是按照這個規(guī)律 第幾個像素就在其對應(yīng)字節(jié)的第幾位上設(shè)為 1 其次 各組像素信息設(shè)置好以后 需要將每組的四個字節(jié)交錯排列 也就是先第一組 的第一個字節(jié) 第二組的第一個字節(jié) 第一組的第二個字節(jié) 第二組的第二個字節(jié) 第一組的第三個字節(jié) 第二組的第三個字節(jié) 以此類推 再次 當(dāng)一行信息處理完成后 不管其是否有多余 都重新建立新的一行 總之 緩 沖區(qū)的每一行都是互不相關(guān)的 16 35 至此 Turbo C C 的圖形緩沖區(qū)中像素信息在橫向和縱向上的表示方法 我們都已經(jīng) 搞清楚了 現(xiàn)在 我想大家都有點(diǎn)摩拳擦掌了吧 讓我們來小試身手 下面是一張簡單的 圖片 分辨率是 16 5 0f000400 注意寬和高分別為原圖片減 1 0efb0efb0efbffff 7efb7efb7efbffff 782078207820ffff 7efb7efb7efbffff 0efb0efb0efbffff 0000 這個例子能充分理解了嗎 先用 2 進(jìn)制編碼 再轉(zhuǎn)成 16 進(jìn)制 好 我們繼續(xù)我們的 征程 III First Use the Power 通過上面的 潛心研究 之后 我就開始動手編了一系列的函數(shù)來處理 Turbo C C 的 圖形緩沖區(qū) 還有個函數(shù)直接將 Windows 的 BMP 文件 這個格式最簡單嘛 轉(zhuǎn)成圖形緩 沖區(qū)的格式 以便直接調(diào)用 putimage 將其顯示在屏幕上 以下是一些函數(shù)的說明 1 1 void far LoadImage char pszFileName 將文件名為 pszFileName 的 16 色 BMP 文件裝載到圖形緩沖區(qū) 返回值為圖形緩沖區(qū) 的指針地址 注意 ceil 寬度 8 4 高度 6 的大小要求不能超過 64KB 2 2 void SetPalette FILE pFile 根據(jù) 16 色 BMP 文件的調(diào)色板來設(shè)置 VGAHI 模式下的調(diào)色板 pFile 為文件句柄的指 針 3 3 void ConvertLine BYTE pbBMPLine BYTE pbLine BYTE bBMPLineSize BYTE bLineSize 將一行 BMP 像素信息轉(zhuǎn)成圖形緩沖格式 1 pbBMPLine 為 BMP 文件一行數(shù)據(jù)的指針 17 35 2 pbLine 為該行圖形緩沖區(qū)的指針 3 bBMPLineSize 為 BMP 文件該行數(shù)據(jù)的字節(jié)數(shù) 4 bLineSize 為該行圖形緩沖區(qū)的字節(jié)數(shù) 4 4 void ConvertPixels BYTE pbBMPGroupInfo BYTE pbGroupInfo BYTE bBMPGroupSize 將一行中的一組 BMP 像素信息 8 個像素 轉(zhuǎn)換成圖形緩沖格式 1 pbBMPGroupInfo 為 BMP 文件該行中一組像素數(shù)據(jù)的指針 2 pbGroupInfo 為該組圖形緩沖區(qū)的指針 3 bBMPGroupSize 為 BMP 文件該組數(shù)據(jù)的字節(jié)數(shù) 由于 BMP 文件最后一組像素 是實際的字節(jié)數(shù) 即 2 個像素每字節(jié) 然而圖形緩沖區(qū)無論一組有多少像素 小于等于 8 個 都是四個字節(jié) 故要設(shè)定 BMP 文件在該組像素數(shù)據(jù)的字節(jié)數(shù) 5 5 void far CreateBuffer WORD wWidth WORD wHeight BYTE bBkColor 根據(jù)給定的寬度 wWidth 高度 wHeight 來創(chuàng)建一個圖形緩沖區(qū) 背景色是 bBkColor 所指定的顏色 注意 ceil 寬度 8 4 高度 6 的大小要求不能超過 64KB IV Future Improvement 以后可以針對 Turbo C C 的圖形緩沖區(qū) 編寫一系列的繪圖函數(shù) 如畫點(diǎn) 畫線 畫圓等等 有了這些函數(shù) 我們就可以動態(tài)地修改緩沖區(qū) 即時地改變緩沖區(qū)的內(nèi)容 以 便能夠用 putimage 輕而易舉地直接把改變的畫面顯示到屏幕上 相信這樣做還是有一定的 應(yīng)用價值的 呵呵 只是現(xiàn)在 Windows 如日中天 托胎于 Dos 卻又大義滅親 而 Dos 已經(jīng)無人問津了啊 WINFUNC H I Design Purpose 在 遙遠(yuǎn) 的過去 Dos 下的編輯器很少有漂亮的圖形界面 而現(xiàn)在 我們習(xí)慣了 Win dows 下花哨絢麗的界面 回過頭來制作 Dos 下的文本編輯器 不來點(diǎn)圖形化的見 面 難免有點(diǎn)對不起我們的視網(wǎng)膜 至少是有點(diǎn)不習(xí)慣吧 于是 我們決定制作一個在 Turbo C C 的圖形模式 VGAHI 640 480 16 色模式 下的中文圖形編輯器 時下 流行模塊化 面向?qū)ο蠡某绦蛟O(shè)計方法 但我們是用 C 語言來編寫這個軟件 就不可能大量地使用 C 的面向?qū)ο蟮囊?因此 我就只是設(shè)計了這個頭文件 里面包 含了 窗體 按鈕 菜單的結(jié)構(gòu) 以及對這些對象操作的一系列函數(shù) 18 35 II The Data Structure 由于我使用了一些面向?qū)ο蟮乃枷?因此也不免要建立包含這些對象具體屬性的結(jié)構(gòu) 下面是我建立的數(shù)據(jù)結(jié)構(gòu)以及它們的介紹 1 窗體結(jié)構(gòu) struct Window WORD wX 左上角 X 坐標(biāo) WORD wY 左上角 Y 坐標(biāo) WORD wWidth 寬度 WORD wHeight 高度 BYTE bColor 前景色 BYTE bBackColor 背景色 BYTE bTopColor 上邊框顏色 BYTE bBottomColor 下邊框顏色 BYTE bLeftColor 左邊框顏色 BYTE bRightColor 右邊框顏色 typedef struct Window WINDOW typedef struct Window PWINDOW 2 按鈕結(jié)構(gòu) struct Button char pszTitle 名稱 WORD wX 左上角 X 坐標(biāo) WORD wY 左上角 Y 坐標(biāo) WORD wWidth 寬度 WORD wHeight 高度 BYTE bColor 前景色 BYTE bBorderColor 邊框顏色 BYTE bBackColor 背景色 BYTE bMouseOver 判斷鼠標(biāo)是否在按鈕上 struct Button pBack 上一個按鈕指針 struct Button pNext 下一個按鈕指針 struct Menu pMenu 對應(yīng)的菜單指針 typedef struct Button BUTTON 19 35 typedef struct Button PBUTTON 按鈕數(shù)據(jù)結(jié)構(gòu)示意圖 按鈕 1 按鈕 2 按鈕 3 按鈕 N 3 菜單項結(jié)構(gòu) struct MenuItem char pszTitle 名稱 void far pFunction 包含的指向函數(shù)的指針 struct MenuItem pNext 下一個菜單項指針 typedef struct MenuItem MENUITEM typedef struct MenuItem PMENUITEM 4 菜單樣式結(jié)構(gòu) struct MenuStyle BYTE bColor 前景色 BYTE bBorderColor 邊框顏色 BYTE bBackColor 背景色 BYTE bItemColor 菜單項顏色 typedef struct MenuStyle MENUSTYLE typedef struct MenuStyle PMENUSTYLE 5 菜單結(jié)構(gòu) struct Menu WORD wWidth 寬度 WORD wHeight 高度 BYTE bNo 當(dāng)前指向第幾個菜單項 BYTE bNum 菜單項的數(shù)量 BYTE bShown 判斷菜單是否被顯示 struct MenuStyle pStyle 對應(yīng)的菜單樣式指針 struct MenuItem pFirst 指向第一個菜單項 void far pCovered 菜單所覆蓋的屏幕緩沖的指針 void far pLightBar 菜單項亮條圖形緩沖的指針 20 35 typedef struct Menu MENU typedef struct Menu PMENU 菜單數(shù)據(jù)結(jié)構(gòu)示意圖 菜單 1 菜單項 1 菜單項 2 菜單項 N 菜單樣式 菜單 2 菜單樣式可以為多個菜單共享 II The Functions 建立了數(shù)據(jù)結(jié)構(gòu)之后 就著手開始大刀闊斧地進(jìn)行編寫函數(shù)的最后攻堅戰(zhàn)了 以下是 一系列的函數(shù) 1 窗體函數(shù) void CreateWindow char pszTitle PWINDOW pWindow int hasStatusBar 根據(jù)給定的窗體標(biāo)題 定義好的窗體結(jié)構(gòu)來創(chuàng)建一個窗體 并顯示在屏幕上 1 pszTitle 為窗體的標(biāo)題 2 pWindow 為窗體結(jié)構(gòu)的指針 3 hasStatusBar 決定窗體是否帶有狀態(tài)欄 void CopyWindow PWINDOW pWindow 將所給窗體所將要覆蓋的屏幕區(qū)域保存到一個圖形緩沖區(qū) pWindow 為所給窗體的 指針 返回值為指向該圖形緩沖區(qū)的指針 void HideWindow PWINDOW pWindow void pCovered 將顯示的窗體隱藏起來 1 pWindow 為所要隱藏的窗體 2 pCovered 為預(yù)先保存的屏幕區(qū)域 2 按鈕函數(shù) void CreateButton PBUTTON pButton 根據(jù)定義好的按鈕結(jié)構(gòu)來創(chuàng)建一個按鈕 并顯示在屏幕上 pButton 為按鈕結(jié)構(gòu)的 指針 21 35 PBUTTON AddButton char pszTitle PBUTTON pButton PMENU pMenu WORD x WORD y BYTE bColor BYTE bBorderColor BYTE bBackColor 增加一個按鈕在一個按鈕鏈表 雙向鏈表 中 1 pszTitle 為所加按鈕的名稱 2 pButton 為按鈕鏈表中的前一個按鈕 3 pMenu 為所加按鈕所對應(yīng)的菜單的指針 4 x 為所加按鈕左上角的 X 坐標(biāo) 5 y 為所加按鈕左上角的 Y 坐標(biāo) 6 bColor 為所加按鈕的前景色 7 bBorderColor 為所加按鈕的邊框顏色 8 bBackColor 為所加按鈕的背景色 函數(shù)返回值為所增加的按鈕的指針 PBUTTON SearchButton char pszTitle PBUTTON pButton 根據(jù)給定的字符串 在按鈕鏈表中搜索所需的按鈕 1 pszTitle 為要搜索按鈕的名稱 2 pButton 為按鈕鏈表中任意一個按鈕皆可 函數(shù)返回值為所需按鈕的指針 void SetButtonUp PBUTTON pButton 將 pButton 所指向的按鈕設(shè)置為按鈕浮起狀 void SetButtonDown PBUTTON pButton 將 pButton 所指向的按鈕設(shè)置為按鈕按下狀 void SetButtonBack PBUTTON pButton 將 pButton 所指向的按鈕設(shè)置為原狀 PBUTTON ChooseButton char pszTitle PBUTTON pButton PBUTTON pBtnHead 根據(jù)給定的字符串 將按鈕鏈表中的指定的按鈕設(shè)置為浮起狀 并將對應(yīng)的菜單都 顯示出來 這是用來實現(xiàn)菜單功能的函數(shù) 1 pszTitle 為要搜索按鈕的名稱 2 pButton 為當(dāng)前已經(jīng)選定的按鈕 需要將其恢復(fù)原狀用 否則置為 NULL 3 pBtnHead 為按鈕鏈表中任意一個按鈕的指針作為頭指針 函數(shù)返回值為新選擇的按鈕指針 PBUTTON GoButtonLeft PBUTTON pButton 將按鈕和菜單選擇向左移動 pButton 為當(dāng)前顯示的按鈕 這也是用來實現(xiàn)菜單功 能的函數(shù) PBUTTON GoButtonRight PBUTTON pButton 將按鈕和菜單選擇向右移動 pButton 為當(dāng)前顯示的按鈕 這也是用來實現(xiàn)菜單功 22 35 能的函數(shù) 3 菜單函數(shù) void DisplayMenu PMENU pMenu PBUTTON pButton 顯示所指定的菜單 1 pMenu 為菜單的指針 2 pButton 為對應(yīng)菜單的按鈕的指針 用來決定菜單的坐標(biāo) void HideMenu PMENU pMenu PBUTTON pButton 隱藏所指定的菜單 1 pMenu 為菜單的指針 2 pButton 為對應(yīng)菜單的按鈕的指針 用來決定菜單的坐標(biāo) PMENUITEM AddMenuItem char pszTitle PMENU pMenu void far pFunction 根據(jù)給定字符串作為菜單項名 增加一項菜單項 1 pszTitle 為菜單項名 2 pMenu 為菜單項所在的菜單的指針 3 pFunction 為函數(shù)的指針 用以實現(xiàn)菜單項的功能 函數(shù)返回值為新增加的菜單項的指針 void SelectMenu PMENU pMenu PBUTTON pButton int iNo 選擇菜單的某一菜單項 即將光條移到該菜單項 1 pMenu 為菜單項所在菜單的指針 2 pButton 為菜單對應(yīng)的按鈕的指針 用以給出菜單的坐標(biāo) 3 iNo 決定第幾個菜單項 void UnSelectMenu PMENU pMenu PBUTTON pButton int iNo 取消菜單項的選擇 除去光條 各參數(shù)同上 void GoMenuUp PMENU pMenu PBUTTON pButton 將菜單的光條向上移動 1 pMenu 為所在菜單的指針 2 pButton 為菜單對應(yīng)的按鈕的指針 用以給出菜單的坐標(biāo) void GoMenuDown PMENU pMenu PBUTTON pButton 將菜單的光條向下移動 各參數(shù)同上 void ClickMenu PMENU pMenu PBUTTON pButton 實現(xiàn)當(dāng)前光條所在菜單項的功能 菜單項結(jié)構(gòu)所含的函數(shù) 各參數(shù)同上 23 35 III Apply The Header 以上將結(jié)構(gòu)和函數(shù)都一一給大家 觀賞 了一番 不來點(diǎn)實際的總是不完滿的 對嗎 下面 我為編輯器所制作的界面 face c 就是這些的實際應(yīng)用 1 各常量的定義 由于界面結(jié)合了鍵盤操作 所以定義了一些鍵盤鍵碼 2 全局變量的定義 1 MainWin 為編輯器的主窗體 2 AboutWin 為關(guān)于窗體 3 MenuStyle 為菜單樣式 4 MenuFile MenuEdit MenuSearch 為各菜單 5 pBtnHead 為按鈕鏈表的頭指針 6 pCurrentBtn 代表當(dāng)前選擇的按鈕 7 pCurrentMenu 代表當(dāng)前顯示的菜單 3 創(chuàng)建編輯器的界面 1 void SetMenus void 函數(shù)用于建立各菜單 使用 AddMenuItem 函數(shù)來添加各菜單項 具體使用參照前面的函數(shù)說明 2 void SetButtons void 函數(shù)用于建立按鈕鏈表 使用 AddButton 函數(shù)將所要添加的按鈕組成一個雙向鏈表 便于按鈕的操作 3 int InitEditorInterface void 函數(shù)用于啟動編輯器的界面 4 界面的操作與管理 原本還加入了鼠標(biāo)的支持 mouse h 由于 Windows 2000 下 DOS 圖形模式 下 鼠標(biāo)指針不能正常顯示 而且也沒有比較好的解決方法 還有就是鼠標(biāo)的操作也 比較麻煩 這也是很重要的一條啊 呵呵 因此 界面的操作僅限于鍵盤操作 鍵盤的操作應(yīng)用了消息的循環(huán)方法 通過 kbhit 檢測是否有按鍵消息 若有 則 使用分支結(jié)構(gòu)來處理各個消息 按鍵健碼 5 主要就是這些了 24 35 GOUTPUT H 功能介紹 參數(shù)說明 void InitialzeGraph void 初始化整個圖形輸出函數(shù)庫 void FinishMission void 圖形輸出函數(shù)庫的析構(gòu)函數(shù) char far ObtainAddress void 獲得 ROM 中 ASCII 碼的地址 void DisableCursor void 禁止光標(biāo)的顯示 void EnableCursor void 允許表表的顯示 void ShowCursor unsigned int x unsigned int y x y 分別為光標(biāo)左 上角的 x 和 y 坐 標(biāo) 顯示光標(biāo) void RecoverCursor unsigned int x unsigned int y x y 分別為光標(biāo)左 上角的 x 和 y 坐 標(biāo) 恢復(fù)光標(biāo)顯示位置的圖像 void interrupt far CursorHandler 顯示光標(biāo)的時間中段句柄的函數(shù) int Locate unsigned int x unsigned int y x y 分別為光標(biāo)左 上角的 x 和 y 坐 標(biāo) 坐標(biāo)定位 int CursorLeft void 光標(biāo)左移 int CursorRight void 光標(biāo)右移 int CursorUp void 光標(biāo)上移 int CursorDown void 光標(biāo)下移 unsigned int GetScreenX void 獲取光標(biāo) x 軸位置 unsigned int GetScreenY void 獲取光標(biāo) y 軸位置 void SetSpaceLine unsigned int n n 為行數(shù)清第 n 行 void SetSpaceClientLine unsigned int n n 為列數(shù)清當(dāng)前行第 n 列后的所有字符 void ScrollWindowUp unsigned int n n 為行數(shù)顯示區(qū)域上滾到第 n 行 void ScrollWindowDown unsigned int n n 為行數(shù)從第 n 行后顯示區(qū)域下滾 void GPutc unsigned char s1 unsigned char s2 字符的第一 個內(nèi)碼 若字符 為 ASCII 則 s1 位字符的 ASCII 碼 s2 0 若字符 為漢字則 s1 s2 分別為漢字的區(qū) 位碼 顯示字符 包括 ASCII 和漢字 25 35 void GetHZ char incode char bytes incode 漢字 的內(nèi)碼數(shù)組 前 兩個字節(jié)有用 bytes 返回漢字 字模的數(shù)組 獲取漢字字模 void CloseHZK 關(guān)閉漢字字模庫文件 void OpenHZK void 打開漢字字模庫文件 void PutASCColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐標(biāo) s 為字符 的 ASCII 碼 color bkcolor 為 字符的前景色和 背景色 在特定位置用特定顏色顯示 ASCII 字符 void PutCNColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐標(biāo) s 為漢字 內(nèi)碼的指針 color bkcolor 分 別為字符的前景 色和背景色 在特定位置用特定顏色顯示漢字 字符 void GPuts unsigned char s 字符串的指針顯示字符串 void GPutsColor unsigned int x0 unsigned int y0 unsigned char s unsigned int color unsigned int bkcolor x0 y0 位字符的 坐標(biāo) s 為字符 串的指針 color bkcolor 分 別為字符的前景 色和背景色 在特定位置用特定顏色顯示字符 串 IMD H BYTE GetColor BYTE data BYTE forecolor BYTE backcolor BYTE i void Bar int x int y int w int h int bkcolor 清一矩形 int LIMD BYTE file int i 裝入漢字輸入法 IMD 文件 WORD GetInputWord BYTE buf 取用戶輸入的漢字或 ASCII 字符 void GetWord BYTE BYTE int IsInTable BYTE c void ShowCodeMsg BYTE s 在提示行顯示漢字編碼字符 void SetIMD int i 設(shè)置當(dāng)前所用的漢字輸入方法 26 35 void SetWordMode 設(shè)置全半角 熱鍵為 Ctrl F9 void ShowCwordMsg BYTE s 在提示顯示輸入的漢字 void ClearShowCword 清顯示輸入重碼漢字提示區(qū) void ClearShowCode 清顯示編碼提示區(qū) WORD InitializeIMD void 初始化函數(shù) void IMD void 析構(gòu)函數(shù) BYTE GetErrorCode 取錯誤代碼 功能函數(shù)的算法說明功能函數(shù)的算法說明 部分部分 AppendChar 在末尾追加一個字符在末尾追加一個字符 執(zhí)行該操作時 主要有兩種情況 1 pEnd 不為空 pEnd pNext pNewChar 2 pEnd 為空 說明該行沒有節(jié)點(diǎn) 這是只要添加一個節(jié)點(diǎn)即可 void interrupt far CursorHandler 顯示光標(biāo)的時間中顯示光標(biāo)的時間中 段句柄的函數(shù)段句柄的函數(shù) 本函數(shù)在圖形顯示函數(shù)初始化過程中被設(shè)置成時間中段程序 本函數(shù)有一個計算本函 27 35 數(shù)執(zhí)行次數(shù)的全局變量 HandlerTimes 時間中段每秒鐘執(zhí)行 18 5 次 每執(zhí)行一次時間中 段 HandlerTimes 就加一 當(dāng) HandlerTimes 的值為 3 時 就執(zhí)行一次函數(shù)中顯示光標(biāo)的函 數(shù) ShowCursor 或恢復(fù)光標(biāo)圖像的函數(shù) RecoverCursor 于是每經(jīng)過大約 1 3 秒的時間 光標(biāo)就閃爍一次 而程序中是如何確定要顯示還是要恢復(fù)光標(biāo)呢 程序模塊中有一個全局變量 flag 他被初始化為 0 當(dāng) flag 為 0 并且光標(biāo)的位置不超出 顯示區(qū)域時 就調(diào)用顯示光標(biāo)的函數(shù) ShowCursor 然后把 flag 設(shè)為 1 當(dāng) flag 為 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025家具購買合同范本
- 2025家電購買合同樣本
- 2025年國家電網(wǎng)招聘之電工類通關(guān)考試題庫帶答案解析
- 2025年度出版物銷售合同協(xié)議
- 鐮刀型細(xì)胞貧血病的臨床護(hù)理
- 浙江國企招聘2025衢州常山縣農(nóng)村投資集團(tuán)有限公司招聘15人筆試參考題庫附帶答案詳解
- 浙江國企招聘2025浙江省安全生產(chǎn)科學(xué)研究有限公司招聘28人筆試參考題庫附帶答案詳解
- 2025養(yǎng)殖場經(jīng)營租賃合同
- 歙縣二中大考試卷及答案
- 陜西高一聯(lián)考試卷及答案
- 2025年高考?xì)v史總復(fù)習(xí)高中歷史必修二八大專題知識復(fù)習(xí)提綱
- 2025事業(yè)單位考試題庫及答案200題
- 臨床執(zhí)業(yè)醫(yī)師考試健康教育技能試題及答案
- 機(jī)車車輛試題及答案
- 地理澳大利亞課件-2024-2025學(xué)年人教版(2024)初中地理七年級下冊
- 常用施工規(guī)定和技術(shù)要求1
- 旅游景區(qū)娛樂服務(wù)設(shè)計
- 亞馬遜店鋪轉(zhuǎn)讓合同標(biāo)準(zhǔn)文本
- T-CQAP 4002-2024 醫(yī)療安全(不良)事件根本原因分析法活動指南
- 利用科學(xué)史進(jìn)行高中生物學(xué)主線式情境教學(xué)的實踐研究
- 2025年高考作文備考:十大熱點(diǎn)人物事跡+高分素材
評論
0/150
提交評論