XFontDialog——定製CFontDialog第一部分:新增字型過濾器

2020-08-09 00:48:45

下載demo project - 45 Kb

介紹

在我參與的一個專案中,我們必須顯示字型選擇對話方塊。
我的產品經理對MFC有一些問題

CFontDialog。
他非常關注通過簡化來降低支援成本
用戶介面,以消除任何可能混淆
或有誤導性。好吧,這個目標很難反駁。
在的情況下

CFontDialog,
他不喜歡所有不必要的控制
爲我們的應用程式。這是標準

CFontDialog
看起來像:

我的產品經理不喜歡特效、字型樣式和指令碼
控制,因爲我們
應用程式只使用字型和字型大小值。我開始有點感覺了
我擔心(因爲我從來沒有贏過他一次辯論),
所以我指出,我們可以很容易地消除一些不必要的控制。
我請他明天再來示威。在接下來的一天裡,
我試圖弄清楚如何刪除他不喜歡的控制元件。我是
只是部分成功,因爲

CFontDialog
提供很少的
在其API中方便定製用戶介面。
第二天產品經理來了,這是
我給他:

他認爲這看起來很蹩腳,我不得不同意。字型風格
combo還在,去掉了效果控制
只在對話方塊中留下了一個大洞——範例控制元件
甚至沒有調整大小以利用左邊的空閒空間。
最後,我能做的最好的是禁用指令碼組合。

但我在研究中發現了兩件事

首先,你可以使用自己的對話方塊模板,
基於Font.Dlg中提供的模板;
其次,你可以自己提供一個勾點程式
CFontDialog-derived類。

玩了幾天之後

CFontDialog,
我知道可以自定義字型對話方塊的外觀
按照我們想要的方式。這主要涉及到編輯模板
用於標準字體對話方塊,並移動不需要的控制元件
在對話方塊:

我還必須爲範例文字建立新的控制元件,因爲
CFontDialog堅持返迴文字「AaBbYyZz」時
在字型組合中選擇新字型。

要稍微超前一點,這是最後一個對話方塊:

這比標準字體對話方塊更緊湊,
但看起來很像
我們的使用者不需要學習一個完全不同的UI。
與此同時,它刪除了可能令人沮喪的元素
嘗試選擇(沒有明顯的效果,因爲他們不是
在我們的應用中使用)。另外,
它給了我們一個機會來增加一些特性
可以更好地與我們的應用程式整合。

CXFontDialog特性

下面 下麪是新的CXFontDialog中的特性:

除去字型列表和大小列表之外的所有控制元件

字型過濾器只選擇要顯示的字型的特定組

等寬字型的視覺指示

用於等寬和符號字型的新api

API來設定標題字型對話方塊

API來設定範例文字字型對話方塊

實現注意事項

我所依賴的主要技術資訊來源
自定義CFontDialog是MSDN文件上的

CHOOSEFONT結構。
這個結構包含lpfnHook成員,它允許您
設定你的勾點proc,和
lpTemplateName和hInstance
成員,必須對其進行設定,以便載入自定義模板。
MSDN沒有告訴你在哪裏可以找到預設模板。
vs6。0,我在
C:\Program Files\Microsoft Visual Studio \ VC98 \ \ Font.Dlg。
對於Visual Studio 8和9,它位於平臺SDK的中
包括目錄。

找到它之後,下一步是設定一個單獨的XFontDialog。rc檔案,
然後從Font.Dlg中剪下並貼上模板。要設定XFontDialog.rc,
我使用了我在文章中描述的技術

如何在專案之間共用對話方塊。

注意,由於沒有定義IDD_XFONTDIALOG,
類嚮導將IDD_XFONTDIALOG視爲字串。
這樣做的好處是不存在衝突的可能性
與專案中的任何其他對話方塊資源id。

現在我可以使用Visual Studio資源編輯器來設定控制元件
就像我想的那樣——將不需要的控制元件移到一邊,並標記爲不可見。
我也讓樣本控制變大,
並將靜態控制元件新增到字型列表的頂部
等寬字型,您將看到等寬字型顯示:

然後使用類嚮導雙擊生成新的CXFontDialog類
在資源編輯器模板:

我選擇CFontDialog
作爲基礎類別,並輸入CXFontDialog作爲新類名:

最後,我可以使用類嚮導的新類:

您將注意到字型中所有的符號名稱。Dlg一直
轉換爲數位id。這沒有關係,因爲這些id必須
沒有改變,否則CFontDialog將不起作用。
(我在XFontDialog.cpp中爲這些id分配了名稱
讓它更容易使用。)
我已經新增了
CXFontDialog的兩個處理程式函數:OnCtlColor()
以及OnShowMonoSpaced(),它從勾點proc中呼叫
當使用者選擇一個monospac時ed字型(這是等寬的地方
顯示)。我也新增DoModal()函數,
這是指定對話方塊模板和勾點函數。
的關鍵功能是鉤proc, WM_INITDIALOG
是她的老公知道。這就是字型過濾器應用(如果有的話)。

如何使用

CXFontDialog整合到你的應用程式,您首先需要
新增檔案到您的專案:

XFontDialog.cppXFontDialog.hXFontDialog.rcXFontDialogRes.h

注意,XFontDialogRes.h——儘管基本上是空的——是必要的
如果你想在資源編輯器中編輯對話方塊模板。

您還需要新增XFontDialog。rc專案rc檔案——去
檢視|資源包括……在底部的列表框,
向下卷動到最後。插入# include & lt;跨類=「程式碼串」在「XFontDialog.rc」& lt; / span>之前的

endif:

接下來,包括標頭檔案XFontDialog.h
適當的專案檔案。
現在,您可以開始使用CXFontDialog。

演示應用程式

XFontDialogTest.exe演示展示瞭如何使用CXFontDialog:

修訂歷史

1.1版- 2008年10月7日

改變了monospaced屬性決定。
以前我使用這種技術:
隱藏,複製CodebIsMonoSpaced = (tm。tmPitchAndFamily,TMPF_FIXED_PITCH) = = 0;

但是我發現一些等寬字型(如好
Pragmata字型
法布裡奇奧Schiavi)沒有馬克這樣的字型。
所以我採取更簡單、更可靠的方法的比較
寬度的!」和「W」字元。如果他們是一樣的,
這意味着等寬字型。

新增API允許設定範例文字。

放大字型對話方塊更可見的字型組合。

VS2005新增專案。

1.0版- 2003年6月21日

首次公開發行。

使用

這個軟體是釋放到公共領域。你可以自由地使用它
任何一種你喜歡的方式,只是你可能不出售這個原始碼。如果你修改
或擴充套件它,請考慮發佈新的程式碼給大家分享。
這個軟體提供了「是」,沒有表示或暗示的保證。
我接受任何損害或損失不承擔任何責任的商業軟體
可能的原因。

本文轉載於:http://www.diyabc.com/frontweb/news3672.html