查詢/替換對話方塊
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...