visualfc

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  42 随笔 :: 0 文章 :: 119 评论 :: 0 Trackbacks
原创 VisualFC
    FOX-TOOLKIT的网站及简介: www.fox-toolkit.org 
   
FOX is a C++ based Toolkit for developing Graphical User Interfaces easily and effectively. It offers a wide, and growing, collection of Controls, and provides state of the art facilities such as drag and drop, selection, as well as OpenGL widgets for 3D graphical manipulation. FOX also implements icons, images, and user-convenience features such as status line help, and tooltips. Tooltips may even be used for 3D objects!
  
    刚开始学习FOX TOOLKIT,做了一个简单的文本显示例子,在Windows平台上我使用了MultiByteToWideChar来实现代码页转换,如果谁能有基于FOX的解决方案,欢迎进行指点和帮助。
    对比WTL,FOX在界面设计和消息传递上要更加简洁和灵活,缺点是不支持本地UI。在本程序中FXText控件的执行效率较低,可以考虑使用fxscintilla来代替。
源码下载:http://www.cppblog.com/Files/visualfc/FoxTest.zip
程序运行界面如下:


程序代码如下:

  1 // FoxTest.cpp : 定义控制台应用程序的入口点。
  2 //
  3 #include "stdafx.h"
  4 #include <fx.h>
  5 #include <windows.h>
  6 
  7 class TextWindow : public FXMainWindow
  8 {
  9     FXDECLARE(TextWindow)
 10 public:
 11     TextWindow(){}
 12     ~TextWindow(){}
 13 public:
 14     enum {
 15         ID_QUIT = FXMainWindow::ID_LAST,
 16         ID_TEXT,
 17         ID_DIRECTORYLIST,
 18         ID_UPDATE_FILE,
 19     };
 20 public:
 21     FXDirList    *dirlist;
 22     FXText        *editor;
 23     FXString     filename;
 24 public:
 25     TextWindow(FXApp* app);
 26     virtual void create();
 27     FXbool loadFile(const FXString& file);
 28     void DumpWidgets();
 29 public:
 30     long onCmdQuit(FXObject*,FXSelector,void*);
 31     long onCmdOpenFile(FXObject*,FXSelector,void*);
 32     long onUpdateFile(FXObject*,FXSelector,void*);
 33 };
 34 
 35 FXDEFMAP(TextWindow) TextWindowMap[] = {
 36     FXMAPFUNC(SEL_COMMAND,  TextWindow::ID_DIRECTORYLIST,       TextWindow::onCmdOpenFile),
 37     FXMAPFUNC(SEL_COMMAND,    TextWindow::ID_QUIT,                TextWindow::onCmdQuit),
 38     FXMAPFUNC(SEL_UPDATE,   TextWindow::ID_UPDATE_FILE,            TextWindow::onUpdateFile),
 39 };
 40 
 41 FXIMPLEMENT(TextWindow,FXMainWindow,TextWindowMap,ARRAYNUMBER(TextWindowMap))
 42 
 43 TextWindow::TextWindow(FX::FXApp* app): FXMainWindow(app,L"FOX TOOLKIT学习 - 显示文本          make:  VisualFC  2009.6.24",NULL,NULL,DECOR_ALL,0,0,800,600)
 44 {
 45     new FXToolTip(app);
 46 
 47     new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X);
 48 
 49     FXHorizontalFrame *main = new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y |FRAME_RAISED);
 50 
 51     FXSplitter *splitter = new FXSplitter(main,LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING);
 52 
 53     FXVerticalFrame *group1=new FXVerticalFrame(splitter,LAYOUT_FIX_WIDTH|LAYOUT_FILL_Y|FRAME_THICK|FRAME_SUNKEN, 0,0,180,00,0,0,0,0,0);
 54     FXVerticalFrame *group2=new FXVerticalFrame(splitter,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_SUNKEN, 0,0,0,00,0,0,0,0,0);
 55 
 56     FXHorizontalFrame *header1=new FXHorizontalFrame(group1,LAYOUT_FILL_X|FRAME_RAISED|FRAME_THICK,0,0,0,00,0,0,00,0);
 57     new FXLabel(header1,L"目录",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT);
 58     new FXButton(header1,L"×\t隐藏目录\t隐藏目录选择窗口",NULL,group1,FXWindow::ID_HIDE,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,00,0,0,0);
 59 
 60     dirlist=new FXDirList(group1,this,ID_DIRECTORYLIST,DIRLIST_SHOWFILES | LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_RIGHT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_BROWSESELECT|DIRLIST_NO_OWN_ASSOC);
 61 
 62     FXHorizontalFrame *header2=new FXHorizontalFrame(group2,LAYOUT_FILL_X|FRAME_RAISED|FRAME_THICK,0,0,0,00,0,0,00,0);
 63     FXLabel* fileslabel=new FXLabel(header2,L"显示文件 : ",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT);
 64     fileslabel->setTarget(this);
 65     fileslabel->setSelector(ID_UPDATE_FILE);
 66 
 67     new FXButton(header2,L">>\t显示目录\t显示目录选择窗口",NULL,group1,FXWindow::ID_SHOW,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,00,0,0,0);
 68     editor = new FXText(group2,this,ID_TEXT,LAYOUT_FILL_X|LAYOUT_FILL_Y);//|FRAME_RAISED|FRAME_THICK  |TEXT_WORDWRAP);
 69     editor->setHiliteMatchTime(2000000000);
 70    // editor->setBarColumns(6);
 71     DumpWidgets();
 72 }
 73 
 74 void TextWindow::create()
 75 {
 76     FXMainWindow::create();
 77     show(PLACEMENT_SCREEN);
 78 }
 79 
 80 long TextWindow::onCmdQuit(FXObject*,FXSelector,void*)
 81 {
 82     getApp()->exit();
 83     return 1;
 84 }
 85 
 86 long TextWindow::onCmdOpenFile(FXObject*,FXSelector,void* ptr)
 87 {
 88     FXTreeItem *item=(FXTreeItem*)ptr;
 89     FXString file;
 90     if(!item || !dirlist->isItemFile(item)) return 1;
 91 
 92     file=dirlist->getItemPathname(item);
 93     editor->setText("");
 94     if(loadFile(file)){    
 95         filename = file;
 96     }
 97 
 98     return 1;
 99 }
100 
101 void TextWindow::DumpWidgets()
102 {
103     register FXWindow *w=getApp()->getRootWindow();
104     register FXObject *t;
105     register FXint lev=0;
106     register FXchar s;
107     FXString str = "FOX TOOLKIT Dump Widgets:\n";
108     FXString tmp;
109     while(w){
110         t=w->getTarget();
111         s=w->shown()?'+':'-';
112         if(t){
113             tmp.format("%*c%s (%p): wk=%d id=%lu target=%s (%p) sel=%d x=%d y=%d w=%d h=%d\n",lev*2,s,w->getClassName(),w,w->getKey(),w->id(),t->getClassName(),t,w->getSelector(),w->getX(),w->getY(),w->getWidth(),w->getHeight());
114             str.append(tmp);
115         }
116         else{
117             tmp.format("%*c%s (%p): wk=%d id=%lu x=%d y=%d w=%d h=%d\n",lev*2,s,w->getClassName(),w,w->getKey(),w->id(),w->getX(),w->getY(),w->getWidth(),w->getHeight());
118             str.append(tmp);
119         }
120         if(w->getFirst()){
121             w=w->getFirst();
122             lev++;
123             continue;
124         }
125         while(!w->getNext() && w->getParent()){
126             w=w->getParent();
127             lev--;
128             if(lev==1) str.append("\n");
129         }
130         w=w->getNext();
131     }
132     editor->setText(str);
133 }
134 
135 long TextWindow::onUpdateFile(FXObject* sender,FXSelector,void*)
136 {
137     FXString string=L"显示文件 : " + filename;
138     sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string);
139     return 1;
140 }
141 
142 
143 FXbool TextWindow::loadFile(const FXString& file){
144 
145     FXFile textfile(file,FXFile::Reading);
146 
147     // Opened file?
148     if(textfile.isOpen()){
149         FXchar *text; FXint size,n,i,j,c;
150 
151         // Get file size
152         size=textfile.size();
153         //限制最大读取字节为10MB
154         if (size >= 10240*1024)
155             size = 10240*1024;
156 
157         // Make buffer to load file
158         if(allocElms(text,size)){
159 
160             // Set wait cursor
161             getApp()->beginWaitCursor();
162 
163             // Read the file
164             n=textfile.readBlock(text,size);
165             if(0<n){
166 #ifdef WIN32
167                 // 使用了 MultiByteToWideChar 实现代码页转换,只能用于Windows环境
168                 int buf_len = MultiByteToWideChar(CP_ACP, 0, text, size,NULL, 0);
169                 wchar_t * data = new wchar_t[buf_len+1];
170                 data[0= L'\0';
171                 buf_len = MultiByteToWideChar(00, text, size,data, buf_len);
172                 data[buf_len] = _T('\0');
173 
174                 for(i=j=0; j<buf_len; j++){
175                     c=data[j];
176                     if(c!=L'\r'){
177                         data[i++]=c;
178                     }
179                 }
180                 n=i;
181                 data[n]=L'\0';
182                 editor->setText(data);
183                 delete[] data;
184 #else
185                 for(i=j=0; j<n; j++){
186                     c=text[j];
187                     if(c!='\r'){
188                         text[i++]=c;
189                     }
190                 }
191                 n=i;
192                 editor->setText(text,n);
193 #endif
194             }
195             // Kill wait cursor
196             getApp()->endWaitCursor();
197             // Free buffer
198             freeElms(text);
199             return true;
200         }
201     }
202     editor->setText("");
203 
204     return false;
205 }
206 
207 int main(int argc, char* argv[])
208 {
209     FXApp app;
210     app.init(argc,argv);
211     TextWindow *win = new TextWindow(&app);
212     app.create();
213     return app.run();
214 }
215 
216 




posted on 2009-06-24 22:14 visualfc 阅读(4099) 评论(9)  编辑 收藏 引用 所属分类: FOX

评论

# re: FOX TOOLKIT 学习 - 文本显示 2009-06-25 08:21 guest
以前挺听过FOX,现在是第一次见。  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2009-06-25 10:54 OwnWaterloo
>>在Windows平台上我使用了MultiByteToWideChar来实现代码页转换,如果谁能有基于FOX的解决方案,欢迎进行指点和帮助。

有基于C标准库的方案。

  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2009-06-25 12:17 visualfc
@OwnWaterloo
能否说的具体一些,我只找到使用iconv的例子。

FOX的FXString保存的是UTF8编码,实际需要的是GBK-UTF8的转换。  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2009-06-27 11:46 OwnWaterloo
@visualfc

原来是要处理utf8...


我指的是
c89 stdlib.h
mbstowcs
wcstombs

c99 wchar.h
mbsrtowcs
wcsrtombs

转换跟locale有关, 标准只保证有"C"和""两种locale存在。
其他的也是跟实现相关。这样的话,上面4个函数的可移植优势就不大了。
同时msvc的crt还不支持utf8 ...


那就用iconv吧。。。 挺好的一个库。
为什么一定要找基于fox的方案呢?


另外,FXString 存放的总是utf8?
要将其显示在控件上?
将 utf8 转为 utf16 再用 xxxxW 函数应该就可以显示了。
应该不用转成 gbk 然后用 xxxxA 函数。  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示[未登录] 2009-06-27 12:26 visualfc
@OwnWaterloo
谢谢。
我使用 setlocale( LC_ALL, "chs")和mbstowcs(...) 替代MultiByteToWideChar 非常好用。

FXString会自动将wchar_t转换为内部的utf8。而FOX TOOLKIT在Windows下显示的时候在内部会将utf8再转换成utf16进行显示。
  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2009-06-28 15:27 webscada@163.com
不管是代码还是界面,丑的不是一点半点  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2011-10-07 09:40 断了的猫
为什么你的FXTex可以使用输入法?
我以前也摆弄过FOX..但是 打不开输入法 很杯具
求指教!  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示[未登录] 2011-10-09 14:05 visualfc
使用 fox1.7.x  回复  更多评论
  

# re: FOX TOOLKIT 学习 - 文本显示 2012-05-14 13:18 littlewater
其实mo本质上已经是UTF-8编码的文件了(选择是UTF-8编码),此时如果使用的是gettext多半先转换成了GBK编码,这下反而让fox不认识了。

一种方法是直接解析mo文件,直接拿到UTF-8字符串完全不需要转换,只是让FOX自身内部去进行到UTF-16的转换即可。

解析代码大概200+行的样子…我取名叫做gettext0…已经尝试过可行。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理