Winapi 在FindReplace对话框中禁用“查找/查找下一个”选项

Winapi 在FindReplace对话框中禁用“查找/查找下一个”选项,winapi,mfc,Winapi,Mfc,使用::ReplaceText()Win32 api函数时,是否可以禁用或隐藏“查找/查找下一步”按钮,而只保留“替换”按钮 如果没有,我需要滚动我自己的对话框。使用替换文本()对话框可以隐藏方向,匹配大小写,以及使用各种FR\u hide…标志匹配整个单词框,但是它没有任何用于隐藏查找下一个和替换按钮的标志。因此,您必须手动执行此操作 有两种方法可以做到这一点: 您可以创建一个仅包含要显示的UI字段的自定义对话框资源,然后可以分别启用FR_启用模板或FR_启用模板句柄标志,并在lpTempla

使用::ReplaceText()Win32 api函数时,是否可以禁用或隐藏“查找/查找下一步”按钮,而只保留“替换”按钮

如果没有,我需要滚动我自己的对话框。

使用
替换文本()
对话框可以隐藏
方向
匹配大小写
,以及
使用各种
FR\u hide…
标志匹配整个单词
框,但是它没有任何用于隐藏
查找下一个
替换
按钮的标志。因此,您必须手动执行此操作

有两种方法可以做到这一点:

  • 您可以创建一个仅包含要显示的UI字段的自定义对话框资源,然后可以分别启用
    FR_启用模板
    FR_启用模板句柄
    标志,并在
    lpTemplateName
    hInstance
    字段中作为模板提供对话框

  • 您可以启用
    FR_ENABLEHOOK
    标志,并提供
    lpfnHook
    回调,在处理
    WM_INITDIALOG
    消息时禁用/隐藏默认对话框中的现有按钮

  • MSDN文档中描述了这些技术:

    我会选择#2,因为它很容易在代码中实现,例如:

    UINT_PTR CALLBACK FRHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
        if (uiMsg == WM_INITDIALOG)
        {
            HWND hBtn = GetDlgItem(hdlg, 1); // The "Find Next" button is ID 1
            if (hBtn)
                ShowWindow(hBtn, SW_HIDE);
        }
        return 0;
    }
    

    ReplaceText()
    对话框允许您使用各种
    FR\u hide…
    标志隐藏
    方向
    匹配大小写
    、和
    匹配整个单词
    框,但它没有隐藏
    查找下一个
    替换
    按钮的任何标志。因此,您必须手动执行此操作

    有两种方法可以做到这一点:

  • 您可以创建一个仅包含要显示的UI字段的自定义对话框资源,然后可以分别启用
    FR_启用模板
    FR_启用模板句柄
    标志,并在
    lpTemplateName
    hInstance
    字段中作为模板提供对话框

  • 您可以启用
    FR_ENABLEHOOK
    标志,并提供
    lpfnHook
    回调,在处理
    WM_INITDIALOG
    消息时禁用/隐藏默认对话框中的现有按钮

  • MSDN文档中描述了这些技术:

    我会选择#2,因为它很容易在代码中实现,例如:

    UINT_PTR CALLBACK FRHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
    {
        if (uiMsg == WM_INITDIALOG)
        {
            HWND hBtn = GetDlgItem(hdlg, 1); // The "Find Next" button is ID 1
            if (hBtn)
                ShowWindow(hBtn, SW_HIDE);
        }
        return 0;
    }
    


    我的建议是:不要使用那些对话框,因为它们只适合做记事本。我的建议是:不要使用那些对话框,因为它们只适合做记事本。我刚刚尝试了这个,但遇到了一个问题——如果我指定了一个钩子函数,那么“查找替换”对话框就不能正确绘制,应用程序就会冻结。即使hook函数只返回true,这也是真的。你有没有遇到过这种情况?@TomDavies没有。我在发布代码之前测试了它,它运行得很好。但是请阅读文档:“如果钩子过程返回零,则默认对话框过程将处理该消息。如果钩子过程返回非零值,则默认对话框过程将忽略该消息。”是的,请阅读所有文档(有哪些文档-关于这方面的内容很少)。无法让它工作,所以使用模板解决方案,这对我来说更容易。谢谢。我刚刚尝试了这个,但遇到了一个问题-如果我指定了一个钩子函数,那么“查找替换”对话框将无法正确绘制,应用程序将冻结。即使hook函数只返回true,这也是真的。你有没有遇到过这种情况?@TomDavies没有。我在发布代码之前测试了它,它运行得很好。但是请阅读文档:“如果钩子过程返回零,则默认对话框过程将处理该消息。如果钩子过程返回非零值,则默认对话框过程将忽略该消息。”是的,请阅读所有文档(有哪些文档-关于这方面的内容很少)。无法让它工作,所以使用模板解决方案,这对我来说更容易。谢谢