使用FindVCLWindow在Delphi中调用WinHelp32(WinXP Pro SP3 32位)

时间:2009-07-03 09:05:33

标签: windows delphi winapi controls

那里有什么问题?

procedure TForm1.VCLHelpClick(Sender: TObject);
var Ctrl : TWinControl;
 begin
 Ctrl := FindVCLWindow(Mouse.CursorPos);
 if Ctrl <> nil then
  if Form2.Cursor = crHelp then begin
   if Ctrl = CreatorEdit then Application.HelpCommand(HELP_CONTEXT,001);
   if Ctrl = EditorEdit then Application.HelpCommand(HELP_CONTEXT,002);
   if Ctrl = UpdaterEdit then Application.HelpCommand(HELP_CONTEXT,003);
   if Ctrl = IdeaEdit then Application.HelpCommand(HELP_CONTEXT,004);
   if Ctrl = PorterEdit then Application.HelpCommand(HELP_CONTEXT,005);
  end;
 end;

这个想法很简单 - 我有帮助按钮的边框图标,当我点击它时,光标会更改为crHelp。如果我在任何IF的控制下单击,它将调用帮助系统并使用命令上下文打开关联的帮助文件。但它不起作用......这是因为我没有在帮助文件本身中添加对KLink / ELinks的支持吗?

有关创作和开发的帮助,我使用的是ShalomHelpMaker软件。

2 个答案:

答案 0 :(得分:2)

您是否尝试过调试代码?你能告诉我们哪个部分出了问题。

此外,为什么不使用helpcontext,如:

procedure TForm1.VCLHelpClick(Sender: TObject);
var Ctrl : TWinControl;
begin
  if Form2.Cursor <> crHelp then   // Are you sure this is Form2???
    Exit;
  Ctrl := FindVCLWindow(Mouse.CursorPos);
  if Ctrl = nil then Exit;

  Application.HelpCommand(HELP_CONTEXT, Ctrl.HelpoContext);
end;

FindVCLControl看起来还有其他一些功能。但是以下代码有效:

procedure TForm1.Button1Click(Sender: TObject);
var
  ctrl : TControl;
  point : TPoint;
begin
  point := Mouse.CursorPos; // Mouse pos at screen
  Dec(point.X, Left); // Adjust for window.
  Dec(point.Y, Top);
  Dec(point.Y, GetSystemMetrics(SM_CYCAPTION)); // Adjust to client area.

  ctrl := ControlAtPos(point, True, True, True);

  // Do something with the control
end;

您可能需要进行一些调整,但这可以从位置控制窗口。

答案 1 :(得分:0)

工作代码:

procedure TForm1.VCLHelpClick(Sender: TObject);
var WCtrl : TWinControl;
begin
  WCtrl := FindVCLWindow(Mouse.CursorPos);
  if WCtrl <> nil then
   Application.HelpCommand(HELP_CONTEXT, wCtrl.HelpContext);
end;

P.S。所有以前的代码probobly也没关系,但我重新检查了我的事件处理程序,并发现在一个标签中它丢失了(虽然当我点击那些有onclick的时候,它没有用)。另外......问题可能是错误的光标检查。

好的,谢谢你的支持,伙计们!