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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Win10不使用的字型怎麼隱藏 win10隱藏不使用字型的教程Win10
- 直播系統app原始碼,TabLayout:自定義字型大小APP原始碼TabLayout自定義字型
- 獲取系統字型,獲取系統預設字型
- Android 隱藏系統狀態列Android
- 直播app系統原始碼,在 Flutter 中更改文字的字型系列APP原始碼Flutter
- 直播app系統原始碼,Fragment 顯示 隱藏 監聽APP原始碼Fragment
- 直播系統原始碼,修改ToolBar的標題的字型顏色大小原始碼
- windows10系統下如何調節工作列字型大小Windows
- ReactNative字型大小不隨系統字型大小變化而變化React
- windows10系統字型怎麼設定_win10怎樣更改系統字型WindowsWin10
- 短視訊系統原始碼,Flutter 設定 App 的主色調與字型原始碼FlutterAPP
- win10系統如何調整字型_win10系統調整字型大小方法Win10
- win10怎麼更換系統字型_如何修改電腦win10系統字型Win10
- linux系統配置中文字型,playwright中文亂碼Linux
- SQL隱碼攻擊之字元型和數字型注入SQL字元
- 直播帶貨系統原始碼利用TextView設定部分字型的顏色和大小原始碼TextView
- 直播app系統原始碼,底部彈框顯示,底部導航隱藏APP原始碼
- GridManager 隱藏列
- Oracle 隱藏列Oracle
- win10更換字型方法_win10怎樣更改系統字型Win10
- win10系統的字型在哪裡 win10系統開啟字型庫的步驟Win10
- app直播原始碼,TextView部分字型顏色高亮APP原始碼TextView
- 短視訊直播系統,Android狀態列設定顏色字型Android
- win10如何修改系統字型樣式 win10系統修改字型樣式的步驟Win10
- win10如何修改字型樣式_win10怎樣更改系統字型Win10
- linux系統下window字型安裝方法Linux
- windows10系統如何匯入字型Windows
- 在Ubuntu系統中如何更換字型Ubuntu
- WIN10系統字型特別小怎麼辦 WIN10系統字型過小如何調整Win10
- 成品直播原始碼,Flutter 夜間模式 全域性字型原始碼Flutter模式
- Win10系統下字型不能貼上到Fonts字型資料夾如何解決Win10
- win10系統字型安裝教程_Win10電腦如何安裝字型Win10
- win10系統怎麼安裝字型 win10電腦字型安裝Win10
- Python 列舉類原始碼解析Python原始碼
- win10系統網頁列印字型太大如何調整瀏覽器字型大小Win10網頁瀏覽器
- win10修改系統字型怎麼設定_如何更改win10字型Win10
- win10字型在哪_win10系統自帶的字型如何開啟Win10
- 直播系統app原始碼,設定樣式(字型樣式、行列寬高、對齊方式、邊框)APP原始碼