[TIP]利用INI实现语言界面的切换函数

Kingron 2001-11-07 09:57:17
对于INI文件的操作,我不多说了,仅仅就如何实现语言界面的切换做一个简单的说明:
首先,必须把所有的INI语言文件的结构统一,这样,我们只要传入INI的文件名,就可以通用了,例如我们可以做一个过程SetLanguage(const FileName:string);,这样只要用SetLanguage('CN.INI')就可以了,第二个需要注意的地方,你应该可以让用户选择语言界面的文件,因此程序启动的时候,应该搜索程序目录下面的所有INI文件,当然,你可以在INI文件里面添加一些附加的东西,例如,判断是否是语言INI文件还是其他的配置文件,显示的文字等等~~~~~,如果你的程序中还使用了类似ShowMessage('File Saved!')之类的语句,那么也应该用变量代替!!!例如:ShowMessage(MSG_FILE_SAVED);然后读取INI的时候,一起读入MSG_FILE_SAVED,这样才能保证所有的信息全部变成相应的语言!如果对于这些嵌入程序的信息你怕一个个很麻烦的话, 可以用数组来做~~~~~~~~~:)。接下来就是翻译文字了,这个就~~~~~~~~免了吧?最重要的一步到了:切换语言!我以前的方法是自己写一个过程,用Lable1.Caption:=Ini.ReadString(....)之类的,$^*$#@&^@*(^@(^$@^,现在想起来,怎么这么弱?:(,真的很笨,嗯咳~~~~~~不许笑,:),这个方法有一个缺点就是如果你添加一个控件就^$#@&*^%@&*了~~~~~~~~~,所以必须找一个更好的方法!看看下面的函数就知道了:
procedure SetLanguage(const FileName:string,Buff:array of string);
使用这个方法对于大多数的情况已经够了,但是有一个不方便的地方是如果动态创建窗体或者控件的话,就不行了~~~~~:(,不过你可以根据你的需要,可以修改上面的过程,然后在每一个窗体的OnCreate中添加代码就可以了,例如你把上面的过程改成对单个窗体的,就可以了:)。如果还有考虑不到的控件,你自己添加好了~~:),对于一些小程序来说,下面的已经够了:

{****************************************
* 模块说明:利用切换INI切换语言函数*
* 作者:Kingron@163.net *
****************************************}
{****************************************
下面的编译指定表示是否导出成一个INI文件
一般的情况下面,没有必要修改,但需要母本
INI的时候,可以把注释去掉
****************************************}
{$IFNDEF INI_EXPORT}
///{$DEFINE INI_EXPORT}
{$ENDIF}
{****************************************
函数参数说明:
FileName:Ini语言文件名
msg:用于程序中的信息的保存数组
IgnoreTagValue:需要忽略的组件的Tag值
使用举例:
var
Msg:array of string;
.....
SetLanguage(ExtractFilePath(ParamStr(0))+'English.Ini',msg,$FF);
那么函数会忽略所有Tag值为$FF的控件
****************************************}

