当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

改正VCL源码实现自定义输入对话框[VC/C++编程]

赞助商链接



  本文“改正VCL源码实现自定义输入对话框[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

通过改正VCL源码实现自定义输入对话框

在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实InputBox也是调用了InputQuery,这个函数有几个缺陷:

(1).输入对话框上的按钮是英文的.

(2).不能实现星号密码的效果.

但在实际编程中常常会碰到这样的问题.满是中文的界面和提醒,但是在输入对话框中倒是英文的按钮,显的有些不调和,并且有时在Win2k下做的程序,换在Win98下的时刻,输入对话框中的提醒会显示不完好.普通在Form中可以通过更改默许字体为宋体9号来办理,但是在输入对话框中可不可以呢?答案是必定的,办法就是:改正VCL源码!

以下办法介绍了在BCB 6.0 企业版中通过改正VCL源码实现自定义输入对话框.

1. 在BCB6安装目录的Source\Vcl目录下找到dialogs.pas,并copy一份到你的工程目录下.

2. 翻开方才复制过来的dialogs.pas,改正此中的InputQuery函数代码(1857-1927行):

改正后的代码以下:

function InputQuery(const ACaption, APrompt: string;
  var Value: string): Boolean;
var
  Form: TForm;
  Prompt: TLabel;
  Edit: TEdit;
  DialogUnits: TPoint;
  ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
  Result := False;
  Form := TForm.Create(Application);
  with Form do
   try
    Font.Name := '宋体'; // 更改输入对话框窗体的字体为宋体
    Font.Size := 9;   // 更改输入对话框窗体的字号为9号
    Canvas.Font := Font;
    DialogUnits := GetAveCharSize(Canvas);
    BorderStyle := bsDialog;
    Caption := ACaption;
    ClientWidth := MulDiv(180, DialogUnits.X, 4);
    Position := poScreenCenter;
    Prompt := TLabel.Create(Form);
    with Prompt do
    begin
     Parent := Form;
     Caption := APrompt;
     Left := MulDiv(8, DialogUnits.X, 4);
     Top := MulDiv(8, DialogUnits.Y, 8);
     Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
     WordWrap := True;
    end;
    Edit := TEdit.Create(Form);
    with Edit do
    begin
     Parent := Form;
     Left := Prompt.Left;
     Top := Prompt.Top + Prompt.Height + 5;
     Width := MulDiv(164, DialogUnits.X, 4);
     MaxLength := 255;
     Text := Value;
     if Text = 'Password' then // 假如传进来的默许字符串是"Password"
      PasswordChar := '*';   // 则将输入框变成星号款式的
     SelectAll;
    end;
    ButtonTop := Edit.Top + Edit.Height + 15;
    ButtonWidth := MulDiv(50, DialogUnits.X, 4);
    ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
    with TButton.Create(Form) do
    begin
     Parent := Form;
     Caption := '肯定'; // 肯定按钮,原先的标题是"OK"
     ModalResult := mrOk;
     Default := True;
     SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
      ButtonHeight);
    end;
    with TButton.Create(Form) do
    begin
     Parent := Form;
     Caption := '撤消'; // 撤消按钮,原先标题为"Cancel"
     ModalResult := mrCancel;
     Cancel := True;
     SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
      ButtonWidth, ButtonHeight);
     Form.ClientHeight := Top + Height + 13;     
    end;
    if ShowModal = mrOk then
    begin
     Value := Edit.Text;
     Result := True;
    end;
   finally
    Form.Free;
   end;
end;
   改正完成今后保存这个文件.
3. 在当前工程中加入方才改正过的dialogs.pas,具体操作:Project-->Add to Project-->找到该文件,增添进来便可.
4. 设置一下工程选项:Project-->Options-->Packages-->撤消Build with runtime packages前面的对钩,肯定.
5. 在程序中加入利用InputBox或InputQuery函数的代码.以下为例子:
//---------------------------------------------------------------------------
// by ccrun(老妖)(www.ccrun.com)
// 普通的输入对话框效果
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String strTemp = "";
   InputQuery("标题", "提醒", strTemp);
   ShowMessage(strTemp);
}
//---------------------------------------------------------------------------
// 星号密码的输入对话框效果,与上面代码差别的是,将Default字符串设为Password
// 便可以实现星号密码了.这样做是为了避免全部的输入对话框全变成星号.
// 这里的"Password"要与方才改正dialogs.pas中的字符相对应.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   String strTemp = "Password";
   InputQuery("标题", "提醒", strTemp);
   ShowMessage(strTemp);
}

6. 编译工程并运行.便可以看到中文按钮,星号密码的输入对话框了.


  以上是“改正VCL源码实现自定义输入对话框[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 改正VCL源码实现自定义输入对话框
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .