`
java-mans
  • 浏览: 11455049 次
文章分类
社区版块
存档分类
最新评论

《Windows核心编程》の“查找”和“替换”对话框+“页面设置”对话框

 
阅读更多

要显示“查找”和“替换”文本对话框分别使用函数FindTextReplaceText

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 //把“方向”单选钮设置为“向下”

“查找”和“替换”对话框的使用有些特殊,因为这两种对话框是非模态对话框,即FildTextReplaceText函数被调用后,系统显示对话框马上返回,对话框保持显示状态,直到用户按下了“取消”按钮后对话框才关闭。

如果用户按下了对话框中的某个按钮,对话框设置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 //函数不显示对话框,马上返回并在hDevNameshDevMode字段中返回

//默认打印机的设置情况

PSD_INTHOUSANDTHSOFINCHES//指明ptPagerSizertMinMarginrtMargin等字段使用的单位是英寸

PSD_INHUNDREDTHSOFMILLIMETERS //指明ptPagerSizertMinMarginrtMargin等字段

//使用的单位是毫米

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics