讓你的軟體介面更漂亮 三

2021-04-19 07:19:57 字數 2049 閱讀 8201

讓你的軟體介面更漂亮(三)

朱一松

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

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

一、原理說明:

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

long setwindowlong(hwnd hwnd, int nindex ,  long dwlongnewproc)

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

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

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

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

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

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

a. 從cfiledialog派生類cmyfiledialog;

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

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

c. 新增成員函式mywindowprocnew()

static lresult callback windowprocnew(hwnd hwnd,

uint message,

wparam wparam,

lparam lparam);

在這函式實現的時候你可大顯身手,處理得好不好決定你是否能變臉成功。 d. 實現**及說明如下:
wndproc m_mywndproc; //定義全域性變數儲存舊的視窗過程函式位址

void cmyfiledialog::oninitdone()

lresult callback cmyfiledialog::mywindowprocnew(hwnd hwnd,

uint message,

wparam wparam,

lparam lparam)

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

return callwindowproc(m_mywndproc, hwnd, message, wparam, lparam);

}

這個函式callwindowproc()用來恢呼叫復舊視窗過程函式,當然這並不意味取消了新的視窗過程。你也可跳過它不去執行,那為什要恢復舊的視窗過程函式?因為舊的視窗過程函式它處理了太多的事件,而新視窗過程函式只處理我們關心的事件,如果你樂意的話你完全可不要呼叫舊的視窗過程函式,那可是要付出大的代價的。具體細節請大家去實現,可參「

讓你的軟體介面更漂亮(一)

」。三、cmyfiledialog的用法

我把cmyfiledialog寫成乙個dll,有debug和release兩個版,請用時分別選擇 a.先把.lib .dll .h 檔案持拷到工程目錄。在要使用處加如**:

#include "myfiledialg.h"

#pragam comment(lib,"user.lib")

b.顯示檔案對話方塊:
cmyfiledialog myfiledlg(true, 1, _t("對話方塊標題"));

myfiledlg.domodal();

cstring filename = myfiledlg.getpathname()

filename是反回的結果

讓你的軟體介面更漂亮 三

實現令人滿意的風格統一的軟體介面確實很難,象提到的messagebox filedialog fontdialog 目錄選擇對話方塊等mfc內部甚至系統dll內的對話方塊,要想讓它變臉可不容易。有人說hook技術可以,hook技術確實可以,hook可以說是無孔不入,但hook的使用效率卻是令人難以滿...

讓你的軟體介面更漂亮 二

一 統一風格漂亮介面設計的理論與實現 a.視窗和對話方塊 windows操作系中視窗和對話方塊在我們看來是一樣的,就是乙個四邊形,有標題欄 系統按鈕,邊框等,可移動和可變大小。實際上視窗和對話方塊是有的區別的。在建立對話方塊視窗時的工作中要發生兩個主要過程 對話方塊的過程和其視窗過程。win32 s...

讓你的軟體介面更漂亮 VC

我們使用過很多的軟體,給我們留下印象很深的是那些介面漂亮且迷人的軟體,國外的軟體象qicktime,國產的象金山詞霸等,它們的軟體介面設計風格都有獨特之處。本人跟據自已的經驗和大家 一下軟體的漂亮介面實現的原理並提供demo程式。一 漂亮介面實現的原理 用圖象元素自繪視窗標題樣欄,邊框,系統按鈕 最...