日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

用C++ Builder3 制作NotePad(记事本)

發布時間:2025/3/15 c/c++ 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用C++ Builder3 制作NotePad(记事本) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用C++ Builder3 制作NotePad(記事本)
?

啟動C++ Builder3后,在File菜單中選New APPlication來建立一個新程序。這時,顯示在屏幕中間的窗口的標題是Form1,這個窗口是程序的主表單(就是主窗口的意恩),它將在程序啟動時自動顯示。而以后再創建的表單(Form)一般需要用Show()方法(Method)來顯示。和組件一樣,系統為第一個表單起名為Form1,以后的表單起名為Form2、Form3等等,標題(Caption)也是如此。
?? 當然,你可以將它們改成你喜歡的名字。我們先來把Form1的名字(Name)屬性設為MainForm,把MainForm的標題(Caption)屬性設為“Untited.txt--我的記事本”。接著可以用鼠標拖動窗口的位置和改
變窗口的大小。以上的這些工作,幾乎每個程序都需要如法炮制一番。
?? 隨后,我們要開始NotePad的編程工作了。知己知彼,百戰不殆,先來分析一下MicroSoft NotePad的結構。其實NotePad是附件里最簡單的程序了,它的主窗口中只包含一個占據全部用戶區域(Client Area)的多行的編輯控制(Edit)。由于編輯控制最多容納64KB文字(Windows95),所以NotePad只能打開小于64KB的文件。好,我們來依樣畫葫蘆,選擇Standard中的多行編輯(Memo)組件(而不是單行編輯組件)。
?? 放入表單中,將多行編輯Memo1的Align屬性設為alClient,這時Memo1撐滿了整個窗口,Memo1中顯示的是Memo1。選擇Memo1的Lines屬性,[TString]后面出現了一個按鈕。
?? 單擊該按鈕,將出現一個設置Lines屬性的對話框,其中第一行便是“Memo1”。多行編輯(Memo)組件的Lines屬性在設計時(Design Time)設定的內容將在該窗口創建時自動顯示。由于我們不需要顯示什么,所以把“Memo1”擦掉,選OK退出。你一定想看看目前的效果,運行一下吧。編譯……連接……啟動程序……怎
么樣,是不是和NotePad一模一樣,能打字、刪字、刪行,還能使用右鍵菜單來復制(copy)和粘貼(paste)。
?? 本來就是嘛,用一樣的編輯控制,不一樣才怪呢。哎,不對,好像字體小了點,而且沒有滾動條。沒有關
系,關閉程序回到C++ Builder3中,先修改Memo1的字體(Font)屬性,選擇system字體(當然你愛選什么字
體都可以),然后設置滾動條(ScrollBars)屬性,選擇ssBoth(兩根滾動條都要)。在這些改動之后,先別急著運行,windows的程序沒菜單是不行的。在C++ Builder中,菜單也是組件之一。選擇Standard中的主菜單(MainMenu)組件放入表單中。主菜單(MainMenu)組件顯示為一個圖標。順便提一句菜單,對話框或系統功能之類組件屬于非可視組件(nonvisual components),它們的工作基本不是用來滿足視覺的,或者在程序運行時根本就看不見(相對于界面上可視組件來說),因此你可以將非可視組件放在表單中的任意位置。
?? 接下來的工作是制作菜單,雙擊主菜單MainMenu1的圖表,會彈出菜單編輯窗口,開始時是一個空菜單。按右鍵會彈出一個菜單(不是我們要做的菜單),其中:
Insert(添加一個菜單項,按Insert鍵完成相同的功能)
Delete(刪除一個菜單項,按Delete鍵完成相同的功能)
Create SubMenu(添加一個子菜單,按Ctrl + →鍵完成相同的功能)
Select Menu(選擇一個菜單,用來關閉當前編輯的菜單并選擇另一個菜單來編輯)
Save as Template(將當前菜單保存為模板,供以后使用)
Insert From Template(將已有的菜單模板加入當前菜單)
Delete Template(刪除菜單模板)
Insert From Resource(從資源文件中取得菜單加入當前菜單)
?? 制作“我的記事本”的菜單有一種偷懶的方法,就是照抄Microsoft記事本的菜單。你可以用BC5.02的IDE打開Notepad.exe(先把打開文件對話框中的Viewer設為Edit Resource,再把文件類型設為Exe cutable(*.exe),這樣才是以編輯資源的方式打開EXE文件,否則默認的打開方式是Debug調試程序),將里面的菜單導出以RC(資源腳本)方式存盤,然后用Insert From Resource導入該菜單;一共用不了2分鐘。
?? 還有一種方法就是自己一項一項慢慢地做。當然,不管你用什么方法,最后都要做出菜單來才能繼續下面的工作。下面附上從Windows NT4.0中Notepad導出的菜單的資源腳本menu.rc,把下面的文件以menu.rc存盤就能用C++ Builder3來導入了:
1 MENU
{ POPUP "文件(&F)"
? { MENUITEM "新建(&N)", 9
??? MENUITEM "打開(&O)...", 10
??? MENUITEM "保存(&S)", 1
??? MENUITEM "另存為(&A)...", 2
??? MENUITEM SEPARATOR
??? MENUITEM "頁面設置(&T)...", 32
??? MENUITEM "打印(&P)", 14
??? MENUITEM SEPARATOR
??? MENUITEM "退出(&X)", 28
? }
? POPUP "編輯(&E)"
? { MENUITEM "撤消(&U)\tCtrl+Z", 25
??? MENUITEM SEPARATOR
??? MENUITEM "剪切(&T)\tCtrl+X", 768,GRAYED
??? MENUITEM "復制(&C)\tCtrl+C", 769, GRAYED
??? MENUITEM "粘貼(&P)\tCtrl+V", 770,GRAYED
??? MENUITEM "刪除(&L)\tDel",771, GRAYED
??? MENUITEM SEPARATOR
??? MENUITEM "全部選定(&A)", 7
??? MENUITEM "時間/日期(&D)\tF5",12
??? MENUITEM SEPARATOR
??? MENUITEM "自動換行(&W)", 27
??? MENUITEM "設置字體(&F)...", 37
? }
? POPUP "搜索(&S)"
? { MENUITEM "查找(&F)...", 3
??? MENUITEM "查找下一個(&N)\tF3", 8
??? MENUITEM "替換(&R)"', 40
? }
? POPUP "幫助(&H)"
? { MENUITEM "幫助主題(&H)", 5
??? MENUITEM SEPARATOR
??? MENUITEM "關于記事本(&A)...",11
? }
}
關于菜單,還有兩點要提:
1.一般沒有必要去改動菜單項的Name屬性,使用系統給出的默認名就可以了。
2.以“-”為標題的菜單項即是菜單分割條,而菜單項的Break屬性提供的分割則是一種很奇怪的樣子--“垂直分害條”(群山笑:這個名詞是我自已加上的)。
?? OK,到此為止,界面部分的工作已經全部完成了,接下來便是代碼部分的編寫。首先要做的就是打開文件和存盤的工作。我們來建立一個char *UserFileName的全局變量來存放文件名。按工具條上的Toggle Form/Uint將工作窗口切換到代碼編輯區。這個按鈕用于表單編輯區和代碼編輯區的相互切換,按F11顯示對象觀察器。在“TMainForm *MainForm;”下加語句:
char *UserFileName="untitled.txt";//默認文件名Untitled.txt
BOOL If_saved=TRUE;//表示文件存盤與否
char title_buf[256];//標題的內容
?? 接著,我們再切換回表單編輯區,從Dialogs組件條中選SaveDialog組件放入表單中。
?? SaveDialog組件就是用來顯示Save As對話框的,當然用Windows API也能實現此功能,這里將使用SaveDialog組件。將SaveDialog1的DefaultExt(默認的擴展名)屬性設為.txt,這表示如果用戶沒有加擴展名,系統會自動加上“.txt”。按Filter屬性后的[…]按鈕,在彈出的對話框中輸入“文本文件”“*.txt”“所有文件”“*.*”。另外再雙擊Options屬性,將展開后其中的ofOverwritePrompt(文件覆蓋提醒)屬性設為true。接著在表單編輯區的菜單中選菜單項“另存為(A)...”,這時C++ Builder3會自動切換到代碼編輯區,而光標停在一個函數的開頭。在該例中菜單項“另存為(A)…”的名字屬性是A1,所以這個函數的名字是A1Click(TObject * Sender),表示用戶選擇(Click)這個菜單項而執行的函數。我們所要做的是彈出Save As對話框來獲得用戶輸入的文件名,并將這個文件存盤。所以在這個函數里加如下的語句:
if(!SaveDialog1->Execute()) return; //如果用戶選擇了取消,我們就return
UserFileName = SaveDialog1 -> FileName.c_str();
/ * FileName保存了用戶輸入的文件名,但是AnsiString類型的,用其中的c_str()方法可以將其轉換成字符串*/
Memo1 ->Lines->SaveToFile(UserFlleName);
If_saved=TRUE; //已經存盤
sprintf(title_buf,"% s - 我的記事本”, UserFileName); /* 設置窗口的標題,記得要加上include <stdio.h> * /
Caption=title_buf;
/ * Memo中的Lines屬性即是編輯控制中的內容,Lines屬性是Strings類型的,用其中提供的SaveToFile方法可以方便地將編輯控制中的內容存盤 */
?? 類似地,我們再來處理打開文件的工作。首先,在表單中放置一個OpenDialog組件,DefaultExt和Filter
屬性同SaveDialog1,將Options屬性中的ofFileMustExist(文件必須存在)設為true。然后在表單編輯區中
的菜單中選菜單項“打開(O)...”,在代碼編輯區中輸入如下語句。
if(!if_saved)
if(Application ->MessageBox("文件還未保存,是否要保存?","我的記事本",
MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK) S1Click(NULL);
/ * 如果文件沒有保存,我們得先征求用戶是否要保存文件。s1Click()是“保存(s)”菜單項的處理函數(就是接下來處理的菜單項),“保存(S) ”菜單項的工作就是將文件存盤,所以我們沒有必要寫重復的代碼,而只要直接調用該函數就可以了。注意,如果你的“保存(S)”菜單項的名字屬性不是S1而是其他,那么這個函數的名字也會有所不同,但總是“名字”+Click() */
if(!OpenDialog1->Execute())return;
UserFileName=OpenDialog1->FileName.c_str();
Memo1->Lines->LoadFromFile(UserFileName);
sprintf(title_buf,"% s - 我的記事本", UserFileName);
Caption = title_buf;
(為節省篇幅,以下凡是重復的操作描述省略)
?? 處理“保存(S)”菜單項,輸入:
Memo1->Lines->SaveToFile(UserFileName);
If_saved=TRUE;
sprintf(title_buf,"% s - 我的記事本", UserFileName)";
Caption = title_buf;
?? 處理“新建(N)”菜單項,輸入如下語句:
lf(!If_saved)
if(Application ->MessageBox ("文件還未保存,是否要保存?","我的記事本",
MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);
sprintf(UserFileName,"Untitled.txt");
sprintf(title_buf, "% s - 我的記事本-未存盤",UserFileName);
Caption=title_buf;
Memo1->Lines->Clear(); //將編輯控制中的內容清空
?? 隨后,我們要處理Memo1的OnChange事件(Events)。一旦編輯控制中的內容有改變,Memo1就將產生OnChange事件,這時需要將If_saved置為FALSE,表示文件已經改動過了,并在標題上顯示“未存盤”。在對象觀察器中選Memo1,再單擊下面的Events,將列出許多事件,第一個就是OnChange,雙擊后面的編輯框,后面的操作和處理菜單項是一樣的(其實前面處理的菜單項就是處理菜單的OnClick事件),輸入:
If_saved=FALSE;
sprintf(title_buf,"% s -我的記事本-未存盤", UserFileName);
Caption=title_buf;
?? 隨后處理MainForm的OnClose事件,輸入:
//OnClose事件在關閉窗口時產生,需要做一些收尾工作
if(!If_saved)
if(application->MessageBox("文件還未保存,是否要保存?","我的記事本",
MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);
?? 最后,處理“退出(X)”菜單項,輸入如下語句:
if(!If_saved)
if(application->MessageBox("文件還未保存,是否要保存?","我的記事本",
MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);
Application->Terminate(); //程序結束
?? 到此為止,終于小功告成了,快把項目保存下來吧。在File菜單中選Save Project As…,首先彈出的對
話框要求輸入表單的文件名(不能和表單的名字屬性相同),我們就輸入Main。隨后彈出的對話框才是要求輸入項目(Project)的文件名,該文件名也就是exe文件的名字,我們輸入NotePad。保存后再選Project菜單
里的Make NotePad,或按Ctrl+F9,就會產生一個NOtePad.exe,這就是我們自己做的記事本,目前它已經能打開文件、編輯并保存。你一定發現菜單中還有許多功能尚未實現,這就是我只說小功告成的原因,不過
下次我們會完成它。
?? 附件中除了記事本(NotePad),還有一個寫字板(WordPad)。它們最大的區別在于前者使用的是編輯
控制(Edit),而后者使用的是Rich Edit控制(有些書翻譯成豐富文本控制)。與編輯控制相比,Rich Edit除了能給文本加上各種修飾,還支持簡單的對象鏈接和嵌入技術(Object Linking and Embedding)。
?? 此外,Microsoft Win32 SDK的文檔中說Rich Edit控制能接受的文本大小將只受內存大小的限制,這比
編輯控制的64KB強多了。當然,效率又是另一個問題。我曾試圖用寫字板(WordPad)打開一個15MB的文件,硬盤讀了10多分鐘還沒結果,只能按Reset重新啟動了(我可有64MB內存哦)。自然使用Rich Edit控制也比編輯控制難的多。在以后講到RichEdit組件時,詳細講述它的用法。

用C++ Builder3 制作NotePad(記事本)續篇
?

?上回說到“我的記事本”小功告成,copy給朋友一份,咦,不能用,說是缺文件?噢,像VB的VBRUN???
.dll一樣,C++ Builder3編譯的程序也需要運行庫的支持的。找到并打開它看看我們還有些什么沒有做?首先是關于菜單的快捷鍵問題。如果你是使用我上次所給的資源腳本導人的菜單,你會發現帶有快捷鍵的菜單項的文字都像“撒消(U)\tCtrl+Z”一樣。以前用BC的資源編輯器做過菜單的朋友都知道,“\t”表示右對齊,而在C++ Builder3中也作為菜單的文字了。另外C++ Builder3中的快捷鍵的建立也簡單的多,快捷鍵已經作為菜單的ShortCut屬性了。這里,僅改動“編輯(E)”中的“撒消(U)Ctrl+Z”項來示眾,其余皆可依樣而畫葫蘆之。
?? 先雙擊MainMenu1菜單組件,進入菜單編輯器,選中“編輯(E)”中的“撤消(U)Ctrl+Z”項。接著將Caption屬性改為“撤消(U)”(即把“\tCtrl+Z”刪去),并在shortCut矚性中選擇Ctrl+Z。這樣,該項的快捷鍵就設完了。接著是編輯菜單里的各個項。首先是“撤消(&U)Ctrl+Z”到“全部選定(&A)”六項(必須先將他們的Enabled屬性都設為true),C++ Builder3為這些功能提供了現成的方法(Method)。比如“撤消(&U)Ctral+Z”菜單,可以使用Undo方法,即在該菜單的OnClick事件處理函數中輸入“Memo1->Undo();”。同理有:
??? “剪切(&T)\tCtrl+X”項,輸入:“Memo1->CutToClipboard();”
??? “復制(&C)\tCtrl+C”項,輸入:“Memo1->CopyToClipboard();”
??? “粘貼(&P)\tCtrl+V”項,輸入:“Memo1->PasteFromClipboard();”
??? “刪除(&L)\tDel”項,輸入:“Memo1->ClearSelection();”
??? “全部選定(&A)”項,輸入:“Memo1->SelectAll();”
?? 下面是“時間/日期(&D)F5”項,我們必須先取得當前的日期和時間。有兩種方法,一種是用getdate和
gettime函數,一種是用C++ Builder3中的TDateTime類。這里選擇后一種,但有時使用getdate和gettime函數會更簡便。下面給出該菜單項的處理代碼:
TDateTime * Current_DateTime =newTDateTime; //生成TDateTime對象
* Current_DateTime=Current_DateTime->CurrentDateTime(); //獲取當前日期和時間
Memo1->SetselTextBuf(Current_DateTime->DateTimeString().c_str());//將當前日期和時間轉換成字符串,并用SetSelTextBuf方法插入當前光標位置
?? 接著是處理‘自動換行(&W)”的代碼:
//W1是“自動換行(&W)”菜單項的名字(Name)屬性,如果你不是W1,請做相應的改動
if(W1->Checked) //該菜單已經檢取(Checked)
{W1->Checked=false; //取消檢取
Memo1->ScrollBars=ssBoth; //Memo1兩根滾動條都要
} else
{ W1->Checked=true; //設置檢取
Memo1->ScrollBars = ssVertical; //Memo1只設垂直滾動條,效果就是自動換行
}
?? 接下來處理“設置字體(&F)...”菜單,我們首先需要一個設置字體的公用對話框。從Dialogs組件條中選FontDialog組件放入表單中。下面是處理“設置字體(&F)...”的代碼:
if(FontDialog1->Execute())Memo1->Font=FontDialog1->Font;
?? 至此,“編輯(E)”菜單的功能都處理完了,下面將是處理“搜索(S)”菜單的工作。其中,我們又將用到兩個公用對話框。C++ Builder3只提供了用來獲取用戶欲查我的字符串的對話框,并未提供具體查找的函數,所以我們得自己寫處理函數。下面我給出修改的Win32 SDK的范例代碼,你需要將這些代碼插在程序的首部,即定義全局變量的地方。
typedef enum {
??? frtFind
??? frtReplace,
??? frtRepAll
} FRT
#define GETSEL(ichS,ichE) \ SendMessage(MainForm - > Memo1 - > Handle,
EM_GETSEL,(WPARAM) & ichs, (LPARAM) & ichE)
#define SETSEL(ichS,ichE) \SendMessage(MainForm - > Memo1 - > Handle,
EM_SETSEL, (WPARAM) ichS, (LPARAAM) ichE)
BOOL FWholeWord(char * sz, char * szStart, char * szEnd,
int cch) {
??? if ( sz! = szStart & &
??????? * (sz - 1 ) ! = ' ' & &
??????? * (sz - 1 ) ! = '\t' & &
??????? * (sz - 1 ) ! = ',' & &
??????? * (sz - 1 ) ! = '.' & &
??????? * (sz - 1 ) ! = '\r'
??? ) { return FALSE;
??? }
??? if ( sz + cch! = szEnd & &
??????? * (sz + cch) ! = ' ' & &
??????? * (sz +cch) ! = '\t' & &
??????? * (sz + cch) ! = ',' & &
??????? * (sz + cch) ! = '.' & &
??????? * (sz + cch) ! = '\r'
??? ) { return FALSE;
??? }
??? return TRUE;
}
BOOL Find(char * szFind, BOOL fDown, BOOL fMatchCase, BOOL fWholeWord, BOOL fNoScroll)
{ char * szText;
??? UINT ichStart;
??? UINT ichEnd;
??? UINT cch;
??? int dch;
??? int dchComp;
??? char * szTerm;
??? char * sz;
??? UINT cchFind;
??? BOOL fFound = FALSE;
??? int dcbOnFind;
??? szText = MainForm - > Memo1 - > Lines - > GetText();
??? cchFind = strlen (szFind);
??? GETSEL(ichStart, ichEnd);
??? cch = strlen(szText);
??? if (
??????? ichEnd - ichStart = = cchFind & &
??????? !strnicmp(szText + ichStart, szFind, cchFind)
??????? )
??????? dchOnFind = 1;
??? else
??????? dchOnFind = 0;
??? if (fDown)
??????? { dch = 1;
??????? dchComp = 0;
??????? sz = szText + ichStart + dchOnFind;
??????? szTerm = szText + cch;
??????? }
??? else
??????? { dch = -1;
??????? dchComp = 1;
??????? sz = szText + ichStart - dchOnFind;
??????? szTerm = szText;
??? }
??? for (; sz + dchComp! = szTerm; sz + = dch)
??? {
????? if (
??????? tolower(* sz) = = tolower( * szFind) & &
??????? (fMatchCase ?
??????????? !strncmp(sz, szFind, cchFind) :
??????????? !strnicmp (sz, szFind, cchFind)
??????? ) & &
??????? ( !fWholeWord || FWholeWord(sz, szText, szTerm,cchFind)))
??????? { SendMessage(MainForm -> Memo1 -> Handle,EM_SETSEL, sz-szText, sz-szText + cchFind);
??????? if (!fNoScroll)
??????????? SendMessage(MainForm - > Memo1 - > Handle,EM_SCROLLCARET, 0, 0L);
??????? fFound = TRUE;
??????? break;
????? }
??? }
??? if ( !fNoScroll & & !fFound)
??????? MessageBox(NULL, szFind, "字 符 串 沒 有 找 到",MB_OK);
??? return fFound;
??? }
??? VOID Replace(char * szReplace) {SendMessage(MainForm - > Memo1 - > Handle,
??? EM_REPLACESEL, 0, (LPARAM) (LPSTR) szReplace);
??? }
??? VOID ReplaceAll(char * szFind, char * szReplace, BOOLfMatchCase, BOOL fWholeWord)
??? { UINT ichStart;
????? UINT ichEnd;
????? GETSEL(ichStart, ichEnd);
????? SETSEL(0, 0);
????? while(Find(szFind, TRUE, fMatchCase, fWholeWord,TRUE)) {
????? Replace (szReplace);
????? }
????? SETSEL(ichStart, ichEnd);
??? }
??? VOID FindReplace(
??????? char * szFind, char * szReplace,
??????? FRT frt,
??????? BOOL fDown, BOOL fMatchCase, BOOL fWholeWord)
??? { switch (frt)
????? { case frtFind:
??????? Find(szFind, fDown, fMatchCase, fWholeWord,FALSE);
??????? break;
????? case frtReplace:
??????? Find(szFind, fDown, fMatchCase, fWholeWord,FALSE);
??????? Replace (szReplace);
??????? break;
????? case frtRepAll:
??????? ReplaceAll(szFind, szReplace, fMatchCase, fWholeWord);
??? }
}
?? 這些代碼本來并不是給C++ Builder用的,但我們只要稍加改動就能使用了,這也為我們移植以前的代碼提供了新思路,即一般只要將過去程序中的窗口或控制的句柄(HWND)用C++Builder中表單或組件的Handle屬性來代替,將過去程序中的程序事例句柄用HInstance代替,就能方便的完成移植。回到程序中來,上面有5個函數和2個宏,其實我們直接使用的只有FindReplace函數。先在表單上放上FindDialog和ReplaceDialog兩個對話框,隨后寫“查找(F)...”菜單項的處理代碼:
FindDialog1->Execute();
?? 你可能會很奇怪,這么簡單,那查找的過程在哪里呢?當用戶按了查找對話框的[查找下一個(F)]按鈕后,會產生FindDialog的OnFind事件,在該事件的處理函數中進行查找工作。如何編寫組件的事件函數?
(1)在表單編輯區選中該組件(這里是FindDialog1);
(2)在對象觀察器(如果沒有顯示,按F11調出)中選擇Event(事件),系統將列出事件;
(3)雙擊事件后面的編輯框(這里是OnFind),系統將切換入代碼編輯區;
(4)輸入事件處理代碼。
下面給出OnFind的處理代碼:
MainForm - > SerFocus();
FindReplace(FindDialog1 - > FindText.c_str(), "", frtFind,
??? FindDialog1 - > Options. Contains(frDown),
??? FindDiaiog1 - > Options.Contains(frMatchCase),
??? FindDialog1 - > Options.Contains(frWholeWord));
同樣的,“替換(&R)”菜單項處理代碼是:
ReplaceDialog1 - > Execute();
ReplaceDialog1的onFind 事件的處理代碼:
MainForm - > SetFocus();
if(ReplaceDialog1 - > Options.Contains(frFindNext))
FindReplace(ReplaceDialog1 - > FindText.c_str(),"", frtFind,
??? ReplaceDialog1 - > Options. Contains(frDown),
??? ReplaceDialog1 - > Options. Contains(frMatchCase),
??? ReplaceDialog1 - > Options. Contains(frWholeWord));
ReplaceDialog1的onReplace 事件(用戶按了[替換(R)]按鈕)的處理代碼:
MainForm - > SetFocus ();
if(ReplaceDialog1 - > Options. Contains (frReplace))
FindReplace(ReplaceDialog1 - > FindText. c_str(),
??? ReplaceDiaiog1 - > ReplaceText. c_str(), frtReplace,
??? ReplaceDialog1 - > Options. Contains(frDown),
??? ReplaceDialog1 - > Options. Contains(frMatchCase),
??? ReplaceDialog1 - > Options. Contains(frWholeWord));
else if(ReplaceDialog1 - > Options. Contains (frReplaceAll))//全部替換
FindReplace(ReplaceDialog1 - > FindText.c_str(),
??? ReplaceDialog1 - > ReplaceText, c_str(), frtRepAll,
??? ReplaceDialog1 - > Options. Contains(frDown),
??? ReplaceDialog1 - > Options. Contains(frMatchCase),
??? ReplaceDialog1 - > Options. Contains(frWholeWord));
當然,還有“查找下一個(N)”菜單項,處理的方法幾乎和OnFind一樣:
FindReplace(FindDialog1 - > FindText. c_str(),"", frtFind,
??? FindDialog1 - > Options. Contains (frDown),
??? FindDialog1 - > Options. Contains (frMatchCase),
??? FindDialog1 - > Options. Contains(frWholeWord));
??? 至此為止,終于真的“大”功告成了。至于“幫助(H)”菜單處理,你可以用WinHelp來顯示一個幫助文
件,用MessageBox來顯示“關于XXX”的對話框,這些都不怎么和C++ Builder有關,我就不贅述了。
??? 最后還有些收尾工作,選擇Project菜單Options,將顯示一個程序設置的對話框。
??? 1.選擇Application頁面,這里Title是程序在任務欄上的標題,默認的是程序文件名。我們將它設為
“我的記事本V1.00”。接著,單擊[Load Icon...]按鈕來為你的軟件選擇一個圖標。
??? 2.選擇Compiler頁面,單擊[Release]按鈕,這樣就不會向程序中插入調試代碼而加快執行速度。
??? 3.選擇Linker頁面,取消對Use Dynamic RTL的選擇,不使用動態鏈接庫。
??? 4.選擇Packages頁面,取消對Build with runtime packages的選擇,不使用運行時包。
??? 按OK退出后,選Project菜單中的Build NotePad來編譯一下,你的第一個用C++ Builder3制作的稱得上“軟件”的程序終于誕生了。

總結

以上是生活随笔為你收集整理的用C++ Builder3 制作NotePad(记事本)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。