關於Find對話方塊的使用

2021-05-11 11:52:37 字數 3630 閱讀 8606

查詢/替換對話方塊

cfindreplacedialog

的使用

在windows通用對話方塊中,查詢/替換對話方塊是比較特殊的乙個,它是乙個非模態對話方塊,所以它的使用與其它通用對話方塊有所不同。

一、註冊

註冊的目的有兩個,一是說明在程式中要使用查詢/替換對話方塊,二是讓視窗能響應查詢/替換訊息,提供相應的訊息函式。

註冊位置應該在查詢/替換對話方塊的父視窗,比如主框架視窗cmainframe、檢視cxxview或某對話方塊。也就是響應查詢/替換操作的那個視窗。

比如,欲在檢視中響應查詢/替換操作,則在檢視中加入下面的註冊**(紅字為新增的**):

class cedittestview : public cformview

;implement_dyncreate(cedittestview, cformview)

static uint wm_findreplace = ::registerwindowmessage( findmsgstring );

begin_message_map(cedittestview, cformview)

//}afx_msg_map

on_registered_message(wm_findreplace,onfindreplace)

end_message_map()

註冊完成後,onfindreplace()函式可用來接收查詢/替換對話方塊的使用者訊息,另外用classwizard開啟cedittestview,可以發現id_edit_find和id_edit_replace兩個id號,可以用來新增查詢/替換選單,這在註冊前是沒有的。

二、對話方塊的建立與顯示

作為非模態對話方塊,必須用new操作符分配儲存空間,再用create()函式進行初始化,最後用showwindow()函式顯示對話方塊。

下面的例子是建立乙個查詢對話方塊:先在選單中用id號id_edit_find新增乙個「查詢」選單項,再用classwizard新增它的響應函式oneditfind(),加入**。

//查詢選單響應函式

void cedittestview::oneditfind()

create()函式的原型如下:

bool create(bool bfinddialogonly,lpctstr lpszfindwhat,lpctstr lpszreplacewhat=null,dword dwflag=fr_down,cwnd* pparentwnd=null);

引數:bfinddialogonly

為對話方塊型別,為true時,顯示查詢對話方塊,為false時,顯示查詢/替換對話方塊;

lpszfindwhat

為在查詢框中顯示的字串;

lpszreplacewhat

為在替換框中顯示的字串;

dwflag

為標誌位,用來定製對話方塊,它可以是乙個或多個標誌的組合,主要取值如下:

fr_down 如果設定,對話方塊中的「向下查詢」單選按鈕被選中,如果沒有設定,「向上查詢」單選按鈕被選中;

fr_hideupdown 不顯示查詢方向單選按鈕;

fr_hidematchcase 不顯示區分大小寫複選按鈕;

fr_hidewholeword 不顯示全字匹配複選按鈕;

fr_matchcase 使區分大小寫複選按鈕處於選中狀態;

fr_wholeword 使全字匹配複選按鈕處於選中狀態;

fr_nomatchcase 使區分大小寫複選按鈕處於禁止(變灰)狀態;

fr_noupdown 使查詢方向單選按鈕處於禁止(變灰)狀態;

fr_nowholeword 使全字匹配複選按鈕處於禁止(變灰)狀態;

fr_showhelp 在對話方塊中顯示乙個幫助按鈕。

pparentwnd

指向對話方塊的父視窗,如果為null,則為主框架視窗,使用時需讓它指向接收查詢/替換訊息的視窗。

上例中定製的是乙個查詢視窗,它顯示為:

如果定製乙個查詢/替換視窗,可以新增oneditreplace()函式:

//替換選單響應函式

void cedittestview::oneditreplace()

m_findstring和m_replacestring是預定義的字串變數,用於初始化查詢框和替換框。這時它顯示為:

在create()建立對話方塊前,也可以用成員變數m_fr對對話方塊進行更詳細的定製。

三、響應查詢/替換訊息

查詢/替換對話方塊顯示後,其後單擊其上任何乙個按鈕,訊息都被送到視窗**函式onfindreplace()函式中,所以我們不需要為每個按鈕新增訊息函式,所有對按鈕訊息的處理都在onfindreplace()函式中進行即可。

這裡要注意一點,查詢/替換對話方塊本身沒有查詢/替換功能,它只是為我們提供了乙個接收使用者要求的介面,使我們知道使用者提出了何種查詢/替換要求,真正的查詢/替換工作需另行程式設計實現。這一點與檔案對話方塊相似,用開啟檔案對話方塊不能真的開啟檔案,它只是讓我們知道使用者想要開啟哪個檔案而已。

在onfindreplace()函式中,我們可以用cfindreplacedialog類的成員函式獲知使用者請求,其中主要的有:

static cfindreplacedialog* pascal getnotifier(lparam lparam);

獲取當前查詢/替換對話方塊的指標。引數lparam為傳遞給**函式onfindreplace()的lparam值。

bool findnext()const;

檢取使用者是否單擊「查詢下乙個」按鈕。

bool replacecurrent()const;

檢取使用者是否單擊「替換」按鈕。

bool replaceall()const;

檢取使用者是否單擊「全部替換」按鈕。

利用以上幾個函式可以獲知使用者單擊了哪個按鈕。但在查詢/替換時,還需要知道使用者的查詢/替換設定,這可以用下面的函式檢取這些設定:

cstring getfindstring()const;

檢取查詢的字串。它可能與設定的初始值不同。

cstring getreplacestring()const;

檢取替換的字串。

bool searchdown()const;

檢取查詢方向,為true時表示「向下查詢」。

bool matchcase()const;

檢取「區分大小寫」狀態,為true時表示要求區分大小寫。

bool matchwholeword()const;

檢取「全字匹配」狀態,為true時表示要求全字匹配。

以下就是註冊的onfindreplace()函式,其中「……」為需要使用者編寫的查詢/替換操作。

long cedittestview::onfindreplace(wparam wparam,lparam lparam)

if( pdlg->replacecurrent() )    //替換

if( pdlg->replaceall() )        //全部替換

return 0;

} 示例程式是乙個簡易文字編輯器,模仿記事本的查詢/替換形式設計了相應的查詢/替換形式。

本示例程式與文章《擴充套件edit box控制項的功能》的相同。

示例程式介面圖:

關於對話方塊

1.1 一般new的時候在初始化的時候,而進行銷毀的時候是在程式退出的時候。1.2 就如windows中的,在init函式進行new操作然後在onclose函式中進行delete操作。1.3 注意 在沒有不得已的時候不要在標頭檔案中包含其他標頭檔案,這是非常之高危險的事情,盡量的使用前置宣告。1.4...

關於伸縮對話方塊的使用

我根據我的情況將對話方塊上的控制項分為了三類,其他的情況直接可以參考。第一類 按鈕 工具欄控制項,對話方塊尺寸發生改變的時候,這類控制項位置發生改變,大小不發生改變。第二類 滾動條類控制項,對話方塊尺寸改變,滾動條的乙個方向尺寸發生改變,另外乙個方向不變 第三類 pic控制項,這類控制項必須隨著對話...

對話方塊的使用

1 對話方塊的特性 對話總是依賴父視窗 jframe 當父視窗關閉,對話方塊也被關閉,父視窗最小化,對話方塊隨之最小化。對話方塊分模態和非模態兩類。2 使用joptionpane建立對話方塊 通過該類的show dialog方法,如果是在jinternalframe中使用,用相應的showinter...