wxWidgets⽂件操作(三)wxFileDialog与wxTextCtrl
本⼈⽬前的wx环境是Win7下Code::Blocks nightlybuild 7040+MinGW4.5.1+wx2.9.2 SVN 2011-03-12,编译wx的各选项如下:
mingw32-make - BUILD=release SHARED=0 MONOLITHIC=1 UNICODE=1 2&
如未经说明,所有有关wx的随笔都是在些环境下。
突然提到这个是因为在本⼈过去的经历中,也就是在C::B nightly 7040之前,⽤wxSmith制作界⾯(如下讨论)后,在wxTextCtrl与wxFileDialog互操作时,很郁闷的发现:
1.界⾯菜单⾥的中⽂以及状态栏⾥的中⽂
2.读⼊到wxTextCtrl⾥的中⽂
3.把wxTextCtrl内容写回到⽂本⽂件⾥的中⽂
三者总有⼀个或两个出现乱码,不管我如何地刻苦努⼒,也⽆济于事。为此曾着实郁闷了⼀阵⼦,学习wx的兴趣也因之剧减。但因对wx
的“此情不渝”,wx每有⼀个新的nightly build放出,我都要编译下来试⼀下。终于,这⼀个环境下,该问题不再出现。因此,在未发现有新的问题出现之前,本⼈会在相当长的时间内,⼀直使⽤这个环境,不再尝试跟着新的版本跑了。
好了,⾔归正题。下⾯的例⼦主要解决以下⼏个问题:
1.利⽤wxSmith⽣成中⽂菜单及要注意的问题
2.wxFileDialog的使⽤
3.在wxTextCtrl与wxFileDialog之间进⾏读写⽂件操作,该⽂件⼀定要中英⽂混合,本例中所⽤到的⽂件正是本例程源码之⼀,即wxSmith⽣成的xxxMain.cpp。
在C::B⾥wx项⽬向导下,为⼯程起名为testcnread,名字很不好,原因是易懂的名字都被我在前些版本下测试上述问题时⽤完了,创建这个⼯程时也没指望这个版本下上述问题会消失,所以很随意地起了这样⼀个名(TestCnRead),将就着点吧~
⼯程⽣成后,项⽬下总共有如下⼏个⽂件
testcnreadApp.h
testcnreadMain.h
testcnreadApp.cpp
testcnreadMain.cpp
<
testcnreadframe.wxs
其中testcnreadframe.wxs是wxSimth界⾯⽂件,⽽testcnreadMain.cpp会在程序运⾏时被⽤来测试。
下图是程序运⾏时的主菜单打开后,⿏标点在"(&X)退出"菜单上时的截图,注意状态栏提⽰信息。
下⾯是点击"(&O)打开",然后在弹出的打开⽂件对话框下选择了上述的testcnreadMain.cpp⽂件后,wxTextCtrl将该⽂件内容读⼊后所显⽰的截图。
⽽下图则是点击"(&S)保存"后,将⽂本框⾥的内容保存⾄⽂件dummy.cpp⾥:
⽽下图则是打开保存的⽂件dummy.cpp看看数据显⽰是否正确⽆乱码:
下⾯⼀⼀来说明。
⼀.wxSmith⽣成中⽂界⾯
利⽤wxSimth设计器制作中⽂界⾯当然很简单,只需记着两点就够了:
1.所有有中⽂的地⽅,都需在源代码中(如,本例为testcnreadMain.cpp)将默认的_("blabla")改为wxT("中⽂的东东"),不然程序编译时会导致断⾔失败,运⾏后的界⾯会乱码;
2.wxSimth界⾯设计器每更新⼀次,默认⽣成的代码部分都会重置,如上⾯的例⼦,虽然你已将_("blabla")改为wxT("中⽂的东东")了。假设后来你⼜想起什么,或是新添加了⼀个⼦菜单或是⼀个新的按钮等等,保存后wxSmith⼜会将你已改好的wxT("中⽂的东东")改为_("中⽂的东东"),从⽽⼜⼀次导致前⾯所讲的问题。所以结论是:
1).⼀开始你只需测试⼀个中⽂菜单或按钮项什么的,只要确定是OK,建议⽤英⽂菜单就⾏了;
2).如果你和我⼀样固执,以为给中国⼈写的程序就⼀定得是中⽂菜单,那么,好好构思你的界⾯吧,⼀次完成;
3).如果你是上述2)⾥的⼈,同时也和我⼀样经常改来改去,那么,就不要嫌烦,哪⾥被wxSmith改回去了,你就再把它改回来。弄多⼏次⾃然就知道怎么弄了。
⼆.wxTextCtrl类的两个重要⽅法LoadFile和SaveFile
wxTextCtrl::LoadFile是从⽂件中获取内容:
bool wxTextCtrl::LoadFile ( const wxString & filename, int fileType = wxTEXT_TYPE_ANY )
如果⽂件filename存在,则将⽂件内容加载到wxTextCtrl⾥。
参数:
filename 要加载的⽂件名.
fileType 要加载⽂件的⽂件类型,⽬前该参数被wxTextCtrl所忽略.
返回值: 操作成功返回true ,失败返回 false.
也就是说,要将testcnreadMain.cpp⾥的内容⼀字不漏地读⼊到变量名为text1 (wxTextCtrl* text1)的wxTextCtrl⾥,你只需要下⾯⼀⾏代码:text1->LoadFile(wxT("testcnreadMain.cpp"));
⽽SaveFile则是把wxTextCtrl⾥的内容写⼊到⼀⽂件⾥:
bool wxTextCtrl::SaveFile ( const wxString & filename = wxEmptyString, int fileType = wxTEXT_TYPE_ANY )
把wxTextCtrl⾥的内容保存到⽂件filename⾥
参数:
filename 要保存到的⽂件名.
fileType 要保存⽂件的⽂件类型,⽬前该参数被wxTextCtrl所忽略.
返回值: 操作成功返回true ,失败返回 false.
同样的,要将text1⾥的内容保存到名为dummy.cpp的⽂件⾥,你唯⼀需要的代码就是
text1->SaveFile(wxT("dummy.cpp"));
三.wxFileDialog
getsavefilename使⽤wxFileDialog类时⾸先要包含头⽂件<wx/filedlg.h>
wxFileDialog::wxFileDialog ( wxWindow * parent,
const wxString & message = wxFileSelectorPromptStr,
const wxString & defaultDir = wxEmptyString,
const wxString & defaultFile = wxEmptyString,
const wxString & wildcard = wxFileSelectorDefaultWildcardStr,
long style = wxFD_DEFAULT_STYLE,
const wxPoint & pos = wxDefaultPosition,
const wxSize & size = wxDefaultSize,
const wxString & name = wxFileDialogNameStr )
构选函数。
⽤ShowModal() 显⽰对话框
参数:
parent ⽗窗⼝
message 要显⽰的提⽰信息
defaultDir 默认要打开的⽬录,或为空字符串
defaultFile 要打开的默认⽂件名,或为空字符串
wildcard ⽂件扩展名通配符,⽐如 "*.*" 或 "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif"
style 对话框式样. ⽐如wxFD_OPEN为打开⽂件对话框,wxFD_FILE_MUST_EXIST则为打开⽂件对话框时⽂件必须存在
wxFD_SAVE为保存⽂件对话框,wxFD_OVERWRITE_PROMPT则为保存⽂件时如给定的⽂件已存在,则提⽰是否要覆盖已存在⽂件
pos 对话框位置,未实现
size 对话框⼤⼩,未实现
name 对话框名称,未实现
wxFileDialog::ShowModal() ⽤户点击了OK按钮则返回wxID_OK,不然的话则返回wxID_CANCEL
wxFileDialog::GetPath()、GetPaths()、wxFileDialog::GetFilename()、GetFilenames()其义⾃明。
下⾯是本例中通过打开⽂件对话框,选择源⽂件(testcnreadMain.cpp)并读⼊到wxTextCtrl (text1)⾥的全部代码:
1 #include <wx/filedlg.h>
2
3void testcnreadFrame::OnOpenFileClick(wxCommandEvent& event)
4 {
5 wxFileDialog dlg(this,wxT("打开C++源程序"),wxT(""),wxT(""),
6 wxT("C++源程序(*.cpp)|*.cpp"),
7 wxFD_OPEN|wxFD_FILE_MUST_EXIST);
8if(dlg.ShowModal()==wxID_CANCEL)
9return;
10 text1->LoadFile(dlg.GetPath());
11
12 }
⽽下⾯则是打开保存⽂件对话框,选择要保存的⽂件名(dummy.cpp),然后将wxTextCtrl⾥的内容保存到该⽂件⾥的全部代码: 1void testcnreadFrame::OnSaveFileClick(wxCommandEvent& event)
2 {
3 wxFileDialog* dlg=new wxFileDialog(this,wxT("保存C++源⽂件"),wxT(""),wxT(""),
4 wxT("C++源程序(*.cpp)|*.cpp|⽂本⽂件(*.txt)|*.txt"),
5 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
6if(dlg->ShowModal()==wxID_CANCEL)
7return;
8 text1->SaveFile(dlg->GetPath());
9 dlg->Destroy();
10
11 }
注意两次分别演⽰了在堆上和栈上实例化wxFileDialog的⽅法。
全部源代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论