procedure SetLanguage(const FileName: string; var msg: array of string; const IgnoreTagValue: integer = $FFFF);
const
///下面是一些常量
TRANS_SECTION = 'Translations';
MESSAGES = 'Messages';
COMMON = 'Common';
HINT = 'Hint';
CAPTION = 'Caption';
MSG_PRE = 'SS_Msg_';
var
i, j, k : integer;
Component : TComponent;
Control : TControl;
Strings : TStrings;
Id : string;
OldCaption : pchar;
L : integer;
begin
with TIniFile.Create(FileName) do
try
{$IFDEF INI_EXPORT}
WriteString(COMMON, 'Application.Title', Application.Title);
WriteBool(COMMON, 'CheckValid', True);
{$ELSE}
if not ReadBool(COMMON, 'CheckValid', False) then exit; ///不是合法的语言文件
Application.Title := ReadString(COMMON, 'Application.Title', Application.Title);
{$ENDIF}
for i := Low(msg) to High(msg) do ///读取非控件的一些语言元素
{$IFDEF INI_EXPORT}
WriteString(MESSAGES, MSG_PRE + IntToStr(i), msg[i]);
{$ELSE}
msg[i] := ReadString(MESSAGES, MSG_PRE + IntToStr(i), msg[i]);
{$ENDIF}
for i := 0 to Screen.FormCount - 1 do ///遍历程序所有窗体
begin
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Screen.Forms[i].Name + '.' + CAPTION, Screen.Forms[i].Caption);
WriteString(TRANS_SECTION, Screen.Forms[i].Name + '.' + HINT, Screen.Forms[i].Hint);
{$ELSE}
Screen.Forms[i].Caption := ReadString(TRANS_SECTION, Screen.Forms[i].Name + '.' + CAPTION, Screen.Forms[i].Caption);
Screen.Forms[i].Hint := ReadString(TRANS_SECTION, Screen.Forms[i].Name + '.' + HINT, Screen.Forms[i].Hint);
{$ENDIF}
for j := 0 to Screen.Forms[i].ComponentCount - 1 do ///遍历窗体所有组件
begin
Component := Screen.Forms[i].Components[j] as TComponent;
if Component.Tag = IgnoreTagValue then Continue; ///需要忽略的控件
Id := Screen.Forms[i].Name + '.' + Component.Name + '.';
if Component is TControl then ///普通的控件如:TButton,TSpeedButton,TBitBtn,TCheckBox....
begin
Control := Component as TControl;
/// 下面的代码是用来生成第一个INI文件使用的
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Id + HINT, Control.Hint);
{$ELSE}
Control.Hint := ReadString(TRANS_SECTION, Id + HINT, Control.Hint);
{$ENDIF}
if Control is TCustomEdit then Continue; ///忽略TMemo,TEdit之类的
if (Component is TCustomListBox) or (Component is TCustomRadioGroup)
or (Component is TCustomComboBox) then /// Listbox,RadioGroup,Combobox必须单独处理
begin
Strings := nil; ///本行用于忽略编译信息
if Component is TCustomListBox then Strings := TCustomListBox(Component).Items;
if Component is TCustomRadioGroup then Strings := TRadioGroup(Component).Items;
if Component is TCustomComboBox then Strings := TCustomComboBox(Component).Items;
for k := 0 to Strings.Count - 1 do ///遍历Items的每一项
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, ID + 'Items.' + IntToStr(k), Strings.Strings[k]);
{$ELSE}
Strings.Strings[k] := ReadString(TRANS_SECTION, ID + 'Items.' + IntToStr(k), Strings.Strings[k]);
{$ENDIF}
end;
if Component is TCustomComboBox then Continue; ///Combobox还有一点儿问题,:-(
L := Control.GetTextLen + 1;
GetMem(OldCaption, L);
Control.GetTextBuf(OldCaption, L);
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Id + CAPTION, OldCaption);
{$ELSE}
Control.SetTextBuf(pchar(ReadString(TRANS_SECTION, Id + CAPTION, OldCaption)));
{$ENDIF}
FreeMem(OldCaption, L);
continue;
end;
if Component is TMenuItem then /// 处理TMenuItem
begin
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Id + HINT, TMenuItem(Component).Hint);
WriteString(TRANS_SECTION, Id + CAPTION, TMenuItem(Component).Caption);
{$ELSE}
TMenuItem(Component).Hint := ReadString(TRANS_SECTION, ID + HINT, TMenuItem(Component).Hint);
TMenuItem(Component).Caption := ReadString(TRANS_SECTION, ID + CAPTION, TMenuItem(Component).Caption);
{$ENDIF}
Continue;
end;
if Component is TCustomAction then /// 处理TAction
begin
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Id + HINT, TCustomAction(Component).Hint);
WriteString(TRANS_SECTION, Id + CAPTION, TCustomAction(Component).Caption);
{$ELSE}
TCustomAction(Component).Hint := ReadString(TRANS_SECTION, ID + HINT, TCustomAction(Component).Hint);
TCustomAction(Component).Caption := ReadString(TRANS_SECTION, CAPTION, TCustomAction(Component).Caption);
{$ENDIF}
Continue;
end;
if Component is TOpenDialog then ///处理TOpenDialog,TSaveDialog,....
begin
{$IFDEF INI_EXPORT}
WriteString(TRANS_SECTION, Id + 'Filter', TOpenDialog(Component).Filter);
WriteString(TRANS_SECTION, Id + 'Title', TOpenDialog(Component).Title);
{$ELSE}
TOpenDialog(Component).Filter := ReadString(TRANS_SECTION, ID + HINT, TOpenDialog(Component).Filter);
TOpenDialog(Component).Title := ReadString(TRANS_SECTION, CAPTION, TOpenDialog(Component).Title);
{$ENDIF}
end;
end;
end;
finally
Free;
end;
end;
...全文
256 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tikkypeng 2001-11-25
  • 打赏
  • 举报
回复
关注~~关注~~~
看看~~看看~~
fly_me_to_the_moon 2001-11-20
  • 打赏
  • 举报
回复
要是我我不考虑用INI文件,我会做成RES文件,用LOADSTR()LOADCRU()等完成.
newmanJB 2001-11-20
  • 打赏
  • 举报
回复


啊哟,前辈万岁,高手万岁。

