我试图实现IP编辑。这是我的代码:更改宽度SysIPAddress32
unit Main;
interface
uses
System.SysUtils, System.Classes,
Winapi.Windows, Winapi.Messages, Winapi.CommCtrl,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ComCtrls;
type
TIpEdit = class(TWinControl)
strict protected
procedure CreateParams(var Params: TCreateParams); override;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMSetFont(var Message: TWMSetFont); message WM_SETFONT;
end;
TMainForm = class(TForm)
Btn1: TButton;
procedure FormCreate(Sender: TObject);
procedure Btn1Click(Sender: TObject);
private
FIpEdit: TIpEdit;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
{ TIPEdit }
procedure TIPEdit.CreateParams(var Params: TCreateParams);
begin
InitCommonControl(ICC_INTERNET_CLASSES);
inherited CreateParams(Params);
CreateSubClass(Params, WC_IPADDRESS);
Params.Style := Params.Style or WS_TABSTOP or WS_CHILD;
end;
procedure TIPEdit.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTARROWS;
end;
procedure TIPEdit.WMSetFont(var Message: TWMSetFont);
var
LF: LOGFONT;
begin
if GetObject(Message.Font, SizeOf(LF), @LF) <> 0 then
begin
Message.Font := CreateFontIndirect(LF);
inherited;
end;
end;
{ TMainForm }
procedure TMainForm.Btn1Click(Sender: TObject);
begin
FIpEdit.Width := FIpEdit.Width + 100;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
FIpEdit := TIpEdit.Create(Self);
FIpEdit.Parent := Self;
FIpEdit.SetBounds(10, 10, 120, 21);
end;
end.
之前Btn1.Click
结果Btn1.Click
后:控制自己的改变宽度,但不会改变宽度内编辑。
我通过两种方式
- 使用RecreateWnd尝试修复。这工作,但恕我直言,其丑陋的解决方案。
- 修正了内部编辑宽度的问题。这工作,但很难 执行,由于控制的内部工作
也许我错过了什么,有一个更简单的解决方案?
编辑:
我测试RecreateWnd,但使用的DevExpress布局控制时,它不能使用。似乎布局控件使用绕过SetBounds方法的API直接调用。在这种情况下RecreateWnd不能使用。
最后的结论是:
- RecreateWnd是一些ristrictions
- RepeatUntil简单的解决方案answer比较困难,但总是工作
VCL中的很多东西都使用'RecreateWnd'来应用窗口更改。它有时可能不是最佳解决方案,但它也不是一个难看的解决方案。 –