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
- Android系統更改狀態列字型顏色Android
- 直播app系統原始碼,Fragment 顯示 隱藏 監聽APP原始碼Fragment
- 直播系統原始碼,修改ToolBar的標題的字型顏色大小原始碼
- Ubuntu系統字型安裝Ubuntu
- android原始碼分析之大字型Android原始碼
- windows10系統下如何調節工作列字型大小Windows
- windows10系統字型怎麼設定_win10怎樣更改系統字型WindowsWin10
- 短視訊系統原始碼,Flutter 設定 App 的主色調與字型原始碼FlutterAPP
- ReactNative字型大小不隨系統字型大小變化而變化React
- win10系統如何調整字型_win10系統調整字型大小方法Win10
- win10怎麼更換系統字型_如何修改電腦win10系統字型Win10
- Oracle 隱藏列Oracle
- 直播app系統原始碼,底部彈框顯示,底部導航隱藏APP原始碼
- 直播帶貨系統原始碼利用TextView設定部分字型的顏色和大小原始碼TextView
- SQL隱碼攻擊之字元型和數字型注入SQL字元
- win10更換字型方法_win10怎樣更改系統字型Win10
- 在Fedora core 4.0 中新增simsun字型,讓系統字型清晰一點(轉)
- win10系統的字型在哪裡 win10系統開啟字型庫的步驟Win10
- 如何隱藏和解網頁原始碼網頁原始碼
- app直播原始碼,TextView部分字型顏色高亮APP原始碼TextView
- Mac作業系統命令列顯示/隱藏檔案Mac作業系統命令列
- css凹凸字型和發光字型程式碼例項CSS
- win10如何修改系統字型樣式 win10系統修改字型樣式的步驟Win10
- win10修改系統字型怎麼設定_如何更改win10字型Win10
- win10如何修改字型樣式_win10怎樣更改系統字型Win10
- win10字型在哪_win10系統自帶的字型如何開啟Win10
- 在Ubuntu系統中如何更換字型Ubuntu
- windows10系統如何匯入字型Windows
- javascript型別系統——Number數字型別JavaScript型別
- archlinux 下修改系統預設字型Linux
- WIN10系統字型特別小怎麼辦 WIN10系統字型過小如何調整Win10
- Windows10系統隱藏工作列音量圖示的方法Windows
- 成品直播原始碼,Flutter 夜間模式 全域性字型原始碼Flutter模式