newmanJB 2001-11-20
  • 打赏
  • 举报
回复
啊哟,前辈万岁,高手万岁。
Kingron 2001-11-20
  • 打赏
  • 举报
回复
该死!怎么无法给分了?
lastshrill 2001-11-10
  • 打赏
  • 举报
回复
这么好的贴子,我提一下
lastshrill 2001-11-07
  • 打赏
  • 举报
回复
各位大侠,看看我的帖子
http://www.csdn.net/expert/topic/349/349276.shtm
对不起,占用了老版主的地盘
combsky 2001-11-07
  • 打赏
  • 举报
回复
good,very good;
vernal 2001-11-07
  • 打赏
  • 举报
回复
看了,存了~~
infowain 2001-11-07
  • 打赏
  • 举报
回复
Delphi自带的资源DLL的方式好像还不完善
有些控件例如listview就不能转换
loh 2001-11-07
  • 打赏
  • 举报
回复
这么长的代码,多加点 注释
loh 2001-11-07
  • 打赏
  • 举报
回复
这么长的代码,麻烦多写点注释吗?
eastxiang 2001-11-07
  • 打赏
  • 举报
回复
大家都說得好,值得學習!
Kingron 2001-11-07
  • 打赏
  • 举报
回复
To hellion(恶人):
那倒不是,要不你自己用三种方式测试一下?其实用Delphi自带的资源DLL的方式是最好的,因为可以有事件处理,不过一般用不到。
hellion 2001-11-07
  • 打赏
  • 举报
回复
谁都认为自己的好,亲生的嘛。
delphi_user 2001-11-07
  • 打赏
  • 举报
回复
支持一下
Kingron 2001-11-07
  • 打赏
  • 举报
回复
To kevin_gao:
这个方式:),也知道,我以前也采用过,还是太麻烦,而且更新有问题,界面比较闪烁,还有资源更新的问题,等等,我用过几种方法,还是发现用INI是最方便的。你只要翻译文字即可。:)
Kingron 2001-11-07
  • 打赏
  • 举报
回复
To Crob:
我看了你的利用INI的,当场晕倒,你那样的是控件相关的,如果在窗体上面添加一个控件,就要修改代码!!!我以前也是这么做的,:(,后来发现太麻烦,因此就有了上面的过程,这样,你添加一个控件,不影响你的代码!:)。至于DLL的方式,我也知道,不过那样太麻烦。所以我倾向于用INI。
Crob 2001-11-07
  • 打赏
  • 举报
回复
另外字符串的.res资源文件生成方法是

将下面存成文本文件,例如文件名为chinese.txt
STRINGTABLE
BEGIN
1,"确定"
2,"取消"
END

然后运行delphi\bin\brcc32.exe chinese.txt

编译后生成chinese.res
然后将该.res文件加在Dll工程中({$R chinese.res})编译就生成了资源Dll,可在主程序中调用

具体见http://crob.net/delphi/source/mutilan.zip
kevin_gao 2001-11-07
  • 打赏
  • 举报
回复
多国语言之step

且说Energy受命之后,在Delphi5前苦苦讨教,这才发觉delphi5的技术比他
想象的还厉害,不禁冷汗直流:如果有什么闪失哪里逃得过这里大狭们的眼
睛啊。不由之间身形已经端了5尺。

Energy颤颤危危的New了一个Application,保存慌忙之间居然没起名字,
凭经验应该叫project1;然后放了一个菜单,一个按钮一个label,不禁暗自
思量到。在多国这够说明问题了吧。
想到CJ不觉在菜单的第一项中填下了caption=CJ,name=mnuChinese;呵呵,
既然有CJ也该有Energy,于是另一项中填下了 caption=Energy,name=mnuEnglish;

然后怎么办???
心中无限惶恐的Energy 调出了delphi的例子Demos\Richedit又看了看,立马又
气粗起来。呵呵,有一样好东西,可是让我可以省事不少,不禁又是一阵得意。
(Energy悄悄地把Demos\Richedit\reinit.pas往自己project目录一拷,在
project中又把它加了进来,自言自语道:50% over)

按他的意思先设置一下需要的语言页常数。
implementation

uses reinit;

