實現令人滿意的風格統一的軟體介面確實很難, 象網友提到的messagebox、filedialog、fontdialog、目錄選擇對話方塊等mfc內部甚至系統dll內的對話方塊,要想讓它變臉可不容易。有人說hook技術可以,hook技術確實可以,hook可以說是無孔不入,但hook的使用效率卻是令人難以滿意的,從目前大多數採hook技術的換膚軟體使用情況來看,完全可以證明這一點。今天我們將討論另外一技術來實現filedialog的變臉,這種技術叫替換視窗過程法(注:本人杜撰)。
視窗過程函式是大多視窗都有的,它處理視窗中(包括子視窗)的每乙個事件,替換視窗過程法與hook技術比起來孰強誰弱是很顯然的,因為同乙個hook只能攔截乙個事件,處理起來相當費時,hook也有它的優勢,但不是本文要討論的。這裡先讓大家眼見為實,請看下圖:
一、原理說明:
替換對話方塊的視窗過程要用到這個函式setwindowlong()其原型如下:
1.
long
setwindowlong(
hwnd
hwnd,
int
nindex ,
long
dwlongnewproc)
2.
3.
hwnd為指定視窗的控制代碼,
4.
nindex 為 gwl_wndproc時才可設定新的視窗過程
5.
dwlongnewproc 為指定新的視窗過程函式位址
反回值為乙個long的數值,此值為舊的視窗過程函式位址。
如果要替換某個視窗的視窗過程函式,首先要想法弄到它的視窗的控制代碼,當然還得有視窗過程。
二、cfiledialog檔案對話方塊介面設計
a. 從cfiledialog派生類cmyfiledialog;
b. 新增protected 型虛成員函式:oninitdone();
此函是實際上是cfiledialog乙個虛函式,它在檔案對話方塊創後建後被呼叫,它給我們留下了乙個入口,因些過載現實替換其視窗過程函式;
c. 新增成員函式mywindowprocnew()
1.
static
lresult
callback windowprocnew(
hwnd
hwnd,
2.
uint
message,
3.
wparam
wparam,
4.
lparam
lparam);
在這函式實現的時候你可大顯身手,處理得好不好決定你是否能變臉成功。 d. 實現**及說明如下:
01.
wndproc m_mywndproc;
//定義全域性變數儲存舊的視窗過程函式位址
02.
03.
void
cmyfiledialog::oninitdone()
04.
08.
09.
lresult
callback cmyfiledialog::mywindowprocnew(
hwnd
hwnd,
10.
uint
message,
11.
wparam
wparam,
12.
lparam
lparam)
13.
36.
//這時要恢復呼叫舊的視窗函式,當然必時可要忽略它
37.
return
callwindowproc(m_mywndproc, hwnd, message, wparam, lparam);
38.
}
這個函式callwindowproc()用來恢呼叫復舊視窗過程函式,當然這並不意味取消了新的視窗過程。你也可跳過它不去執行,那為什要恢復舊的視窗過程函式?因為舊的視窗過程函式它處理了太多的事件,而新視窗過程函式只處理我們關心的事件,如果你樂意的話你完全可不要呼叫舊的視窗過程函式,那可是要付出大的代價的。具體細節請大家去實現,可參「讓你的軟體介面更漂亮(一)」。
三、cmyfiledialog的用法
我把cmyfiledialog寫成乙個dll,有debug和release兩個版,請用時分別選擇 a.先把.lib .dll .h 檔案持拷到工程目錄。在要使用處加如**:
1.
#include "myfiledialg.h"
2.
#pragam comment(lib,"user.lib")
b.顯示檔案對話方塊:
1.
cmyfiledialog myfiledlg(true, 1, _t(
"對話方塊標題"
));
2.
myfiledlg.domodal();
3.
cstring filename = myfiledlg.getpathname()
4.
filename是反回的結果
c. cmyfiledialog有乙個超值的功能,不知有沒有從上圖看出來?它能夠用來代替 shbrowseforfoler 作為目錄選擇對話方塊。這也是我寫cmyfiledialog的初終。建構函式第乙個引數和cfiledialg 一樣,第二個引數為true時可作為目錄選擇 對話方塊, 此時第乙個引數可bool的任意值建議設為true,第三個引數為對話方塊標題,如為null則顯示預設標題,其它引數和cfiledialog一樣。
讓你的軟體介面更漂亮 三
讓你的軟體介面更漂亮 三 朱一松 實現令人滿意的風格統一的軟體介面確實很難,象提到的messagebox filedialog fontdialog 目錄選擇對話方塊等mfc內部甚至系統dll內的對話方塊,要想讓它變臉可不容易。有人說hook技術可以,hook技術確實可以,hook可以說是無孔不入,...
讓你的軟體介面更漂亮 二
一 統一風格漂亮介面設計的理論與實現 a.視窗和對話方塊 windows操作系中視窗和對話方塊在我們看來是一樣的,就是乙個四邊形,有標題欄 系統按鈕,邊框等,可移動和可變大小。實際上視窗和對話方塊是有的區別的。在建立對話方塊視窗時的工作中要發生兩個主要過程 對話方塊的過程和其視窗過程。win32 s...
讓你的軟體介面更漂亮 VC
我們使用過很多的軟體,給我們留下印象很深的是那些介面漂亮且迷人的軟體,國外的軟體象qicktime,國產的象金山詞霸等,它們的軟體介面設計風格都有獨特之處。本人跟據自已的經驗和大家 一下軟體的漂亮介面實現的原理並提供demo程式。一 漂亮介面實現的原理 用圖象元素自繪視窗標題樣欄,邊框,系統按鈕 最...