Gdi+列舉系統字型(忽略隱藏字型)C++原始碼
本篇文章屬於《 518 抽獎軟體開發日誌》系列文章的一部分。
我在開發《 518 抽獎軟體》( )的時候,需要列舉系統字型,讓使用者選擇。用到 EnumFontFamiliesEx 函式,需要判斷是否是隱藏字型,需要判斷字型是否重複等。具體程式碼如下:
static void enum_fonts(HWND hCombo, BOOL bFixedPitch) { s_bFixedPitch = bFixedPitch; get_inactFonts(); // 得到隱藏字型列表 HDC hDc = GetDC(g_app.m_hMain); LOGFONT lf = { 0 }; lf.lfCharSet = DEFAULT_CHARSET; EnumFontFamiliesEx(hDc, &lf, (FONTENUMPROC)Proc_enumFonts, (LPARAM)hCombo, 0); ReleaseDC(g_app.m_hMain, hDc); } static int CALLBACK Proc_enumFonts(const LOGFONT* lplf, const TEXTMETRIC* lptme, DWORD FontType, LPARAM lParam) { HWND hCombo = (HWND)lParam; ENUMLOGFONTEX* lplfEx = (ENUMLOGFONTEX*)lplf; // 判斷是否是等寬字型 BOOL bOk = TRUE; BYTE x = lplf->lfPitchAndFamily; if (s_bFixedPitch && g_app.get_bits(x, 1, 2) != FIXED_PITCH) bOk = FALSE; // 去掉@開頭的字型名,還有符號字型 if (*(lplf->lfFaceName) != L'@' && lplf->lfCharSet != SYMBOL_CHARSET && bOk) { BOOL bTrueType = FontType & TRUETYPE_FONTTYPE; BOOL bRaster = FontType & RASTER_FONTTYPE; BOOL bDevice = FontType & DEVICE_FONTTYPE; BOOL bVector = !(bRaster || bTrueType); if (bTrueType) { int idx = SendMessage(hCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)lplf->lfFaceName); //華文仿宋:多個字符集列舉多次 //參看 EnumFontFamiliesEx 官方 if (idx < 0) { if (is_inactFont(lplf->lfFaceName)) { ; } else { idx = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName); SendMessage(hCombo, CB_SETITEMDATA, idx, (LPARAM)(DWORD)lplf->lfCharSet); } } } } return 1; } static BOOL get_inactFonts() { s_inactFonts.clear(); int i; DWORD tp = REG_MULTI_SZ; WCHAR* buf = NULL; DWORD size; HKEY h = NULL; wstring one; LONG r = RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Font Management", 0, KEY_QUERY_VALUE, &h); if (r != ERROR_SUCCESS) { h = NULL; Tfuns::open_perm(L"CURRENT_USER\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Font Management"); r = RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Font Management", 0, KEY_QUERY_VALUE, &h); } if (r == ERROR_FILE_NOT_FOUND) return TRUE; if (r != ERROR_SUCCESS) goto ERR; //----------------------------------------------------- size = 0; r = RegQueryValueEx(h, L"Inactive Fonts", 0, &tp, NULL, &size); if (r == ERROR_FILE_NOT_FOUND) { RegCloseKey(h); return TRUE; } if (r != ERROR_SUCCESS) goto ERR; if (size <= 0) { RegCloseKey(h); return TRUE; } buf = (WCHAR*)calloc(1, size + 8); r = RegQueryValueEx(h, L"Inactive Fonts", 0, &tp, (LPBYTE)buf, &size); if (r != ERROR_SUCCESS) goto ERR; for (int i = 0; 1; i++) { if (buf[i] == NULL) { s_inactFonts.push_back(one); if (buf[i + 1] == NULL) break; one.clear(); } else one += buf[i]; } if (buf) free(buf); RegCloseKey(h); return TRUE; ERR: if (buf) free(buf); if (h) RegCloseKey(h); return FALSE; } static BOOL is_inactFont(const WCHAR* name) { vector<wstring>::iterator it = s_inactFonts.begin(); while (it != s_inactFonts.end()) { if (_wcsicmp((*it).c_str(), name) == 0) return TRUE; it++; } return FALSE; }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70034163/viewspace-2992053/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 建立一個自己的 Linux系統Linux
- AMD Ryzen AI 暫僅支援 Windows,Linux 系統有望後續支援人工智慧Linux
- 阿里雲DNS形式化驗證論文入選國際計算機系統頂級會議SOSP’23
- macos 10.15系統正式版離線安裝包:macOS CatalinamacOS
- 基於Web的數字孿生三維視覺化綜合管理系統視覺化
- 2023SACC中國系統架構師大會·上海站誠邀您參加架構師
- 「最新」Downie 4 for Mac 支援14系統
- 一個類似於Gridster的柵格佈局系統Vue元件Vue
- 華為:截止2023年10月HarmonyOS 4升級量破1億 穩居第三大手機系統
- CLion 2023:探索C/C++的智慧之旅,開啟高效程式設計新篇章 mac/win版C++
- VMware Workstation 17安裝教程:安裝系統
- 架構思考:不靠譜的元件與可靠的系統
- 本地無法複製檔案到windows server 系統的處理辦法
- C++面試八股文:技術勘誤面試C++
- 蘋果MacOS軟體推薦 :MacPilot for Mac 系統最佳化工具 15.0.1啟用版macOS
- CRM客戶管理系統實現航運企業數字化管理
- CRM客戶管理系統助力企業精細化運營
- 大中小企業對CRM系統的需求
- ARM版CentOS Linux系統映象檔案(蘋果M1專用)LinuxCentOS