讓你的軟體介面更漂亮 三

2021-06-27 00:07:17 字數 3304 閱讀 7929

實現令人滿意的風格統一的軟體介面確實很難, 象網友提到的messagebox、filedialog、fontdialog、目錄選擇對話方塊等mfc內部甚至系統dll內的對話方塊,要想讓它變臉可不容易。有人說hook技術可以,hook技術確實可以,hook可以說是無孔不入,但hook的使用效率卻是令人難以滿意的,從目前大多數採hook技術的換膚軟體使用情況來看,完全可以證明這一點。今天我們將討論另外一技術來實現filedialog的變臉,這種技術叫替換視窗過程法(注:本人杜撰)。

視窗過程函式是大多視窗都有的,它處理視窗中(包括子視窗)的每乙個事件,替換視窗過程法與hook技術比起來孰強誰弱是很顯然的,因為同乙個hook只能攔截乙個事件,處理起來相當費時,hook也有它的優勢,但不是本文要討論的。這裡先讓大家眼見為實,請看下圖:

一、原理說明:

替換對話方塊的視窗過程要用到這個函式setwindowlong()其原型如下:

1.longsetwindowlong(hwndhwnd,intnindex ,longdwlongnewproc)

2.

3.hwnd為指定視窗的控制代碼,

4.nindex  為 gwl_wndproc時才可設定新的視窗過程

5.dwlongnewproc 為指定新的視窗過程函式位址

反回值為乙個long的數值,此值為舊的視窗過程函式位址。

如果要替換某個視窗的視窗過程函式,首先要想法弄到它的視窗的控制代碼,當然還得有視窗過程。

二、cfiledialog檔案對話方塊介面設計

a. 從cfiledialog派生類cmyfiledialog;

b. 新增protected 型虛成員函式:oninitdone();

此函是實際上是cfiledialog乙個虛函式,它在檔案對話方塊創後建後被呼叫,它給我們留下了乙個入口,因些過載現實替換其視窗過程函式;

c. 新增成員函式mywindowprocnew()

1.staticlresultcallback windowprocnew(hwndhwnd,

2.uintmessage,

3.wparamwparam,

4.lparamlparam);

在這函式實現的時候你可大顯身手,處理得好不好決定你是否能變臉成功。 d. 實現**及說明如下:

01.wndproc m_mywndproc;//定義全域性變數儲存舊的視窗過程函式位址

02.

03.voidcmyfiledialog::oninitdone()

04.

08.

09.lresultcallback cmyfiledialog::mywindowprocnew(hwndhwnd,

10.uintmessage,

11.wparamwparam,

12.lparamlparam)

13.

36.//這時要恢復呼叫舊的視窗函式,當然必時可要忽略它

37.returncallwindowproc(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程式。一 漂亮介面實現的原理 用圖象元素自繪視窗標題樣欄,邊框,系統按鈕 最...