![哈工大計(jì)算機(jī)系暑期實(shí)踐項(xiàng)目UCE.doc_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/9/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb1.gif)
![哈工大計(jì)算機(jī)系暑期實(shí)踐項(xiàng)目UCE.doc_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/9/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb2.gif)
![哈工大計(jì)算機(jī)系暑期實(shí)踐項(xiàng)目UCE.doc_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/9/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb3.gif)
![哈工大計(jì)算機(jī)系暑期實(shí)踐項(xiàng)目UCE.doc_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/9/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb4.gif)
![哈工大計(jì)算機(jī)系暑期實(shí)踐項(xiàng)目UCE.doc_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-3/9/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb/a23bb2ae-a0d5-4dbd-b7c8-3fdaab1f3ebb5.gif)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1 35 Ultimate Chinese Editor 文檔文檔 Documents of UCE 1 0 哈爾濱工業(yè)大學(xué)計(jì)算機(jī)系哈爾濱工業(yè)大學(xué)計(jì)算機(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對(duì)話框模塊 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ù)的算法說(shuō)明功能函數(shù)的算法說(shuō)明 部分部分 25 APPENDCHAR 在末尾追加一個(gè)字符 25 VOID INTERRUPT FAR CURSORHANDLER 顯示光標(biāo)的時(shí)間中段句柄的函數(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 問(wèn)題解決及存在的問(wèn)題問(wèn)題解決及存在的問(wèn)題 30 個(gè)人感受個(gè)人感受 30 虛空中的執(zhí)著 30 感受團(tuán)隊(duì) ENJOY TEAMWORK 31 經(jīng)驗(yàn)及教訓(xùn)經(jīng)驗(yàn)及教訓(xùn) 32 致謝致謝 32 附錄附錄 32 西文方式下掛接 UCDOS 5 0 中的萬(wàn)能漢字輸入法 32 4 35 關(guān)于本軟件關(guān)于本軟件 軟件描述軟件描述 軟件中文名稱 中文編輯器 軟件英文名稱 Ultimate Chinese Editor 運(yùn)行環(huán)境 DOS 環(huán)境 編寫語(yǔ)言 C 編譯環(huán)境 Turbo C V1 0 版本 Version 1 0 背景背景 本軟件是哈爾濱工業(yè)大學(xué)計(jì)算機(jī)系 2001 級(jí)本科生的年級(jí)作業(yè)作品 2001 年 7 月 和為等計(jì)算機(jī)系 2001 級(jí) 7 名本科生在關(guān)毅關(guān)毅老師的領(lǐng)導(dǎo)下組成開發(fā)小組 利用假期時(shí)間完成兩個(gè)題目 通訊錄和編輯器 本軟件即是編輯器小組的作品 此次活動(dòng)的目 的是 通過(guò)年級(jí)大作業(yè)形式的活動(dòng)來(lái)培養(yǎng)互相協(xié)作 互相配合的團(tuán)隊(duì)精神 通過(guò)活動(dòng)中的 實(shí)際練習(xí)來(lái)加深已學(xué)知識(shí)的理解 同時(shí)又增加了學(xué)習(xí)新知識(shí)的樂趣 如果加學(xué)分就更好了 關(guān)老師考慮到 2001 級(jí)本科生所學(xué)的專業(yè)課有限 高級(jí)語(yǔ)言課程僅涉及 C 語(yǔ)言 要求軟件 的所有代碼用 C 編寫 這個(gè)編輯器的所有代碼可在 TurboC v1 0 中編譯通過(guò) Turbo C V1 0 是 Borland 公 司的產(chǎn)品 編輯環(huán)境比 TurboC2 0 有較大的改善 而且對(duì) C 支持的非常好 故此成為我們 的首選 而且我們還用工程管理 使各自的模塊相對(duì)獨(dú)立 方便管理 軟件的主要特色軟件的主要特色 Ultimate Chinese Editor V1 0 具有以下幾方面特色 較強(qiáng)的處理中文的能力 對(duì)中文整體識(shí)別 您不會(huì)看到 半個(gè)漢字 引起的屏幕 混亂 能夠脫離漢字系統(tǒng) 有獨(dú)立的輸入法 讓您在沒有漢字系統(tǒng)的情況下能夠自由錄 入 編輯文本 支持塊操作 有比較友好的界面 有提示對(duì)話框 幫助您更好的編輯 提供源代碼 期望與您交流 貽笑大方了 有詳細(xì)的文檔 值得一看哦 不是吹牛吧 5 35 參與人員 本軟件 參與人員 本軟件 楊碧輝 0103111 班 負(fù)責(zé)顯示模塊部分frozenwind 陳奐章 0103112 班 負(fù)責(zé)菜單和界面部分hanzac 高立琦 0103113 班 負(fù)責(zé)數(shù)據(jù)操作 管理模塊部分gao lq 功能模塊功能模塊 內(nèi)核模塊內(nèi)核模塊 內(nèi)核是對(duì)數(shù)據(jù)處理的核心程序 著名的計(jì)算機(jī)科學(xué)家沃斯 N Wirth 提出了 數(shù)據(jù)結(jié)構(gòu) 算法設(shè)計(jì) 程序 確定了合適的數(shù)據(jù)結(jié)構(gòu) 設(shè)計(jì)出精美的算法 我們的程序的功能的實(shí)現(xiàn) 才能變?yōu)榭赡?我們首先分析了一下編輯器的數(shù)據(jù)結(jié)構(gòu)特點(diǎn) 1 不定性 編輯器的行列是不定的 即我們不能預(yù)先知道要處理多大的文本 2 不規(guī)則性 每一行的數(shù)據(jù)量不定 不能用一個(gè)固定 通用的數(shù)組來(lái)存放 3 非連續(xù)性 編輯器需要頻繁的插入 刪除操作 如果用固定 連續(xù)的空間存放 勢(shì)必降低運(yùn)算的效率 這些特點(diǎn)是我們排除了數(shù)組 隊(duì)列等數(shù)據(jù)結(jié)構(gòu)類型 我們的目光鎖定在鏈表上 鏈表 具有可以動(dòng)態(tài)添加 刪除節(jié)點(diǎn) 不需要連續(xù)的內(nèi)存區(qū)域等特點(diǎn) 適用于編輯器的數(shù)據(jù)要求 我們?cè)O(shè)計(jì)以每個(gè)字符為單位的基本結(jié)構(gòu) 為了方便處理中文 我們將一個(gè)漢字看作一個(gè)中 文自符 字符單元的結(jié)構(gòu)如下 struct CHAR NOTE char c c1 CHAR NOTE pNext pPre 若干個(gè)字符節(jié)點(diǎn)連在一起便形成了一行 行鏈表示意圖 我們又設(shè)計(jì)了一個(gè)行的結(jié)構(gòu)體 6 35 struct LINE NOTE int Len int MaxCaretx CHAR NOTE pHead pEnd LINE NOTE pNext pPre int Bx1 Bx2 用來(lái)管理一行的鏈表 如 pHead 用來(lái)記錄鏈表表頭的指針 pEnd 用來(lái)記錄鏈表最末一 個(gè)字符的指針 編輯器的核心任務(wù)就是維護(hù)這樣的一個(gè)復(fù)雜的 雙鏈表 文件 LIST C 中提供許多函數(shù) 如 InsertAfter AppendChar SeekChar 等函數(shù)來(lái)維護(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 每一按鍵對(duì)應(yīng)一個(gè)處理模塊 各個(gè)處理模塊調(diào)用 LIST C 中的模塊并協(xié)調(diào)顯示的數(shù)據(jù)和內(nèi)存 中的數(shù)據(jù)的一致性 比如 KeyUp KeyDown 為控制光標(biāo)鍵的處理模塊 改動(dòng)內(nèi)存當(dāng)前 字符的指針并改變屏幕上當(dāng)前光標(biāo)的位置 漢字輸漢字輸入入法模塊法模塊 由于我們的編輯器獨(dú)立于漢字系統(tǒng) 且又要處理中文 故而我們必須提供中文輸入法 模塊以供用戶來(lái)輸入中文 漢字的輸入是通過(guò) bioskey 取得鍵盤的掃描碼 根據(jù)鍵盤的掃 描碼算出漢字的輸入碼 最后根據(jù)輸入碼從字庫(kù)中查找相同的輸入碼 取得漢字的內(nèi)碼來(lái) 實(shí)現(xiàn)的 我們采用 UCDOS5 0 中的 IMD 輸入法碼表文件 該碼表文件有幾個(gè)優(yōu)點(diǎn) 1 UCDOS 中廣泛支持 提供眾多碼表文件 2 碼表文件結(jié)構(gòu)清晰 3 輸入法算法通用 可以掛接多種輸入法 關(guān)于輸入法碼表文件的結(jié)構(gòu) 輸入法算 法 請(qǐng)?jiān)斠姼戒?這部分資料我們?nèi)∽跃W(wǎng)絡(luò) 9 35 Undo 模塊模塊 該模塊提供簡(jiǎn)單的 Undo 功能 能恢復(fù)被刪除的 200 個(gè)字符 并將恢復(fù)的字符插入當(dāng) 前位置 Undo 模塊采用循環(huán)隊(duì)列的數(shù)據(jù)結(jié)構(gòu)來(lái)管被刪除節(jié)點(diǎn)的信息 一般的 隊(duì)列遵循先進(jìn)先 出的原則 FIFO First In First Out 普通的隊(duì)列在一個(gè)元素出列時(shí) 期它的元素都要向前 移動(dòng)一個(gè)位置 在內(nèi)存中表現(xiàn)為所有單元的元素向前移動(dòng)一個(gè)位置 這樣勢(shì)必會(huì)增加操作 時(shí)間 我們采用循環(huán)隊(duì)列 因?yàn)檠h(huán)隊(duì)列采用兩個(gè)指針 Head 和 Tail 分別指向隊(duì)列的 第一個(gè)和最后一個(gè)元素 通過(guò)修改兩個(gè)指針實(shí)現(xiàn) 先進(jìn)先出 節(jié)省了操作時(shí)間 添加一個(gè) 元素時(shí) Tail Tail mod maxsize 1 刪除一個(gè)元素時(shí) Head Head mod maxsize 1 當(dāng) Head 與 Tail 相等時(shí) 表示該隊(duì)列為空 當(dāng) Head Tail mod maxsize 1 時(shí) 隊(duì)列為滿 環(huán)形隊(duì)列示意圖 MessageBox 對(duì)話框模塊對(duì)話框模塊 在編輯器中 我們?cè)黾恿藢?duì)話框模塊 如圖所示 對(duì)話框模塊存放在 MESSBOX H 和 MESSBOX C 文件中 主要調(diào)用函數(shù)聲明如下 int MessageBox char messtr char title MESSAGETYPE choice 參數(shù)說(shuō)明 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 為疑問(wèn)對(duì)話框 Questioning IN xxx 為信息對(duì)話框 Information IM xxx 為重要信息對(duì)話框 Important information E xxx 為錯(cuò)誤對(duì)話框 Error 特別 地 INPUT 為輸入對(duì)話框的入口參數(shù) 返回值說(shuō)明 如果選擇左邊第一的按鈕 返回 1 左邊第二個(gè)按鈕 返回 2 以此類推 顯示輸顯示輸出出模塊模塊 顯示輸出模塊主要采用直接寫視屏內(nèi)存的方法來(lái)實(shí)現(xiàn) 通過(guò)視屏的端口 0 x3ce 0 x3cf 0 x3c4 0 x3c5 和視屏的內(nèi)存地址 0 xa0000000 的直接操作來(lái)組成視屏顯示的一系 列函數(shù) 雖然通過(guò)直接寫視屏的方式來(lái)實(shí)現(xiàn)的函數(shù)有一些移植性問(wèn)題 但是大大提高了顯 示的速度 在魚和熊掌不可兼得的情況下只好采取這樣的措施 文件列表文件列表 LIST C內(nèi)核數(shù)據(jù)操作函數(shù)庫(kù) CURSOR C光標(biāo)操作函數(shù)庫(kù) EDITOR C鍵盤操作 IMD C輸入法操作函數(shù)庫(kù) MAIN C主過(guò)程 OPENDLG C 打開 對(duì)話框的程序文件 UNDO CUndo 的程序文件 GOUTPUT H漢字顯示的函數(shù)文件 WINFUNC H窗口繪制的函數(shù)文件 FACE C界面的程序文件 HZK16漢字庫(kù)文件 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添加一個(gè)字符串 option 為 1 在末尾添加 option 為 0 在當(dāng)前位置添加 void ReleaseAll 釋放所有節(jié)點(diǎn) int NextLine 當(dāng)前行指針下移 int PreLine 當(dāng)前行指針上移 int GetLineLength 取得當(dāng)前行的長(zhǎng)度 int GetLines 取得總行數(shù) int SeekLine int LineNo 按行號(hào)移動(dòng)指針 int SeekLineTail 移動(dòng)到最末行 int SeekLineHead 移動(dòng)到首行 int SeekHead 移動(dòng)到當(dāng)前行的開始 int SeekTail 移動(dòng)到當(dāng)前行的最末節(jié)點(diǎn) int NextChar 下一個(gè)字符 int PreChar 前一個(gè)字符 int SeekChar int x 按標(biāo)號(hào)移動(dòng)指針 int IsEmptyLine 測(cè)試該行是否為空 void InsertAfter char c char c1后插一個(gè)節(jié)點(diǎn) void InsertBefore char c char c1前插一個(gè)節(jié)點(diǎn) void DeleteBefore 刪除前一個(gè)節(jié)點(diǎn) void DeleteChar 刪除當(dāng)前節(jié)點(diǎn) void DeleteHead 刪除一行最先的一個(gè)節(jié)點(diǎn) void DeleteTail 刪除一行最后的一個(gè)節(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)前實(shí)現(xiàn)換行功能 即把 當(dāng)前字符以后的字符下移一 行 12 35 void DeleteCurrentLine N A刪除當(dāng)前行 void Delete CHAR NOTE pChar刪除當(dāng)前字符 int Undo N A實(shí)現(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)前行中接受操作的一個(gè)字符 若為 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)前頁(yè)的模塊 void KeyUp 光標(biāo)鍵控制模塊 void KeyDown void KeyLeft void KeyRight void KeyEnter 回車換行控制模塊 void KeyEsc ESC 鍵控制模塊 void KeyCtrl Y 刪除一行 Ctrl Y 控制模塊 void KeyPagedown 翻頁(yè)控制模塊 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 退出詢問(wèn)模塊 13 35 int SaveBox 保存文件對(duì)話框 void CheckXY 檢查坐標(biāo)函數(shù) void AddChar char c 添加一個(gè)字符模塊 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 移動(dòng)光標(biāo)函數(shù) void SetBlockStart 設(shè)置塊的起始和終點(diǎn)模塊 void SetBlockEnd void MakeBlock 生成一個(gè)塊 int Load char Filename 讀入一個(gè)文件 BITMAP H I How come 當(dāng)我們?cè)谠O(shè)計(jì)圖形按鈕和菜單功能的時(shí)候 首先考慮使用即時(shí)繪圖來(lái)實(shí)現(xiàn)各種動(dòng)態(tài)效 果 然而即時(shí)繪圖有很多缺憾 在程序中加入鼠標(biāo)支持后 即時(shí)繪圖會(huì)受鼠標(biāo)的影響 具體就是鼠標(biāo)指針也是位 圖 在繪圖時(shí)可能鼠標(biāo)指針會(huì)遮蓋部分區(qū)域?qū)е吕L圖函數(shù)不能正常工作 從而留 下這些區(qū)域沒有正常顯示 除非經(jīng)常刷新 繪圖函數(shù)是通過(guò)一個(gè)一個(gè)像素畫到屏幕上去的 可見效率是比較低的 因此 我們需要有能夠快速地把圖片顯示到屏幕上 通常有兩種做法 1 直接寫入屏 幕緩沖區(qū) 但使用了 Turbo C C 的圖形庫(kù)之后就不行了 我們這個(gè)程序已經(jīng)使用了圖形 庫(kù) 再更改就太 2 使用 Turbo C C 提供的一些直接寫屏的函數(shù) getimage putimage imagesize 這些函數(shù)是能夠?qū)崿F(xiàn)動(dòng)畫效果的 但是我的想法是能夠動(dòng) 態(tài)的生成菜單項(xiàng) 即根據(jù)菜單項(xiàng)中字符串的大小來(lái)決定菜單項(xiàng)的大小 于是就考慮自己來(lái) 生成 Turbo C C 使用的 Bitmap Buffer II Crack it 要直接生成 Bitmap Buffer 必然需要了解它的結(jié)構(gòu)和各方面的細(xì)節(jié) 然而 Borland 公 司從來(lái)就沒有仔細(xì)的描述 getimage 函數(shù)所使用的圖形緩沖 只是給出前兩個(gè)字分別是圖片 的寬和高 沒辦法了 破解吧 也好過(guò)過(guò)做個(gè)軟件黑客的癮 呵呵 14 35 首先 做個(gè)程序?qū)?16 種色素分別畫到屏幕上 原為豎立的 現(xiàn)將它橫過(guò)來(lái)便于顯示 將它用 getimage 保存到一塊內(nèi)存區(qū)域中 并且一個(gè)字節(jié)一個(gè)字節(jié)地顯示出來(lái) 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)色板顏色通過(guò)四個(gè)字節(jié)來(lái)表示 哪種顏色使用 哪些字節(jié)一目了然吧 這些是通過(guò)一條豎直的 16 色線得到的 那么畫一條橫線的情況會(huì)是 怎么樣呢 好 首先畫一條 8 個(gè)像素的藍(lán)色橫線 再次用 getimage 的方法將緩沖區(qū)的字節(jié)都顯示出來(lái) 07000000 同上 但這次寬是 7 1 個(gè)像素 高為 1 個(gè)像素 000000FF 看到了吧 對(duì)比上文 藍(lán)色像素只同第四個(gè)字節(jié)相關(guān)哦 0000 15 35 通過(guò)以上的例子 我們已經(jīng)對(duì) Turbo C C 的圖形緩沖區(qū)有了初步的了解 接下來(lái) 嗯 當(dāng)然是更深入的研究 呵呵 我們要從一個(gè)井底之蛙變成一只活蹦亂跳的青蛙哦 OK Let s go 通過(guò)再次的試驗(yàn) 我們將藍(lán)色橫線伸長(zhǎng)為 16 個(gè)像素 或者其它大于 8 個(gè)像素也可 主要用于驗(yàn)證 我們會(huì)發(fā)現(xiàn)緩沖區(qū)變?yōu)?0F000000 寬為 15 1 個(gè)像素 000000000000FFFF 奇怪吧 為什么呢 0000 呵呵 這就是 Borland 公司的大師們?cè)O(shè)下的陷阱哦 一不小心就會(huì)迷失方向 其實(shí)那 是相當(dāng)容易的一個(gè)問(wèn)題 那就是 等一下 別急 讓我們來(lái)具體探討一番 首先 在圖形緩沖區(qū)中 像素信息是一行一行記載的 每一行又由許多組數(shù)據(jù)組成 每一組數(shù)據(jù)由四個(gè)字節(jié)組成 并且一組數(shù)據(jù)可以保存 8 個(gè)像素 那么 每四個(gè)字節(jié)又是如 何保存 8 個(gè)像素的信息的呢 從上文可以知道 每一種調(diào)色板顏色在這四個(gè)字節(jié)中對(duì)應(yīng)特 定的幾個(gè)字節(jié) 而且一組數(shù)據(jù)中的第一個(gè)像素在對(duì)應(yīng)字節(jié)上的第一位設(shè)為 1 第二個(gè)像素 在第二位設(shè)為 1 以此類推 若還搞不明白 請(qǐng)看下面的圖示 00 第一個(gè)字節(jié) 00 第二個(gè)字節(jié) 00 第三個(gè)字節(jié) FF 第四個(gè)字節(jié) 第四個(gè)字節(jié)全賦值為 1 說(shuō)明橫向連續(xù)畫 8 個(gè)藍(lán)點(diǎn) 如果有顏色不相同的像素彼此交錯(cuò)呢 呵呵 很簡(jiǎn)單 也是按照這個(gè)規(guī)律 第幾個(gè)像素就在其對(duì)應(yīng)字節(jié)的第幾位上設(shè)為 1 其次 各組像素信息設(shè)置好以后 需要將每組的四個(gè)字節(jié)交錯(cuò)排列 也就是先第一組 的第一個(gè)字節(jié) 第二組的第一個(gè)字節(jié) 第一組的第二個(gè)字節(jié) 第二組的第二個(gè)字節(jié) 第一組的第三個(gè)字節(jié) 第二組的第三個(gè)字節(jié) 以此類推 再次 當(dāng)一行信息處理完成后 不管其是否有多余 都重新建立新的一行 總之 緩 沖區(qū)的每一行都是互不相關(guān)的 16 35 至此 Turbo C C 的圖形緩沖區(qū)中像素信息在橫向和縱向上的表示方法 我們都已經(jīng) 搞清楚了 現(xiàn)在 我想大家都有點(diǎn)摩拳擦掌了吧 讓我們來(lái)小試身手 下面是一張簡(jiǎn)單的 圖片 分辨率是 16 5 0f000400 注意寬和高分別為原圖片減 1 0efb0efb0efbffff 7efb7efb7efbffff 782078207820ffff 7efb7efb7efbffff 0efb0efb0efbffff 0000 這個(gè)例子能充分理解了嗎 先用 2 進(jìn)制編碼 再轉(zhuǎn)成 16 進(jìn)制 好 我們繼續(xù)我們的 征程 III First Use the Power 通過(guò)上面的 潛心研究 之后 我就開始動(dòng)手編了一系列的函數(shù)來(lái)處理 Turbo C C 的 圖形緩沖區(qū) 還有個(gè)函數(shù)直接將 Windows 的 BMP 文件 這個(gè)格式最簡(jiǎn)單嘛 轉(zhuǎn)成圖形緩 沖區(qū)的格式 以便直接調(diào)用 putimage 將其顯示在屏幕上 以下是一些函數(shù)的說(shuō)明 1 1 void far LoadImage char pszFileName 將文件名為 pszFileName 的 16 色 BMP 文件裝載到圖形緩沖區(qū) 返回值為圖形緩沖區(qū) 的指針地址 注意 ceil 寬度 8 4 高度 6 的大小要求不能超過(guò) 64KB 2 2 void SetPalette FILE pFile 根據(jù) 16 色 BMP 文件的調(diào)色板來(lái)設(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 個(gè)像素 轉(zhuǎn)換成圖形緩沖格式 1 pbBMPGroupInfo 為 BMP 文件該行中一組像素?cái)?shù)據(jù)的指針 2 pbGroupInfo 為該組圖形緩沖區(qū)的指針 3 bBMPGroupSize 為 BMP 文件該組數(shù)據(jù)的字節(jié)數(shù) 由于 BMP 文件最后一組像素 是實(shí)際的字節(jié)數(shù) 即 2 個(gè)像素每字節(jié) 然而圖形緩沖區(qū)無(wú)論一組有多少像素 小于等于 8 個(gè) 都是四個(gè)字節(jié) 故要設(shè)定 BMP 文件在該組像素?cái)?shù)據(jù)的字節(jié)數(shù) 5 5 void far CreateBuffer WORD wWidth WORD wHeight BYTE bBkColor 根據(jù)給定的寬度 wWidth 高度 wHeight 來(lái)創(chuàng)建一個(gè)圖形緩沖區(qū) 背景色是 bBkColor 所指定的顏色 注意 ceil 寬度 8 4 高度 6 的大小要求不能超過(guò) 64KB IV Future Improvement 以后可以針對(duì) Turbo C C 的圖形緩沖區(qū) 編寫一系列的繪圖函數(shù) 如畫點(diǎn) 畫線 畫圓等等 有了這些函數(shù) 我們就可以動(dòng)態(tài)地修改緩沖區(qū) 即時(shí)地改變緩沖區(qū)的內(nèi)容 以 便能夠用 putimage 輕而易舉地直接把改變的畫面顯示到屏幕上 相信這樣做還是有一定的 應(yīng)用價(jià)值的 呵呵 只是現(xiàn)在 Windows 如日中天 托胎于 Dos 卻又大義滅親 而 Dos 已經(jīng)無(wú)人問(wèn)津了啊 WINFUNC H I Design Purpose 在 遙遠(yuǎn) 的過(guò)去 Dos 下的編輯器很少有漂亮的圖形界面 而現(xiàn)在 我們習(xí)慣了 Win dows 下花哨絢麗的界面 回過(guò)頭來(lái)制作 Dos 下的文本編輯器 不來(lái)點(diǎn)圖形化的見 面 難免有點(diǎn)對(duì)不起我們的視網(wǎng)膜 至少是有點(diǎn)不習(xí)慣吧 于是 我們決定制作一個(gè)在 Turbo C C 的圖形模式 VGAHI 640 480 16 色模式 下的中文圖形編輯器 時(shí)下 流行模塊化 面向?qū)ο蠡某绦蛟O(shè)計(jì)方法 但我們是用 C 語(yǔ)言來(lái)編寫這個(gè)軟件 就不可能大量地使用 C 的面向?qū)ο蟮囊?因此 我就只是設(shè)計(jì)了這個(gè)頭文件 里面包 含了 窗體 按鈕 菜單的結(jié)構(gòu) 以及對(duì)這些對(duì)象操作的一系列函數(shù) 18 35 II The Data Structure 由于我使用了一些面向?qū)ο蟮乃枷?因此也不免要建立包含這些對(duì)象具體屬性的結(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 上一個(gè)按鈕指針 struct Button pNext 下一個(gè)按鈕指針 struct Menu pMenu 對(duì)應(yīng)的菜單指針 typedef struct Button BUTTON 19 35 typedef struct Button PBUTTON 按鈕數(shù)據(jù)結(jié)構(gòu)示意圖 按鈕 1 按鈕 2 按鈕 3 按鈕 N 3 菜單項(xiàng)結(jié)構(gòu) struct MenuItem char pszTitle 名稱 void far pFunction 包含的指向函數(shù)的指針 struct MenuItem pNext 下一個(gè)菜單項(xiàng)指針 typedef struct MenuItem MENUITEM typedef struct MenuItem PMENUITEM 4 菜單樣式結(jié)構(gòu) struct MenuStyle BYTE bColor 前景色 BYTE bBorderColor 邊框顏色 BYTE bBackColor 背景色 BYTE bItemColor 菜單項(xiàng)顏色 typedef struct MenuStyle MENUSTYLE typedef struct MenuStyle PMENUSTYLE 5 菜單結(jié)構(gòu) struct Menu WORD wWidth 寬度 WORD wHeight 高度 BYTE bNo 當(dāng)前指向第幾個(gè)菜單項(xiàng) BYTE bNum 菜單項(xiàng)的數(shù)量 BYTE bShown 判斷菜單是否被顯示 struct MenuStyle pStyle 對(duì)應(yīng)的菜單樣式指針 struct MenuItem pFirst 指向第一個(gè)菜單項(xiàng) void far pCovered 菜單所覆蓋的屏幕緩沖的指針 void far pLightBar 菜單項(xiàng)亮條圖形緩沖的指針 20 35 typedef struct Menu MENU typedef struct Menu PMENU 菜單數(shù)據(jù)結(jié)構(gòu)示意圖 菜單 1 菜單項(xiàng) 1 菜單項(xiàng) 2 菜單項(xiàng) N 菜單樣式 菜單 2 菜單樣式可以為多個(gè)菜單共享 II The Functions 建立了數(shù)據(jù)結(jié)構(gòu)之后 就著手開始大刀闊斧地進(jìn)行編寫函數(shù)的最后攻堅(jiān)戰(zhàn)了 以下是 一系列的函數(shù) 1 窗體函數(shù) void CreateWindow char pszTitle PWINDOW pWindow int hasStatusBar 根據(jù)給定的窗體標(biāo)題 定義好的窗體結(jié)構(gòu)來(lái)創(chuàng)建一個(gè)窗體 并顯示在屏幕上 1 pszTitle 為窗體的標(biāo)題 2 pWindow 為窗體結(jié)構(gòu)的指針 3 hasStatusBar 決定窗體是否帶有狀態(tài)欄 void CopyWindow PWINDOW pWindow 將所給窗體所將要覆蓋的屏幕區(qū)域保存到一個(gè)圖形緩沖區(qū) pWindow 為所給窗體的 指針 返回值為指向該圖形緩沖區(qū)的指針 void HideWindow PWINDOW pWindow void pCovered 將顯示的窗體隱藏起來(lái) 1 pWindow 為所要隱藏的窗體 2 pCovered 為預(yù)先保存的屏幕區(qū)域 2 按鈕函數(shù) void CreateButton PBUTTON pButton 根據(jù)定義好的按鈕結(jié)構(gòu)來(lái)創(chuàng)建一個(gè)按鈕 并顯示在屏幕上 pButton 為按鈕結(jié)構(gòu)的 指針 21 35 PBUTTON AddButton char pszTitle PBUTTON pButton PMENU pMenu WORD x WORD y BYTE bColor BYTE bBorderColor BYTE bBackColor 增加一個(gè)按鈕在一個(gè)按鈕鏈表 雙向鏈表 中 1 pszTitle 為所加按鈕的名稱 2 pButton 為按鈕鏈表中的前一個(gè)按鈕 3 pMenu 為所加按鈕所對(duì)應(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 為按鈕鏈表中任意一個(gè)按鈕皆可 函數(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è)置為浮起狀 并將對(duì)應(yīng)的菜單都 顯示出來(lái) 這是用來(lái)實(shí)現(xiàn)菜單功能的函數(shù) 1 pszTitle 為要搜索按鈕的名稱 2 pButton 為當(dāng)前已經(jīng)選定的按鈕 需要將其恢復(fù)原狀用 否則置為 NULL 3 pBtnHead 為按鈕鏈表中任意一個(gè)按鈕的指針作為頭指針 函數(shù)返回值為新選擇的按鈕指針 PBUTTON GoButtonLeft PBUTTON pButton 將按鈕和菜單選擇向左移動(dòng) pButton 為當(dāng)前顯示的按鈕 這也是用來(lái)實(shí)現(xiàn)菜單功 能的函數(shù) PBUTTON GoButtonRight PBUTTON pButton 將按鈕和菜單選擇向右移動(dòng) pButton 為當(dāng)前顯示的按鈕 這也是用來(lái)實(shí)現(xiàn)菜單功 22 35 能的函數(shù) 3 菜單函數(shù) void DisplayMenu PMENU pMenu PBUTTON pButton 顯示所指定的菜單 1 pMenu 為菜單的指針 2 pButton 為對(duì)應(yīng)菜單的按鈕的指針 用來(lái)決定菜單的坐標(biāo) void HideMenu PMENU pMenu PBUTTON pButton 隱藏所指定的菜單 1 pMenu 為菜單的指針 2 pButton 為對(duì)應(yīng)菜單的按鈕的指針 用來(lái)決定菜單的坐標(biāo) PMENUITEM AddMenuItem char pszTitle PMENU pMenu void far pFunction 根據(jù)給定字符串作為菜單項(xiàng)名 增加一項(xiàng)菜單項(xiàng) 1 pszTitle 為菜單項(xiàng)名 2 pMenu 為菜單項(xiàng)所在的菜單的指針 3 pFunction 為函數(shù)的指針 用以實(shí)現(xiàn)菜單項(xiàng)的功能 函數(shù)返回值為新增加的菜單項(xiàng)的指針 void SelectMenu PMENU pMenu PBUTTON pButton int iNo 選擇菜單的某一菜單項(xiàng) 即將光條移到該菜單項(xiàng) 1 pMenu 為菜單項(xiàng)所在菜單的指針 2 pButton 為菜單對(duì)應(yīng)的按鈕的指針 用以給出菜單的坐標(biāo) 3 iNo 決定第幾個(gè)菜單項(xiàng) void UnSelectMenu PMENU pMenu PBUTTON pButton int iNo 取消菜單項(xiàng)的選擇 除去光條 各參數(shù)同上 void GoMenuUp PMENU pMenu PBUTTON pButton 將菜單的光條向上移動(dòng) 1 pMenu 為所在菜單的指針 2 pButton 為菜單對(duì)應(yīng)的按鈕的指針 用以給出菜單的坐標(biāo) void GoMenuDown PMENU pMenu PBUTTON pButton 將菜單的光條向下移動(dòng) 各參數(shù)同上 void ClickMenu PMENU pMenu PBUTTON pButton 實(shí)現(xiàn)當(dāng)前光條所在菜單項(xiàng)的功能 菜單項(xiàng)結(jié)構(gòu)所含的函數(shù) 各參數(shù)同上 23 35 III Apply The Header 以上將結(jié)構(gòu)和函數(shù)都一一給大家 觀賞 了一番 不來(lái)點(diǎn)實(shí)際的總是不完滿的 對(duì)嗎 下面 我為編輯器所制作的界面 face c 就是這些的實(shí)際應(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ù)來(lái)添加各菜單項(xiàng) 具體使用參照前面的函數(shù)說(shuō)明 2 void SetButtons void 函數(shù)用于建立按鈕鏈表 使用 AddButton 函數(shù)將所要添加的按鈕組成一個(gè)雙向鏈表 便于按鈕的操作 3 int InitEditorInterface void 函數(shù)用于啟動(dòng)編輯器的界面 4 界面的操作與管理 原本還加入了鼠標(biāo)的支持 mouse h 由于 Windows 2000 下 DOS 圖形模式 下 鼠標(biāo)指針不能正常顯示 而且也沒有比較好的解決方法 還有就是鼠標(biāo)的操作也 比較麻煩 這也是很重要的一條啊 呵呵 因此 界面的操作僅限于鍵盤操作 鍵盤的操作應(yīng)用了消息的循環(huán)方法 通過(guò) kbhit 檢測(cè)是否有按鍵消息 若有 則 使用分支結(jié)構(gòu)來(lái)處理各個(gè)消息 按鍵健碼 5 主要就是這些了 24 35 GOUTPUT H 功能介紹 參數(shù)說(shuō)明 void InitialzeGraph void 初始化整個(gè)圖形輸出函數(shù)庫(kù) void FinishMission void 圖形輸出函數(shù)庫(kù)的析構(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í)間中段句柄的函數(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 字符的第一 個(gè)內(nèi)碼 若字符 為 ASCII 則 s1 位字符的 ASCII 碼 s2 0 若字符 為漢字則 s1 s2 分別為漢字的區(qū) 位碼 顯示字符 包括 ASCII 和漢字 25 35 void GetHZ char incode char bytes incode 漢字 的內(nèi)碼數(shù)組 前 兩個(gè)字節(jié)有用 bytes 返回漢字 字模的數(shù)組 獲取漢字字模 void CloseHZK 關(guān)閉漢字字模庫(kù)文件 void OpenHZK void 打開漢字字模庫(kù)文件 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 取錯(cuò)誤代碼 功能函數(shù)的算法說(shuō)明功能函數(shù)的算法說(shuō)明 部分部分 AppendChar 在末尾追加一個(gè)字符在末尾追加一個(gè)字符 執(zhí)行該操作時(shí) 主要有兩種情況 1 pEnd 不為空 pEnd pNext pNewChar 2 pEnd 為空 說(shuō)明該行沒有節(jié)點(diǎn) 這是只要添加一個(gè)節(jié)點(diǎn)即可 void interrupt far CursorHandler 顯示光標(biāo)的時(shí)間中顯示光標(biāo)的時(shí)間中 段句柄的函數(shù)段句柄的函數(shù) 本函數(shù)在圖形顯示函數(shù)初始化過(guò)程中被設(shè)置成時(shí)間中段程序 本函數(shù)有一個(gè)計(jì)算本函 27 35 數(shù)執(zhí)行次數(shù)的全局變量 HandlerTimes 時(shí)間中段每秒鐘執(zhí)行 18 5 次 每執(zhí)行一次時(shí)間中 段 HandlerTimes 就加一 當(dāng) HandlerTimes 的值為 3 時(shí) 就執(zhí)行一次函數(shù)中顯示光標(biāo)的函 數(shù) ShowCursor 或恢復(fù)光標(biāo)圖像的函數(shù) RecoverCursor 于是每經(jīng)過(guò)大約 1 3 秒的時(shí)間 光標(biāo)就閃爍一次 而程序中是如何確定要顯示還是要恢復(fù)光標(biāo)呢 程序模塊中有一個(gè)全局變量 flag 他被初始化為 0 當(dāng) flag 為 0 并且光標(biāo)的位置不超出 顯示區(qū)域時(shí) 就調(diào)用顯示光標(biāo)的函數(shù) ShowCursor 然后把 flag 設(shè)為 1 當(dāng) flag 為 1 并
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年倉(cāng)儲(chǔ)設(shè)施征收協(xié)議書官方樣本
- 2025年合作項(xiàng)目承接與權(quán)益轉(zhuǎn)讓協(xié)議
- 2025年創(chuàng)業(yè)企業(yè)法律咨詢服務(wù)合同
- 2025年事業(yè)單位稅務(wù)籌劃合作協(xié)議
- 2025年公立醫(yī)院司機(jī)招聘合同樣本
- 2025年企業(yè)租賃合作協(xié)議書模板
- 2025年企業(yè)人力資源外包合作協(xié)議樣張
- 2025年農(nóng)地租賃合同協(xié)議書模板
- 2025年二手房產(chǎn)定金合同樣本
- 2025年北京離婚財(cái)產(chǎn)劃分協(xié)議
- 北師大版七年級(jí)上冊(cè)數(shù)學(xué)期末考試試題及答案
- 初中信息技術(shù)課堂中的項(xiàng)目式學(xué)習(xí)實(shí)踐研究結(jié)題報(bào)告
- 《工業(yè)廢水臭氧催化氧化深度處理技術(shù)規(guī)程》(T-SDEPI 030-2022)
- 2024安全事故案例
- 生日快樂祝福含生日歌相冊(cè)課件模板
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級(jí)上冊(cè) 期末綜合卷(含答案)
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 2024年考研管理類綜合能力(199)真題及解析完整版
- 2024年濰坊護(hù)理職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)附答案
- 《鉗工基本知識(shí)》課件
- 第八期:風(fēng)電典型事故案例剖析(二)
評(píng)論
0/150
提交評(píng)論