在Delphi语言中,大多数TWinControl的后代都有一个重写方法CreateParams来定义它的子类,比如:'EDIT','COMBOBOX','BUTTON','RICHEDIT‘等等。
CreateSubClass(Params, 'EDIT');
CreateSubClass(Params, 'COMBOBOX');
CreateSubClass(Params, 'BUTTON');Delphi有相当多的丰富的编辑控件,包括来自第三方供应商的控件。所有这些控件都是RichEdit的子类。
我想知道是否有一种方法可以通过测试在RichEdit中定义的SubClass来测试控件是否为CreateParams,而不管它的原始供应商是什么?
发布于 2010-02-20 09:38:01
感谢所有的反馈。我认为没有办法获得TWinControl的windows类名。
以下是从JamesB的版本修改而来的另一个版本的IsRichEdit:
type TWinControlAccess = class(TWinControl);
function IsRichEdit(C: TWinControl): boolean;
const A: array[0..8] of string = (
'RICHEDIT',
'RICHEDIT20A', 'RICHEDIT20W',
'RICHEDIT30A', 'RICHEDIT30W',
'RICHEDIT41A', 'RICHEDIT41W',
'RICHEDIT50A', 'RICHEDIT50W'
);
var Info: TWNDClass;
p: pointer;
s: string;
begin
p := TWinControlAccess(C).DefWndProc;
Result := False;
for s in A do begin
if GetClassInfo(HInstance, PChar(s), Info) and (Info.lpfnWndProc = p) then begin
Result := True;
Break;
end;
end;
end;如果Windows有更新版本的RichEdit类,我们可以修改数组A。
另一个可能但有风险的解决方案是,我只是检查控件的VCL类名是否包含'RichEdit‘字符串,因为Delphi或第三方供应商提供的几乎丰富的编辑VCL类都是这样命名控件的。
发布于 2010-02-19 16:56:33
使用Win32接口GetClassName()或RealGetWindowClass()函数(请参阅What makes RealGetWindowClass so much more real than GetClassName?了解它们之间的区别),然后检查结果中是否有可用的各种RichEdit类名:
用于其他第三方包装的
'RICHEDIT' (1.0)'RICHEDIT20A'或'RICHEDIT20W' (2.x+)'RICHEDIT50W' (4.1)'TRichEdit' (VCL包装)发布于 2010-02-19 16:48:46
我是不是遗漏了什么?这不是一个简单的测试案例:
if (MyControl is TRichEdit)或
if (MyControl is TCustomRichEdit)https://stackoverflow.com/questions/2294962
复制相似问题