UI通用对话框多少会一点之查找和替换
"查找"和"替换"对话框的样式通常如下图所示。
创建查找对话框的函数是FindText()
,用户可以在对话框中输入要搜索的字符串和相关搜索选项﹔创建替换对话框的函数是ReplaceText()
,用户可以在对话框中输入要搜索的字符串和替换的字符串,以及控制查找和替换操作的选项。
HWND WINAPI FindText(_In_ LPFINDREPLACE lpfr);
HwND WINAPI ReplaceText(_Inout_ LPFINDREPLACE lpfr);
"查找"和"替换"对话框都是非模态对话框。如果函数执行成功,则返回值是对话框的窗口句柄,可以通过该句柄与父窗口进行通信; 如果函数执行失败,则返回值为NULL
参数lpfr是一个指向FINDREPLACE结构的指针,先看一下该结构的定义,再介绍"查找"和"替换"对话框的工作原理。该结构在commdlg.h
头文件中定义如下∶
typedef struct
{
DWORD IStructSize;//该结构的大小
HWND hwndOwner;//对话框的拥有者窗口句柄,不能为NULL
HINSTANCE hInstance;
DWORD Flags; //标志位
LPTSTR lpstrFindWhat; //"查找内容"编辑控件中的字符串缓冲区,缓冲区大小至少为80个字符
LPTSTR lpstrReplaceWith;//"替换为"编辑控件中的字符串缓冲区,缓冲区大小至少为80个字符
WORD wFindWhatLen; //lpstrFindWhat字段指向的缓冲区的长度,以字节为单位
WORD wReplaceWithLen; //lpstrReplaceWith字段指向的缓冲区的长度,以字节为单位
LPARAM lCustData;
LPFRHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} FINDREPLACE,*LPFINDREPLACE;
Flags字段是标志位,可以是标志的组合(常用的),如下表所示。
标志 | 含义 |
---|---|
FR_FINDNEXT | 单击了"查找下一个"按钮 |
FR_REPLACE | 点击了"替换"按钮 |
FR_REFLACEALL | 单击了“全部替换”按钮 |
FR_DOWN | 已选中搜索方向的“向下”单选按钮,指示应从当前位置搜索到文档末尾﹔否则就是已选中“向上”单选按钮,指示应从当前位置搜索到文档开头 |
FR_MATCHCASE | 已选中“匹配大小写”复选框 |
FR_WHOLEWORD | 已选中“全字匹西配”复选框 |
FR_HIDEUPDOWN | 隐惹搜索方向的“向上”和“向下”单选按钮 |
FR_HIDEMATCHCASE | 禁用“匹配大小写”复选框 |
FR_NOMATCHMASE | 禁用“全字匹配”复选框 |
FR_DIALOGTERM | 对话框正在关闭 |
在调用FindText()
和ReplaceText()
函数后,系统根据FINDREPLACE结构中字段的设置初始化对话框,例如根据Flags字段的值设置对话框中相关控件的选中、禁用或隐藏状态,lpstrFindWhat
字段指向的缓冲区的内容会显示到"查找内容"编辑控件中,lpstrReplaceWith
字段指向的缓冲区的内容会显示到“替换为"编辑控件中(查找对话框不需要该字段)。
“查找"和"替换"对话框都是非模态对话框。在调用FindText()
和ReplaceText()
函数后,系统显示对话框后并马上返回,对话框保持显示状态,直到用户关闭对话框。如果用户按下了对话框中的某个按钮则对话框设置FINDREPLACE
结构的相关字段并通过 “查找替换消息” 通知父窗口的窗口过程,程序中处理查找和替换的功能集中在这个 "查找替换消息"
中完成。在该消息中可以根据Flags字段的值确定用户按下了哪个按钮,根据lpstrFindWhat
字段指向的缓冲区确定"查找内容"编辑控件的内容,根据lpstrReplaceWith
字段指向的缓冲区确定"替换为"编辑控件的内容。由于对话框必须向父窗口发送消息,因此hwndOwner
字段必须指定为父窗口的句柄。
"查找替换消息"的ID值是多少呢?和拖动列表消息类似,在调用FindText()
和ReplaceText()
前,需要调用
RegisterWindowMessage(FINDMSGSTRING)
函数以获取"查找替换消息”的ID,"查找替换消息"的IParam参数是指向创建对话框时指定的FINDREPLACE结构的指针。FINDMSGSTRING常量在commdlg.h
头文件中定义如下∶
#define FINDMSGSTRING TEXT("commdlg_FindReplace")
在程序的消息循环中使用IsDialogMessage()
函数以确保对话框正确处理键盘输入(例如Tab键和Esc键)。因此,如果需要使用"查找"和"替换"对话框,不适合使用对话框程序。另外,FINDREPLACE结构和搜索与替换字符串的缓冲区变量应该是全局或静态局部变量这样在下一次消息处理的时候还可以继续使用上次保存的值。
WIN32
“查找"和"替换"对话框的应用场合不多,主要用于多行编辑控件和富文本控件,这里仅实现一个简单的示例程序.
- resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 FindReplaceText.rc 使用
//
#define IDR_MENU 101
#define ID_EDIT_FIND 40001
#define ID_EDIT_REPLACE 40002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40003
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
- FindReplaceText.cpp
#include <Windows.h>
#include <tchar.h>
#include <strsafe.h>
#include "resource.h"
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
// 函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// 全局变量
HWND g_hwndFind; // 消息循环中会用到这两个全局变量
HWND g_hwndReplace;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wndclass;
TCHAR szAppName[] = TEXT("FindReplaceText");
HWND hwnd;
MSG msg;
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = NULL;
RegisterClassEx(&wndclass);
hwnd = ::CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL);
::ShowWindow(hwnd, nCmdShow);
::UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
if ((g_hwndFind == NULL || !IsDialogMessage(g_hwndFind, &msg)) &&
(g_hwndReplace == NULL || !IsDialogMessage(g_hwndReplace, &msg)))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UINT WM_FINDREPLACE;
static TCHAR szFindWhat[80] = { 0 };
static TCHAR szReplaceWith[80] = { 0 };
static FINDREPLACE fr = { 0 };
LPFINDREPLACE lpfr;
TCHAR szBuf[256] = { 0 };
if (uMsg == WM_CREATE)
{
// 获取查找替换消息的ID
WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);
// 初始化FINDREPLACE结构,该结构只应该初始化一次
fr.lStructSize = sizeof(FINDREPLACE);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.lpstrReplaceWith = szReplaceWith;
fr.wFindWhatLen = sizeof(szFindWhat);
fr.wReplaceWithLen = sizeof(szReplaceWith);
//fr.Flags = FR_DOWN | FR_MATCHCASE;
return 0;
}
else if (uMsg == WM_COMMAND)
{
if (wParam == ID_EDIT_FIND)
{
if (g_hwndFind == NULL && g_hwndReplace == NULL)
{
// &掉上次关闭对话框时设置的FR_DIALOGTERM标志值
fr.Flags &= ~FR_DIALOGTERM;
g_hwndFind = ::FindText(&fr);
}
}
else if (wParam == ID_EDIT_REPLACE)
{
if (g_hwndReplace == NULL && g_hwndFind == NULL)
{
// &掉上次关闭对话框时设置的FR_DIALOGTERM标志值
fr.Flags &= ~FR_DIALOGTERM;
g_hwndReplace = ::ReplaceText(&fr);
}
}
}
else if (uMsg == WM_DESTROY)
{
::PostQuitMessage(0);
return 0;
}
else if (uMsg == WM_FINDREPLACE)
{
lpfr = (LPFINDREPLACE)lParam;
// 关闭对话框
if (lpfr->Flags & FR_DIALOGTERM)
{
g_hwndFind = NULL;
g_hwndReplace = NULL;
}
// 查找下一个
else if (lpfr->Flags & FR_FINDNEXT)
{
StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“查找下一个”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), fr.lpstrFindWhat);
::MessageBox(hwnd, szBuf, TEXT("提示"), MB_OK);
}
// 替换
else if (lpfr->Flags & FR_REPLACE)
{
::StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“替换”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), fr.lpstrFindWhat);
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n替换内容:"));
::StringCchCat(szBuf, _countof(szBuf), fr.lpstrReplaceWith);
::MessageBox(hwnd, szBuf, TEXT("提示"), MB_OK);
}
// 全部替换
else if (lpfr->Flags & FR_REPLACEALL)
{
::StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“全部替换”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), fr.lpstrFindWhat);
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n替换内容:"));
::StringCchCat(szBuf, _countof(szBuf), fr.lpstrReplaceWith);
::MessageBox(hwnd, szBuf, TEXT("提示"), MB_OK);
}
return 0;
}
return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
}
MFC
这些查找和替换工作,同样MFC对其封装成了CFindReplaceDialog
.在说明其具体使用之前,我们简单过一下,如何添加定制菜单资源整合到我们对话框中。新建菜单资源很简单这里不讲了。建议ID项和笔者规范取齐。
- 菜单ID IDR_MENU
- 菜单项ID ID_EDIT_FIND
- 菜单项ID ID_EDIT_REPLACE
- resource
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 HelloMFC.rc 使用
//
#define IDM_ABOUTBOX 0x0010
#define IDS_ABOUTBOX 101
#define IDD_HELLOMFC_DIALOG 102
#define IDD_MAIN 102
#define IDR_MAINFRAME 128
#define IDR_MENU 131
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 132
#define _APS_NEXT_COMMAND_VALUE 32775
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
我们可以通过配置对话框属性的方式,完成定制菜单的整合工作。但个人而言,我更喜欢用代码的方式注入配置完成整合,两个方式都可以,只有其中一种配置存在,都生效。
BOOL CHelloMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
//设置对话框使用我们定制的菜单 代码方式整合
m_menu.LoadMenu(IDR_MENU);
SetMenu(&m_menu);
CDialogEx::DrawMenuBar();
return TRUE;
}
第二个细节是,由于CFindReplaceDialog
是一个非模态对话框。为了使我们对话框(父窗口)收到替换请求的通知。 所以我们得做一些额外不可少的整合。这点MSDN中有具体的整合步骤,
https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfindreplacedialog-class?view=msvc-170&devlangs=cpp&f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(AFXDLGS%252FCFindReplaceDialog)%3Bk(CFindReplaceDialog)%3Bk(DevLang-C%252B%252B)%3Bk(TargetOS-Windows)%26rd%3Dtrue#create
在整合时读者只需注意一点, OnFindReplace()
函数 的返回值不能是LONG,请修正为LRESULT,以和消息映射宏的函数指针参数匹配上。
- HelloMFCDlg.h
#pragma once
#include <winnt.h>
static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);
class CHelloMFCDlg : public CDialogEx
{
public:
CHelloMFCDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_HELLOMFC_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnFindReplace(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEditReplace();
afx_msg void OnEditFind();
private:
CMenu m_menu;
};
- HelloMFCDlg.cpp
// HelloMFCDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "HelloMFC.h"
#include "HelloMFCDlg.h"
#include "afxdialogex.h"
#include <strsafe.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CFindReplaceDialog* g_findReplaceDialog = NULL;
TCHAR g_szFindWhat[80] = { 0 };
TCHAR g_szReplaceWith[80] = { 0 };
BEGIN_MESSAGE_MAP(CHelloMFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_EDIT_FIND, &CHelloMFCDlg::OnEditFind)
ON_COMMAND(ID_EDIT_REPLACE, &CHelloMFCDlg::OnEditReplace)
ON_REGISTERED_MESSAGE(WM_FINDREPLACE, &CHelloMFCDlg::OnFindReplace)
END_MESSAGE_MAP()
CHelloMFCDlg::CHelloMFCDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_HELLOMFC_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CHelloMFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BOOL CHelloMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
//设置对话框使用我们定制的菜单
m_menu.LoadMenu(IDR_MENU);
SetMenu(&m_menu);
return TRUE;
}
void CHelloMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialogEx::OnSysCommand(nID, lParam);
}
void CHelloMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CHelloMFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
LRESULT CHelloMFCDlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
{
TCHAR szBuf[256] = { 0 };
LPFINDREPLACE lpfr;
lpfr = (LPFINDREPLACE)lParam;
if (lpfr->Flags & FR_DIALOGTERM)
{
//收到了关闭对话框的指令
g_findReplaceDialog = NULL;
}
else if (lpfr->Flags & FR_FINDNEXT)
{
// 查找下一个的指令
StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“查找下一个”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), g_findReplaceDialog->GetFindString());
::MessageBox(this->m_hWnd, szBuf, TEXT("提示"), MB_OK);
}
//替换
else if (lpfr->Flags & FR_REPLACE)
{
::StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“替换”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), g_findReplaceDialog->GetFindString());
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n替换内容:"));
::StringCchCat(szBuf, _countof(szBuf), g_findReplaceDialog->GetReplaceString());
::MessageBox(this->m_hWnd, szBuf, TEXT("提示"), MB_OK);
}
// 全部替换
else if (lpfr->Flags & FR_REPLACEALL)
{
::StringCchCopy(szBuf, _countof(szBuf), TEXT("单击了“全部替换”按钮"));
if (lpfr->Flags & FR_DOWN)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向下”单选按钮"));
}
else
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“向上”单选按钮"));
}
if (lpfr->Flags & FR_MATCHCASE)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“匹配大小写”复选框"));
}
if (lpfr->Flags & FR_WHOLEWORD)
{
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n选中了“全字匹配”复选框"));
}
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n\n查找内容:"));
::StringCchCat(szBuf, _countof(szBuf), g_findReplaceDialog->GetFindString());
::StringCchCat(szBuf, _countof(szBuf), TEXT("\n替换内容:"));
::StringCchCat(szBuf, _countof(szBuf), g_findReplaceDialog->GetReplaceString());
::MessageBox(this->m_hWnd, szBuf, TEXT("提示"), MB_OK);
}
return 0;
}
void CHelloMFCDlg::OnEditFind()
{
if (NULL == g_findReplaceDialog) //只有查找
{
g_findReplaceDialog = new CFindReplaceDialog();
g_findReplaceDialog->Create(TRUE, NULL, NULL, FR_DOWN, this);
g_findReplaceDialog->m_fr.Flags &= ~FR_DIALOGTERM;
g_findReplaceDialog->m_fr.lStructSize = sizeof(FINDREPLACE);
g_findReplaceDialog->m_fr.hwndOwner = this->m_hWnd;
g_findReplaceDialog->m_fr.lpstrFindWhat = g_szFindWhat;
g_findReplaceDialog->m_fr.lpstrReplaceWith = g_szReplaceWith;
g_findReplaceDialog->m_fr.wFindWhatLen = sizeof(g_szFindWhat);
g_findReplaceDialog->m_fr.wReplaceWithLen = sizeof(g_szReplaceWith);
g_findReplaceDialog->ShowWindow(SW_SHOW);
}
}
void CHelloMFCDlg::OnEditReplace()
{
if (NULL == g_findReplaceDialog) //含查找和替换
{
g_findReplaceDialog = new CFindReplaceDialog();
g_findReplaceDialog->Create(FALSE, NULL, NULL, FR_DOWN, this);
g_findReplaceDialog->m_fr.Flags &= ~FR_DIALOGTERM;
g_findReplaceDialog->m_fr.lStructSize = sizeof(FINDREPLACE);
g_findReplaceDialog->m_fr.hwndOwner = this->m_hWnd;
g_findReplaceDialog->m_fr.lpstrFindWhat = g_szFindWhat;
g_findReplaceDialog->m_fr.lpstrReplaceWith = g_szReplaceWith;
g_findReplaceDialog->m_fr.wFindWhatLen = sizeof(g_szFindWhat);
g_findReplaceDialog->m_fr.wReplaceWithLen = sizeof(g_szReplaceWith);
g_findReplaceDialog->ShowWindow(SW_SHOW);
}
}