《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等字段

//使用的单位是毫米

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值