要显示“查找”和“替换”文本对话框分别使用函数FindText和ReplaceText:
HWND WINAPI FindText(
__in LPFINDREPLACE lpfr
);
HWND WINAPI ReplaceText(
__inout LPFINDREPLACE lpfr
);
这两个函数都使用同样的FINDREPLACE结构:
typedef struct {
DWORD lStructSize; //结构长度
HWND hwndOwner; //所属窗口
HINSTANCE hInstance; //
DWORD Flags; //标志
LPTSTR lpstrFindWhat; //指向包含查找字符串的指针,缓冲区的长度至少是80字节,这个字符
//串在初始化时出现在“查找内容”编辑框中,函数也在这里返回用户输入的内容
LPTSTR lpstrReplaceWith; //指向包含替换字符串的指针,本字符串在初始化时出线在
//“替换为”编辑框中,函数也在这里返回用户输入的内容,这个字段在FindText时可以
//为NULL,但在使用ReplaceText时必须设置,否则对话框不会显示
WORD wFindWhatLen; //查找字符串缓冲区长度
WORD wReplaceWithLen; //替换字符串缓冲区长度
LPARAM lCustData; //
LPFRHOOKPROC lpfnHook; //
LPCTSTR lpTemplateName; //
} FINDREPLACE, *LPFINDREPLACE;
结构中关键字段说明:
Flags---标志,创建对话框时函数根据标志中的数值初始化对话框中各控件的状态,返回时根据用户的选择来设置标志字段的内容,标志字段是以下值的组合:
FR_FINDNEXT, FR_REPLACE, FR_REPLACEALL, FR_DIALOGTERM //分别表示用户单击了
//“查找下一个”、“替换”、“全部替换”、“取消”按钮
FR_HIDEUPDOWN, FR_HIDEMATCHCASE, FR_HIDEWHOLEWORD //初始化时使用,表示对话框中
//不显示“方向”、“区分大小写”、“全字匹配”按钮
FR_NOMATCHCASE, FR_NOUPDOWN, FR_NOWHOLEWORD //初始化时将“区分大小写”、
//“方向”、“全字匹配”按钮灰化
FR_MATCHCASE, FR_WHOLEWORD //表示用户选择了“区分大小写”或“全字匹配”复选框
FR_DOWN //把“方向”单选钮设置为“向下”
“查找”和“替换”对话框的使用有些特殊,因为这两种对话框是非模态对话框,即FildText和ReplaceText函数被调用后,系统显示对话框马上返回,对话框保持显示状态,直到用户按下了“取消”按钮后对话框才关闭。
如果用户按下了对话框中的某个按钮,对话框设置FINDREPLACE结构中相关字段并通过自定义消息通知父窗口的窗口过程,程序中处理查找和替换的功能集中在这个自定义消息中完成。另外,由于对话框必须向父窗口发送消息,所以hwndOwner字段中必须指定父窗口的句柄,而不能像其他通用对话框一样可以把hwndOwner设置为NULL。
为了让对话框能够使用自定义消息,程序必须首先使用RegisterWindowMessage函数注册自定义消息,这个函数注册消息并返回消息ID,输入参数是消息名称字符串:
UINT WINAPI RegisterWindowMessage(
__in LPCTSTR lpString
);
Windows编程手册中说明了要为查找和替换对话框注册FINDMSGSTRING消息:
#define FINDMSGSTRING TEXT("commdlg_FindReplace")
注意,要把RegisterWindowMessage函数返回的消息ID保存下来,并在主窗口的消息循环中通过判断uMsg是否等于这个消息ID来判断对话框是否返回消息。
因为查找和替换对话框都是非模态对话框,所以使用时要把FINDREPLACE结构和字符串变量放在全局变量中,如果放在窗口过程的局部变量中,对话框还没有关闭的情况下,这些局部变量就已经被释放,以后对话框存取的就会是无效的地址。
函数实例代码片段如下:
//第一步:取得FINDMSGSTRING的消息ID
UINT uFindReplaceMsg; // message identifier for FINDMSGSTRING
uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);
…..
//第二步:显示对话框
FINDREPLACE fr; // common dialog box structure
HWND hwnd; // owner window
CHAR szFindWhat[80]; // buffer receiving string
HWND hdlg = NULL; // handle to Find dialog box
// Initialize FINDREPLACE
ZeroMemory(&fr, sizeof(fr));
fr.lStructSize = sizeof(fr);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;
hdlg = FindText(&fr);
….
//第三步:处理对话框返回的自定义消息
LPFINDREPLACE lpfr;
if (message == uFindReplaceMsg)
{
// Get pointer to FINDREPLACE structure from lParam.
lpfr = (LPFINDREPLACE)lParam;
// If the FR_DIALOGTERM flag is set,
// invalidate the handle that identifies the dialog box.
if (lpfr->Flags & FR_DIALOGTERM)
{
hdlg = NULL;
return 0;
}
// If the FR_FINDNEXT flag is set,
// call the application-defined search routine
// to search for the requested string.
if (lpfr->Flags & FR_FINDNEXT)
{
SearchFile(lpfr->lpstrFindWhat,
(BOOL) (lpfr->Flags & FR_DOWN),
(BOOL) (lpfr->Flags & FR_MATCHCASE));
}
return 0;
}
=======================================================
“页面设置”对话框用来设置打印机参数,用户可以在对话框中选择打印机、打印机纸张大小、页边距和纸张方向,还可以引出一个打印机属性的设置对话框。
显示“页面设置”对话框使用PageSetupDlg函数:
BOOL WINAPI PageSetupDlg(
__inout LPPAGESETUPDLG lppsd
);
lppsd参数指向一个PAGESETUPDLG参数:
typedef struct tagPSD {
DWORD lStructSize; //结构长度
HWND hwndOwner; //所属窗口
HGLOBAL hDevMode; //指向DEVMODE结构
HGLOBAL hDevNames; //指向DEVNAME结构
DWORD Flags; //标志
POINT ptPaperSize; //一个POINT结构,返回纸张大小
RECT rtMinMargin; //返回最小允许的页边距
RECT rtMargin; //返回用户选择的页边距
HINSTANCE hInstance; //
LPARAM lCustData; //
LPPAGESETUPHOOK lpfnPageSetupHook; //
LPPAGEPAINTHOOK lpfnPagePaintHook; //
LPCTSTR lpPageSetupTemplateName; //
HGLOBAL hPageSetupTemplate; //
} PAGESETUPDLG, *LPPAGESETUPDLG;
结构中有关字段说明:
hDevMode---如果用户选择了打印机,那么这里返回一个指针,指向包含DEVMODE结构的内存地址,DEVMODE结构中包含了打印机的名称;
hDevNames---如果用户选择了打印机,那么这里返回一个指针,指向包含DEVNAMES结构的内存地址,DEVNAMES结构包含了打印机的各种属性;
Flags---标志,以下值的组合:
PSD_DEFAULTMINMARGINS //将页边距设置为打印机允许的最小页边距
PSD_DISABLEMARGINS //灰化页边距设置输入框
PSD_DISABLEORIENTATION //灰化纸张方向选择框
PSD_DISABLEPAPER //灰化纸张方向选择框
PSD_DISABLEPAGEPAINTING //不绘画最上方的打印示例图示
PSD_DISABLEPRINTER //灰化“打印机”按钮
PSD_MARGINS //函数用rtMargin字段的值初始化对话框中的数值
PSD_RETURNDEFAULT //函数不显示对话框,马上返回并在hDevNames和hDevMode字段中返回
//默认打印机的设置情况
PSD_INTHOUSANDTHSOFINCHES//指明ptPagerSize、rtMinMargin和rtMargin等字段使用的单位是英寸
PSD_INHUNDREDTHSOFMILLIMETERS //指明ptPagerSize、rtMinMargin和rtMargin等字段
//使用的单位是毫米