5

我正在对旧版 MFC 应用程序执行维护。我们需要禁用帮助对话框中的打印按钮。如果用户按下帮助窗口中的“打印”按钮,则没有打印机连接到系统并且应用程序崩溃。

该代码只是使用标准HtmlHelpA方法来调出 Windows 帮助对话框:

void CNiftyView::OnHelp() 
{
   CString csHelpFile;
   csHelpFile.Format( "%s/NiftyHelp.chm", NiftyDoc::GetHelpPath() );
   ::HtmlHelpA( m_hWnd, csHelpFile, HH_HELP_CONTEXT, IDH_NIFTY_SECTION );
}

我发现我们可以在帮助 HTML 样式表 ( http://www.sagehill.net/docbookxsl/HtmlHelp.html ) 中使用一些代码来抑制打印按钮。但这需要重新编译帮助文件,我不想这样做。我还发现一些信息说您可以通过操作每个窗格的 HH_WINTYPE 结构来自定义 HTML 帮助查看器,但没有关于您如何实际执行此操作的信息(http://msdn.microsoft.com/en-us/library/ms524435%28v =vs.85%29.aspx)。

有没有办法以编程方式禁用 HTML 帮助查看器中的打印按钮?

4

1 回答 1

6

您可以在没有打印按钮的情况下显示 CHM 帮助文件,如下所示:

  • HtmlHelp使用命令调用HH_GET_WIN_TYPE以获取指向HH_WINTYPE包含在 CHM 文件中定义的 HTML 帮助查看器参数的结构的指针。
  • 复制返回的结构。(直接修改返回的结构是行不通的。)
  • 修改fsToolBarFlags结构的成员以排除该HHWIN_BUTTON_PRINT值。
  • 使用命令将修改后的HH_WINTYPE结构传回HtmlHelp函数HH_SET_WIN_TYPE

示例 C++ 代码*:

HH_WINTYPE *pwt = NULL;
LPCWSTR pszFile = L"MyFile.chm";
LPCWSTR pszWin = L"MyFile.chm>Main"; // "Main" is the window type defined in the CHM file

// Get the window type definition
HWND hWndHelp = HtmlHelp(NULL, pszWin, HH_GET_WIN_TYPE, (DWORD) &pwt);

if (pwt) {
    // Copy the contents of the returned structure
    HH_WINTYPE wt = *pwt;

    // Remove the "Print" toolbar button from the window definition
    wt.fsToolBarFlags &= ~HHWIN_BUTTON_PRINT;
    wt.cbStruct = sizeof(wt); // force the correct size

    // Set the new window type
    hWndHelp = HtmlHelp(NULL, pszFile, HH_SET_WIN_TYPE, (DWORD) &wt);

    // Display help
    hWndHelp = HtmlHelp(NULL, pszFile, HH_DISPLAY_TOPIC, NULL);
}

我几乎不懂 C++,所以这是非常业余的代码。请自由编辑和改进它。

HH_WINTYPE更多使用和HH_GET_WIN_TYPE的示例HH_SET_WIN_TYPE
如何以编程方式创建三窗格 HTML 帮助窗口
如何使用托管 Visual C# 应用程序中的非托管 HTML 帮助 API

于 2013-04-09T12:28:35.397 回答