快捷搜索:

通过消息实现自定义输入框(InputBox)

C++Builder供给了两个显示输入对话框的函数:InputBox和InputQuery(此中InputBox也是经由过程调用InputQuery实现),这个输入对话框有很多毛病,在曩昔的文章中我曾提到过使用改动VCL源码来实现自定义输入对话框,后来在Torry.net看到一篇文章是使用自定义消息的措施来实现,原文是Delphi代码,ccrun(老妖)用C++改写,并适当改动让显示效果更好一些:

基础思路:在输入对话框显示出来曩昔,Post一条消息给主窗体,由主窗体认真改动输入对话框窗体的属性和输入翰墨编辑框的属性,在主窗体中经由过程重载WndProc函数来相应自定义消息。

代码及效果图如下:

.h文件中:

public:

void __fastcall WndProc(TMessage &Msg);

.cpp文件中:

// 自定义一个消息,看护主窗体进行输入框的设置

#define MY_INPUT_BOX WM_USER + 101

//---------------------------------------------------------------------------

// 重载主窗体的WndProc实现自定义消息的处置惩罚

void __fastcall TfrmMain::WndProc(TMessage &Msg)

{

if(Msg.Msg == MY_INPUT_BOX)

{

// Msg.WParam

//0: 通俗模式, 1: 密码框模式

// Msg.LParam

//0: 通俗模式, 1: 带图片的模式

TForm *frm = Screen->Forms[0];

if(frm != this) // 输入框窗体

{

// 将输入对话框的字体设为和主窗体一样,建议将主窗体字体设为宋体Array号

frm->Font->Assign(Font);

// 改变OK和Cancel按钮的标题

HANDLE hBtnOK = FindWindowEx(frm->Handle, NULL, "TButton", "OK");

HANDLE hBtnCancel = FindWindowEx(frm->Handle, NULL, "TButton", "Cancel");

if(hBtnOK)

SetWindowText(hBtnOK, "确定(&O)");

// 本文转自 C++Builder 钻研 - http://www.ccrun.com/article.asp?i=620&d=w74av8

if(hBtnCancel)

SetWindowText(hBtnCancel, "取消(&C)");

// 是否必要显示一个图片

if(Msg.LParam == 1)

{

// 新增一个图片在窗体左下角,指定其Owner为输入框窗体,

// 这样当输入框窗体关闭时自动开释TImage的资本

TImage *img = new TImage(frm);

img->Picture->Assign(Application->Icon);

img->Left = 11;

img->Top = 60;

img->Parent = frm;

img->Show();

}

// 是否为密码框式 // 63 63 72 75 6E 2E 63 6F 6D

if(Msg.WParam == 1)

{

HANDLE hEdit = FindWindowEx(frm->Handle, NULL, "TEdit", NULL);

if(hEdit)

SendMessage(hEdit, EM_SETPASSWORDCHAR, WPARAM(’*’), 0);

}

}

}

TForm::WndProc(Msg);

}

//---------------------------------------------------------------------------

// 歉仄,这个提示又来了,为了防止不认真任的转载者,只好在此留些信息。

// by ccrun(老妖) info@ccrun.com

// 迎接造访 C++Builder钻研 - http://www.ccrun.com

//---------------------------------------------------------------------------

本来的InputBox(图1)

void __fastcall TfrmMain::btnOldStyleClick(TObject *Sender)

{

String strText = InputBox("本来的输入对话框", "请输入一些字符: ", "");

if(strText.Trim().Length() > 0)

ShowMessage(strText);

}

(图1) 可以看到窗体上字符显示不全,并且两个按钮的标题也是英文的。

//---------------------------------------------------------------------------

改善后的效果(图2)

void __fastcall TfrmMain::btnNewStyleClick(TObject *Sender)

{

PostMessage(Handle, MY_INPUT_BOX, 0, 0); // 重点是这一句

String strText = InputBox("新的输入对话框", "请输入一些字符: ", "");

if(strText.Trim().Length() > 0)

ShowMessage(strText);

}

(图2) 颠末改善后,字符显示就对照漂亮了,按钮标题也是中文的。

//---------------------------------------------------------------------------

带图片的效果 (图3)

void __fastcall TfrmMain::btnWithImageClick(TObject *Sender)

{

// Msg.LParam = 1: 带图片的模式

PostMessage(Handle, MY_INPUT_BOX, 0, 1);

String strText = InputBox("带图片效果的输入框", "请输入一些字符: ", "呵呵,带图片的");

if(strText.Trim().Length() > 0)

ShowMessage(strText);

}

(图3)带图片效果的输入框

//---------------------------------------------------------------------------

密码输入框效果(图4)

void __fastcall TfrmMain::btnPwdStyleClick(TObject *Sender)

{

// Msg.WParam = 1: 密码框模式

PostMessage(Handle, MY_INPUT_BOX, 1, 0);

String strText = InputBox("密码输入框", "请输入您的密码: ", "123");

if(strText.Trim().Length() > 0)

ShowMessage(strText);

}

(图4) 密码输入框的效果

您可能还会对下面的文章感兴趣: