WTL应用程序向导(LUA版本) 源码简介

WTL应用程序向导(LUA版本) 源码简介
  原创 visualfc
   WTL的应用程序向导(LUA版)使用IupLua编写,本文将对其源代码作一下简要说明,并分析了该向导的多语言界面处理机制。
   WTL的应用程序向导源代码可以从 http://code.google.com/p/visualfc/downloads/list下载。下面对其作一下简要说明。
   
一、开发环境:
    本向导开发环境是Lua for Windows,该项目地址为: http://luaforwindows.luaforge.net/
    wiz_main.wlua是向导主文件,使用纯文本格式编写。
    wiz_chs.wlua是中文向导,初始化了中文界面后调用wiz_main.wlua
    resource目录为向导使用的中文资源文件和图片
    Template目录为应用程序向导模板目录,从WTL80发行包中获取并增加部分功能。

二、向导控件:
    IupLua当前版本(2.7)未提供向导控件,所以我使用IupLua编写了一个向导控件。源代码位于iup\iupwizard.lua 文件中。

三、Iup的id扩展:
    这个在以前文章中有过介绍,仅举例说明 iup.button{title="ok",id="btn_id"},这样可以直接引用btn_id来表示此button,源码位于iup\iupid.lua中。

四、vswizard.dll文件
   主要提供了分析Template目录下模板文件的功能以及一些辅助函数供LUA使用。
   这是从VFC的WTL向导中移植过来,源码位于source\iup_vswizard目录下
   其中luabind目录为自己写的一个c++到lua的简单绑定。
 
五、绝对路径
   我发现在Lua中很难获取lua文件的绝对路径,最后我使用了在vswizard.dll中导出get_module_path 函数的办法以供lua模块使用,如果谁有更简便的方法望告之以加以改进。

六、多语言界面处理:
   Iup目前版本不支持UNICODE,但可以支持代码页。本向导的多语言处理采用了lua的表方式进行处理,在lua源文件中需要显示字符串的地方,使用ui("Sample string")的来取代"Sample string"。
   通过resource\build_lang.lua这个多语言生成工具,可以从lua源文件中直接提取ui("..."),并生成lang_chs.lua供翻译使用,当修改了向导中的ui字符串后,重新运行build_lang.lua,取可重新提取ui("...")字符串,并且不会影响到已经翻译好的字符串。
   我截取了resource\lang_chs.lua部分源代码,该文件通过build_lang.lua自动生成。
local lang  =  {}
lang[
" Project Name " =   " 项目名称 "
lang[
" Location " =   " 本地目录 "

-- ui( " test str " )
function ui(str)
    
if  lang[str]  ~=  nil and lang[str]  ~=   ""  then
        
return  lang[str]
    
else
        
return  str
    end
end
   启用中文界面的wiz_main.wlua文件源码如下:
require  " vswizard "

local app_path 
=  vswizard.get_module_path()
local_lang 
=   string .upper(vswizard.get_local_lang())

if  local_lang  ==   " CHS "  then
    dofile(app_path..
" \\Resource\\lang_chs.lua " )
end

dofile(app_path..
" \\wiz_main.wlua " )
   如果当前语言为中文则加载lang_chs.lua文件并获得了 ui 函数,在wiz_main.wlua中判断是否已经获取了ui函数,如果没有则使用源字符串输出。
local ui  =  ui or function(str)  return  str end
   最后可以看一下build_lang.lua源代码,从中可以发现使用LUA来作此类工具非常的容易。
function make_file(name, out_name)
    file 
=  io.open(name, " r " )
    assert(file,
" Error to load File " ..name)

    s 
=  file:read( " *all " )
    words 
=  {}
    saves 
=  {}
    
for  w  in   string .gmatch(s, " ui%s-%(%s-(\ " . - \ " )%s-%) " do
        
if  words[w]  ==  nil then
            saves[#saves
+ 1 =  w
            words[w] 
=  [[ "" ]]
        end
    end

    file:close()

    file 
=  io.open(out_name, " r " )
    old  =   ""
    
if  file then
        old 
=  file:read( " *all " )
    end
 
   for  w,w1  in   string .gmatch(old, " lang%[(\ " . - \ " )%]%s-=%s-(\ " . - \ " ) " do
        
if  w1  ~=   ""  then
            words[w] 
=  w1
        end
    end

    file 
=  io.open(out_name, " w " )
    assert(file,
" Error to write file " ..out_name)

    file:write( " -- lang file for  " ..name.. " \n\n " )
    file:write(
" local lang = {}\n " )
    
for  k,v  in  ipairs(saves)  do
        file:write(
string .format( " lang[%s] = %s\n " ,v,words[v]))
    end
    file:write(
[[

-- ui( " test str " )
function ui(str)
    
if  lang[str]  ~=  nil and lang[str]  ~=   ""  then
        
return  lang[str]
    
else
        
return  str
    end
end

]])
end

make_file(
" ..\\wiz_main.wlua " , " lang_chs.lua " )


你可能感兴趣的:(WTL应用程序向导(LUA版本) 源码简介)