【问题标题】:Using FindVCLWindow to call WinHelp32 (WinXP Pro SP3 32bit) in DelphiDelphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)
【发布时间】:2010-11-07 21:16:55
【问题描述】:

那里有什么问题?

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 软件。

【问题讨论】:

    标签: windows delphi winapi controls


    【解决方案1】:

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

    此外,你为什么不使用帮助上下文:

    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;
    

    您可能需要进行更多调整,但这可以从该位置获得对窗口的控制。

    【讨论】:

    • 嗯,我最近踩了它,它没有检测到 Control。而且我没有使用这个(短)表单,因为 form2 是动态的,我在运行时添加了所需的上下文 id,所以当我需要找到它时,我需要浏览(scrool)我的代码。在这种情况下,我可以清楚地阅读我正在打开的 ID,而无需搜索 HelpContext ID 值分配。
    • @HX_Unbanned,看起来 FindVCLWindow 是问题所在。我在我的回答中提出了一个替代方案。
    【解决方案2】:

    工作代码:

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

    附:以前的所有代码可能也都可以,但是我重新检查了我的事件处理程序,发现在一个 tlabel 中它丢失了(虽然当我单击具有 onclick 的那些时,它不起作用)。另外......问题可能是错误的光标检查。

    好的,谢谢大家的支持!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多