我有一个VCL表单,设置为bsDialog
且启用了biHelp
("?"应用栏中的图标)。
我正在关注此示例:http://delphi.about.com/od/adptips2006/qt/custom_bihelp.htm
但是当我点击"?"时,我无法显示WMNCLBUTTONDOWN
Windows消息。按钮。当我点击标题栏时似乎只会触发(就像我要拖动窗口一样。
代码:
procedure TMainFrm.WMNCLBUTTONDOWN(var Msg: TWMNCLButtonDown);
begin
ShowMessage('WMNCLBUTTONDOWN Pre-Help') ;
if Msg.HitTest = HTHELP then
Msg.Result := 0 // "eat" the message
else
inherited;
end;
procedure TMainFrm.WMNCLBUTTONUP(var Msg: TWMNCLButtonUp);
begin
if Msg.HitTest = HTHELP then
begin
Msg.Result := 0;
ShowMessage('Need help?') ;
end
else
inherited;
end;
再次,我看到" Pre-Help"当我点击标题栏时发出的消息,但是当我点击"?"按钮。为什么是这样?我点击该按钮时会尝试显示单独的表单。
答案 0 :(得分:1)
ShowMessage
的模态消息循环会干扰消息处理。例如,使用OutputDebugString
可以看到消息按预期触发:
type
TMainFrm = class(TForm)
protected
procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown);
message WM_NCLBUTTONDOWN;
procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp);
message WM_NCLBUTTONUP;
end;
....
procedure TMainFrm.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
if Msg.HitTest = HTHELP then
begin
OutputDebugString('Help button down');
Msg.Result := 0;
end
else
inherited;
end;
procedure TMainFrm.WMNCLButtonUp(var Msg: TWMNCLButtonUp);
begin
if Msg.HitTest = HTHELP then
begin
OutputDebugString('Help button up');
Msg.Result := 0;
end
else
inherited;
end;
请记住,按钮在释放之前不会被按下。因此,当按钮按下时,您不应该像显示对话框那样采取行动。等到WM_NCLBUTTONUP
再显示另一个对话框。