1

开始子类化控件的正确地点/时间是什么?

恢复原始窗口 proc 的适当时间是什么时候?

现在我在表单创建期间子类化:

procedure TForm1.FormCreate(Sender: TObject);
begin
   FOldPanel1WindowProc := Panel1.WindowProc;
   Panel1.WindowProc := Panel1WindowProc;
end;

我在表单销毁期间恢复子类化:

procedure TForm1.FormDestroy(Sender: TObject);
begin
   Panel1.WindowProc := FOldPanel1WindowProc;
end;

这很好用,只要我不使用ThemeManager,它的子类控制自己。一旦尝试对 ThemeManager 子类的控件进行子类化,我就会遇到非常讨厌的错误。

我认为这是因为我不应该在Create期间启动子类并在Destroy期间恢复它。那么在 Delphi 中对控件进行子类化和取消子类化的正确记录时间是多少?

4

1 回答 1

3

您的问题尚不清楚,但我假设您在尝试恢复表单的 OnDestroy 事件处理程序中的旧窗口过程时遇到错误。

ThemeManager 在处理WM_DESTROY控件时恢复其子类化。因此你可能必须做同样的事情:WM_DESTROY在你的新窗​​口过程中观察并首先恢复你的子类化,然后调用旧的窗口过程(并让 ThemeManager 做同样的事情)。

我没有对此进行测试,但我认为它应该可以工作。

于 2009-11-19T11:33:31.837 回答