const
ENGLISH = (SUBLANG_ENGLISH_UK shl 10) or LANG_ENGLISH;
CHINESE = (SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE;

{$R *.DFM}

做个初始化
procedure TForm1.FormCreate(Sender: TObject);
begin
mnuEnglish.Tag:=ENGLISH;
mnuChinese.Tag:=CHINESE;
end;


然后嘛(不就是菜单切换嘛)
于是把两了菜单都指到了一个地方
procedure TForm1.mnuLangClick(Sender: TObject);
begin
if LoadNewResourceModule(TComponent(Sender).Tag) <> 0 then
ReinitializeForms;
end;

呵呵;(90% over)

不会吧,让你step,你到现在都没说,就这么尽抄袭代码。Energy委屈的说,谁让
他是课代表的。想起当年是班里总课代表,我不做功课居然就没人做的年月,不禁
又是一阵感慨。
兄弟们还差10%,加油啊!
菜单[Project]-[Languages]-[Add...]
[Next>],选择中文(chs),英语(eng);(我只用了这两种语言);
[Next>],[Next>],[Next>],[Finsih],[Yes]
让你保存dpg时小心目录可能是chs,应该用上一级目录才好。

看到了吗,这是你可以修改所有的东西。别乱改。
其中有一些出错信息之类这里都后,放心改好了,改完后可以作为一个模板文件保留。
下次就不用改了。
请关闭吧!
现在可以看到你的project Manager中有3个项目,project1.exe,porject1.eng,project1.chs
后面两了是资源文件,你可以
1,双击project1.eng -- form1,然后修改一些东西。比如button1的caption="eng";改变一下它
的大小和字体。
2,双击project1.chs -- form1,然后修改一些东西。比如button1的caption="chs";改一下字体。
不过最好不要随意改动form的大小和位置!
选中project1.exe,设定为Activate;

然后(兄弟们99%了)
右键project1.chs--build;
右键project1.eng--build;
右键project1.exe--build;
run

噫,你会发现exe中的界面不起作用了。呵呵,系统自己自动选择了一个语言页嘛。
什么你不要自动,$#$%^%^&,[project]-[Languages]-[set Active];
对了如果要在调出那个grid方式修改的工具可以[view]-[Translation Manager];

好了好了,顺便付上我写了说明的reinit.pas文件其实好好看一下就知道还有更强大
的功能等着你利用呢!
语言页的常数在windows.pas里开始于行218;且
+-----------------------+-------------------------+
| Sublanguage ID | Primary Language ID |
+-----------------------+-------------------------+
15 10 9 0 bit



unit ReInit;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms;

procedure ReinitializeForms; //重新设置form
function LoadNewResourceModule(Locale: LCID): Longint; // 调取新的语言资源

implementation

type
TAsInheritedReader = class(TReader)
public
procedure ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer); override;
end;

procedure TAsInheritedReader.ReadPrefix(var Flags: TFilerFlags; var AChildPos: Integer);
begin
inherited ReadPrefix(Flags, AChildPos);
Include(Flags, ffInherited);
end;

// 刷新语言页
function SetResourceHInstance(NewInstance: Longint): Longint;
var
CurModule: PLibModule;
begin
CurModule := LibModuleList; // 系统全局变量;模块列表。
Result := 0;
while CurModule <> nil do
begin
if CurModule.Instance = HInstance then
begin
if CurModule.ResInstance <> CurModule.Instance then
FreeLibrary(CurModule.ResInstance); // 释放旧语言页所占资源
CurModule.ResInstance := NewInstance; // 设置新语言页
Result := NewInstance;
Exit;
end;
CurModule := CurModule.Next;
end;
end;

// 调取新的语言资源 LCID为语言页;
function LoadNewResourceModule(Locale: LCID): Longint;
var
FileName: array [0..260] of char;
P: PChar;
LocaleName: array[0..4] of Char;
NewInst: Longint;
begin
GetModuleFileName(HInstance, FileName, SizeOf(FileName)); // 别紧张,只是取一下当前
// 的模块名,之所以如此是
// 由于可能本身是个dll。
GetLocaleInfo(Locale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName)); //取当前使的语言页
P := PChar(@FileName) + lstrlen(FileName); //指针运算而已 //可能是exe :-)
while (P^ <> '.') and (P <> @FileName) do Dec(P); //找到语言页资源文件的后缀
NewInst := 0;
Result := 0;
if P <> @FileName then // 如果找到
begin
Inc(P);
if LocaleName[0] <> #0 then
begin
// Then look for a potential language/country translation
lstrcpy(P, LocaleName); // 解出资源文件名文件
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE); // 加载资源文件
if NewInst = 0 then
begin
// Finally look for a language only translation // 加载失败,使用原文件
LocaleName[2] := #0;
lstrcpy(P, LocaleName);
NewInst := LoadLibraryEx(FileName, 0, LOAD_LIBRARY_AS_DATAFILE);
end;
end;
end;
if NewInst <> 0 then
Result := SetResourceHInstance(NewInst) // 用资源文件刷语言。
end;

function InternalReloadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean;
var
HRsrc: THandle;
ResStream: TResourceStream;
AsInheritedReader: TAsInheritedReader;
begin { avoid possible EResNotFound exception }
if HInst = 0 then HInst := HInstance;
HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);
Result := HRsrc <> 0;
if not Result then Exit;
ResStream := TResourceStream.Create(HInst, ResName, RT_RCDATA);
try
AsInheritedReader := TAsInheritedReader.Create(ResStream, 4096);
try
Instance := AsInheritedReader.ReadRootComponent(Instance);
finally
AsInheritedReader.Free;
end;
finally
ResStream.Free;
end;
Result := True;
end;

function ReloadInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;

function InitComponent(ClassType: TClass): Boolean;
begin
Result := False;
if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
Result := InitComponent(ClassType.ClassParent);
Result := InternalReloadComponentRes(ClassType.ClassName, FindResourceHInstance(
FindClassHInstance(ClassType)), Instance) or Result;
end;

begin
Result := InitComponent(Instance.ClassType);
end;

//重新设置在显示中的所有from,;
procedure ReinitializeForms;
var
Count: Integer;
I: Integer;
Form: TForm;
begin
Count := Screen.FormCount;
for I := 0 to Count - 1 do
begin
Form := Screen.Forms[I];
ReloadInheritedComponent(Form, TForm); //重新刷新所有元件几其父对象
end;
end;

end.
////////////////////////////////
 
用Delphi 5的Integrated Translation Environment (ITE)可以轻易得完成这个工作。

我们创建一个示意性的工程MultiLanguage, 在Form上放一个Label和一个Button, 分别把Caption赋值为“English Label” 和“English Button”。

选择菜单Project|anguages|Add ..., Delphi显示Add Languages对话框, 选择Next。

从语言列表中选中“英语(美国)” 和“中文(中国)”, 选择Next。

ITE会根据所选的语言创建子目录,目录名称是语言的缩写,选择Next。

第一次增加语言时, Update Mode固ㄎ狢reate new, 选择Next。

选择Finish。

Delphi会自动创建支持不同语言的资源动态库。

Delphi还会自动创建一个工程组, 其中包括原有的MultiLanguages.EXE, 还包括新建的两个资源动态库 (MultiLanguages.enu, MultiLanguages.chs)。 保存工程组。

Delphi启动Translation Manager, 左边是需要翻译的语言, 右边是完成百分比。

选择“中文(中国)”|Forms|Unit1, 在右边第15行和20行填写翻译后的中文。 保存并关闭。

打开Project Manager, 编译MultiLanguages.enu和MultiLanguages.chs, Delphi会在相应的子目录生成资源动态库, 但后缀不是DLL而是ENU和CHS。
加载更多回复(5)
相关网站 7 设置窗口最大最小 7 设置窗口标题 7 去掉主菜单 7 修改应用程序图标 7 系统只能允许一个程序运行 7 在状态栏中添加时间 8 研究调用存储过程 8 得到本机的IP地址 9 vc调用chm文件 10 最高窗口的实现 10 防止Edit框中的Password不保密 11 在同一系统中显示GB字符和BIG5字符 12 改变颜色(整个窗体的控件) 13 改变工程表头栏 13 ◆如何找开一个DiaLog的窗口◆ 13 ◆得到系统中设置的窗口颜色◆ 14 ◆如何让点下去的菜单成为V状态◆ 14 ◆如何调用WINDOWS的颜色板◆ 14 ◆如何产生一个MDI的主窗口◆ 15 ◆如何让一个文本控件显示出值◆ 15 ◆如何让一个控件显示出相应的值◆ 16 ◆在调试中怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制控件的焦点◆ 16 ◆如何对析构函数中对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17 ◆如何在框架上建立一个工具条◆ 17 ◆如何生成一个主窗口下方的状态条◆ 18 ◆如何让Cscrollview类中控制其可以流动区域大小◆ 19 ◆MFC中控件的一些基本控制方法◆ 19 ◆如何让一个数字型变量化为字符型变量◆ 19 ◆如何使用“拉动条”,“上下选择”◆ 19 ◆如何使用postmessage来异步触发某事件◆ 21 ◆如何使用Sendmessage来异步触发某事件◆ 22 ◆如何修改父类的相关控件属性◆ 22 ◆如何在程序中得到控件的名◆ 22 ◆如何控制菜单的事件程序◆ 22 ◆如何使用控件中的数据录入的控制属性◆ 23 ◆哪些函数是文档、视图相互处理用的◆ 23 ◆如何建立一个基于对话框一程序◆ 23 ◆如何建立一个线程◆ 24 ◆如何让窗口产生一个图标(从应用程序资源中取出)◆ 24 ◆如何得到一个edit的录入的值◆ 24 ◆如何启动TIMER事件◆ 25 ◆如何使用ctrllist控件实现表格◆ 25 ◆如何从INI文件中得到值◆ 25 ◆如何将图标文件写到窗口中◆ 26 ◆如何得到本机的IP地址◆ 26 ◆如何使用全局变量◆ 26 ◆如何让一个字符加上回车、换行◆ 26 ◆如何定义、使用结构◆ 26 ◆如何在任意程序中显示MessageBox◆ 27 ◆如何在程序判断出debug状态◆ 27 ◆当对话框中有一个滚动条是,当滚动滚动条时的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给执行文件加一个图标◆ 30 ◆如何在全局函数中通过传入的窗口句柄操作窗口◆ 30 ◆如何使桌面文字背景透明?◆ 30 ◆怎样才能在VC里产生一个唯一的字符串◆ 31 ◆如何隐藏进程(在系统状态栏和进程列表里不可见)◆ 31 ◆如何得到一个确定大小的视?◆ 31 ◆如何实现点击窗口任意地方拖动窗口?◆ 32 ◆如何在启动时阻止MDI应用程序创建一个新文档?◆ 33 ◆如何在多文档MFC程序中制作独立的File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为唯一实例?◆ 35 ◆如何向一个文档附加多个视?◆ 35 ◆如何获得文件的图标、属性、大小、类型等参数?◆ 36 ◆如何得到鼠标下面的窗口?◆ 37 ◆设置鼠标的形状◆ 38 ◆在对话框中设置编辑EDIT的值◆ 38 1. 如何获取应用程序的实例句柄? 38 2. 如何通过代码获得应用程序主窗口的指针? 38 3. 如何在程序中获得其他程序的图标? 38 4. 如何编程结束应用程序?如何编程控制windows的重新引导? 39 5.怎样加载其他的应用程序? 39 6. 确定应用程序的路径 39 7. 获得各种目录信息 40 8. 如何自定义消息 40 9. 如何改变窗口的图标? 40 10. 如何改变窗口的 缺省风格? 40 11. 如何将窗口居中显示? 41 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 41 13. 如何使程序保持极小状态? 41 14. 如何限制窗口的 大小? 41 15. 如何使窗口不可见? 41 16. 如何使窗口始终在最前方? 41 17、如何创建一个字回绕的CEditView 42 18、通用控件的显示窗口 42 19、移动窗口 42 20、重置窗口的大小 42 21、如何单击除了窗口标题栏以外的区域使窗口移动 43 22、如何改变视窗的背景颜色 43 23、如何改变窗口标题 44 24、如何防止主框窗口在其说明中显示活动的文档名 44 25、如何获取有关窗口正在处理的当前消息的信息 45 26、如何创建一个不规则形状的窗口 45 27、如何在代码中获取工具条和状态条的指针 47 28、如何使能和禁止工具条的工具提示 47 29、如何设置工具条标题 48 30、如何创建和使用无模式对话框 48 31、如何在对话框中显示一个位图 49 32、如何改变对话或窗体视窗的背景颜色 49 33、如何获取一个对话控件的指针 50 34、如何禁止和使能控件 50 35、如何改变控件的字体 50 36、如何在OLE控件中使用OLE_COLOR数据类型 51 37、在不使用通用文件打开对话的情况下如何显示一个文件列表 51 38、为什么旋转按钮控件看起来倒转 51 39为什么旋转按钮控件不能自动地更新它下面的编辑控件 52 40、如何用位图显示下压按钮 52 41、如何一个创建三态下压按钮 52 42、如何动态创建控件 52 43、如何限制编辑框中的准许字符 53 44、如何改变控件的颜色 54 45、当向列表框中添加多个项时如何防止闪烁 55 46、如何向编辑控件中添加文本 55 47、如何访问预定义的GDI对象 55 48、如何获取GDI对象的属性信息 56 49、如何实现一个橡皮区矩形 56 50、如何更新翻转背景颜色的文本 58 51、如何创建一个具有特定点大小的字体 58 52、如何计算一个串的大小 59 53、如何显示旋转文本 59 54、如何正确显示包含标签字符的串 60 55、串太长时如何在其末尾显示一个省略号 60 56、如何快速地格式化一个CString对象 61 57、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 61 58、如何给系统菜单添加一个菜单项 61 59、如何确定顶层菜单所占据的菜单行数 62 60、在用户环境中如何确定系统显示元素的颜色 62 问:如何控制窗口框架的最大最小尺寸? 63 问:如何改变窗口框架的颜色? 63 问:如何将应用程序窗口置于屏幕正中? 64 问:VC6.0对VC5.0的兼容性? 64 问:打印和打印机的问题? 64 问:CRichEditCtrl滚动条的问题? 65 问:从数据库中读大于32k的内容? 65 问:如何获得CRichEditCtrl中字符的位置? 66 问:如何限制mdi子框架最大化时的大小? 66 问:如何切换视口而不破坏它们? 66 问:改变列表控制时发生闪烁现象? 68 问:处理列表控件可见项的问题? 68 问:产生线程的问题? 68 问:CFile使用了缓冲区吗? 69 问:DAO的密码? 69 问:如何知道CListBox什么时候滚动了? 70 问:视口的不活动性如何处理? 70 问:如何使用COleClientItem的IDispatch接口? 70 问:关于用户自定义的消息使用? 71 问:在打开一个文档时退出? 71 问:在CListCtrl控件中多选择项的删除? 71 问:工作线程的登录状态? 72 问:如何控制菜单的大小? 72 问:改变LVIS_SELECTED的状态颜色? 73 问:如何只存储文档的某一部分? 73 问:保存工具条菜单有bug吗? 73 问:Tip of the day的bug 73 问:如何让我的mfc应用程序可以在最上面? 74 问:如何增加视图中ActiveX控件的事件处理函数? 75 问:如何创建一个动态的Tree控件? 75 问:SDI程序开始时不打开文档? 75 问:List控件中整栏选择? 75 问:如何重载MRU文件? 76 问:CImageList控件中图象橙色被显示为黄色? 76 问:无法正确改变应用程序的图标? 78 问:工具条状态的问题? 78 问:在SDI应用程序中使用Active控件? 79 问:有RichEdit控件的对话框无法正常显示? 79 问:DLL中的模板成员函数? 79 问:CFormView中的上下文帮助? 80 问:CArchive类的WriteObject函数问题? 80 问:RegisterWindowMessage中的BroadcastSystemMessage如何处理? 80 问:CListCtrl中选择变化时如何获得通知? 81 问:如何向ATL-COM对象传送一个数组? 81 问:如何选择CTreeCtrl中的节点文本进行编辑? 82 问:如何改变默认的光标形状? 82 问:如何用键盘滚动分割的视口? 83 问:如何在线程中处理状态条? 83 问:如何阻止WINDOWS关闭? 83 问:如何使一个按钮Disable? 83 问:怎样从MFC扩展动态链结库(DLL)中显示一个对话框? 84 问:想隐藏用户界面怎么办? 85 问:如何实现SDI与MDI的转换? 85 问:CDC中的竖排文本? 86 问:如何激活变灰的弹出菜单? 86 问:线程消息? 87 问:TreeCtrl控制的显示速度太慢? 87 怎样使窗口总是浮现在最上面? 88 改变拖放时的光标外形? 89 如何定位到最新的记录上? 90 MVC和Doc-View? 90 被禁止(Disable)的控件如何改变其文本或背景色? 90 有ODBC的查找函数吗? 91 多个MRU菜单的问题 91 校验框类问题 93 CFormView类的Fold按钮 94 视的背景色 94 隐藏控件台程序 94 修改SDI窗口标题 95 焦点问题 95 从一个OCX调用另一个OCX的方法。 95 得到视 96 字符转化时间 96 二进制还是文本方式? 99 发送消息 99 怎样知道菜单运行时的状态 99 DLL编译出错 100 通用控件的显示窗口 100 如何禁止和使能控件 100 如何在OLE控件中使用OLE_COLOR数据类型 100 在不使用通用文件打开对话的情况下如何显示一个文件列表 100 为什么旋转按钮控件看起来倒转 101 为什么旋转按钮控件不能自动地更新它下面的编辑控件 101 如何动态创建控件 101 如何显示旋转文本 101 在TreeList中使用Edit功能 102 TreeList control中使用check box 103 有关属性对话框(property sheet )的几个提示 108 在MFC加入"这是什么?"的帮助提示 111 精通工具条 112 如何改变视窗的背景颜色 112 为MFC应用程序添加全屏幕显示功能 112 VC常用数据类型使用转换详解 114 用Visual C++操作INI文件 117 单文档加入背景图 119 更新窗体方法 120 更改窗口控件的能动和不能动(以按钮控件为例) 120 窗口响应键盘事件 120 密码框输入受保护 121 最高窗口的实现 122 实现窗口动态写入汉字和改变汉字颜色形状 123
相关网站 7 设置窗口最大最小 7 设置窗口标题 7 去掉主菜单 7 修改应用程序图标 7 系统只能允许一个程序运行 7 在状态栏中添加时间 8 研究调用存储过程 8 得到本机的IP地址 9 vc调用chm文件 10 最高窗口的实现 10 防止Edit框中的Password不保密 11 在同一系统中显示GB字符和BIG5字符 12 改变颜色(整个窗体的控件) 13 改变工程表头栏 13 ◆如何找开一个DiaLog的窗口◆ 13 ◆得到系统中设置的窗口颜色◆ 14 ◆如何让点下去的菜单成为V状态◆ 14 ◆如何调用WINDOWS的颜色板◆ 14 ◆如何产生一个MDI的主窗口◆ 15 ◆如何让一个文本控件显示出值◆ 15 ◆如何让一个控件显示出相应的值◆ 16 ◆在调试中怎么样MESSAGEBOX一个数字◆ 16 ◆如何控制控件的焦点◆ 16 ◆如何对析构函数中对象进行释放◆ 16 ◆如何关闭一个模态窗口◆ 17 ◆如何将一个提示的声音发到声卡上◆ 17 ◆如何得到打开exe的带的参数◆ 17 ◆如何在框架上建立一个工具条◆ 17 ◆如何生成一个主窗口下方的状态条◆ 18 ◆如何让Cscrollview类中控制其可以流动区域大小◆ 19 ◆MFC中控件的一些基本控制方法◆ 19 ◆如何让一个数字型变量化为字符型变量◆ 19 ◆如何使用“拉动条”,“上下选择”◆ 19 ◆如何使用postmessage来异步触发某事件◆ 21 ◆如何使用Sendmessage来异步触发某事件◆ 22 ◆如何修改父类的相关控件属性◆ 22 ◆如何在程序中得到控件的名◆ 22 ◆如何控制菜单的事件程序◆ 22 ◆如何使用控件中的数据录入的控制属性◆ 23 ◆哪些函数是文档、视图相互处理用的◆ 23 ◆如何建立一个基于对话框一程序◆ 23 ◆如何建立一个线程◆ 24 ◆如何让窗口产生一个图标(从应用程序资源中取出)◆ 24 ◆如何得到一个edit的录入的值◆ 24 ◆如何启动TIMER事件◆ 25 ◆如何使用ctrllist控件实现表格◆ 25 ◆如何从INI文件中得到值◆ 25 ◆如何将图标文件写到窗口中◆ 26 ◆如何得到本机的IP地址◆ 26 ◆如何使用全局变量◆ 26 ◆如何让一个字符加上回车、换行◆ 26 ◆如何定义、使用结构◆ 26 ◆如何在任意程序中显示MessageBox◆ 27 ◆如何在程序判断出debug状态◆ 27 ◆当对话框中有一个滚动条是,当滚动滚动条时的消息控制函数◆ 27 ◆将一个CWnd指针转换成一个控件ID(整数)注意用GetDlgItem()函数是从一个控件ID转换成一个CWnd的指针◆ 28 ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给执行文件加一个图标◆ 30 ◆如何在全局函数中通过传入的窗口句柄操作窗口◆ 30 ◆如何使桌面文字背景透明?◆ 30 ◆怎样才能在VC里产生一个唯一的字符串◆ 31 ◆如何隐藏进程(在系统状态栏和进程列表里不可见)◆ 31 ◆如何得到一个确定大小的视?◆ 31 ◆如何实现点击窗口任意地方拖动窗口?◆ 32 ◆如何在启动时阻止MDI应用程序创建一个新文档?◆ 33 ◆如何在多文档MFC程序中制作独立的File|New菜单?◆ 33 ◆如何检测视是否处于分割状态?◆ 34 ◆如何使程序保持极小状态?◆ 34 ◆如何确定当前进程实例是否为唯一实例?◆ 35 ◆如何向一个文档附加多个视?◆ 35 ◆如何获得文件的图标、属性、大小、类型等参数?◆ 36 ◆如何得到鼠标下面的窗口?◆ 37 ◆设置鼠标的形状◆ 38 ◆在对话框中设置编辑EDIT的值◆ 38 1. 如何获取应用程序的实例句柄? 38 2. 如何通过代码获得应用程序主窗口的指针? 38 3. 如何在程序中获得其他程序的图标? 38 4. 如何编程结束应用程序?如何编程控制windows的重新引导? 39 5.怎样加载其他的应用程序? 39 6. 确定应用程序的路径 39 7. 获得各种目录信息 40 8. 如何自定义消息 40 9. 如何改变窗口的图标? 40 10. 如何改变窗口的 缺省风格? 40 11. 如何将窗口居中显示? 41 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 41 13. 如何使程序保持极小状态? 41 14. 如何限制窗口的 大小? 41 15. 如何使窗口不可见? 41 16. 如何使窗口始终在最前方? 41 17、如何创建一个字回绕的CEditView 42 18、通用控件的显示窗口 42 19、移动

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