再补充一个代码:
效果
程序代码:
#define _UNICODE #define UNICODE #include <tchar.h> #include <malloc.h> #include <locale.h> #include <windows.h> WINBASEAPI HWND WINAPI GetConsoleWindow(); ////////////////////////////////////////////////////////////////////////// // 把 double 型转换成 FIXED 型数据 FIXED FixedFromDouble(double d) { long l; l = (long)(d * 65536L); return *(FIXED*)&l; } // 初始化单位矩阵 BOOL MatrixIdentity(MAT2* pMatrix, double dbZoom) { if(pMatrix) { pMatrix->eM11 = FixedFromDouble(dbZoom); pMatrix->eM12 = FixedFromDouble(0); pMatrix->eM21 = FixedFromDouble(0); pMatrix->eM22 = FixedFromDouble(dbZoom); return TRUE; } return FALSE; } // 初始化字体 HFONT InitFont() { LOGFONT lf = { -12, 6, 0, 0, 1, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, _T("宋体") }; return CreateFontIndirect(&lf); } // 打印字符 BOOL PrintCharacter(HDC hDC, UINT ch) { if(hDC) { GLYPHMETRICS gm; MAT2 matrix; DWORD dwSize; // 放大2倍矩阵 if(!MatrixIdentity(&matrix, 1.0f)) return FALSE; // 测试需要申请的空间 dwSize = GetGlyphOutline(hDC, ch, GGO_BITMAP, &gm, 0, NULL, &matrix); if(dwSize > 0 && dwSize < 0xFFFF) { LPBYTE lpBuffer = (LPBYTE)malloc(dwSize); if(lpBuffer) { // 获得字形 if(GetGlyphOutline(hDC, ch, GGO_BITMAP, &gm, dwSize, lpBuffer, &matrix)) { int i, j, k; int nByteCount; // 每行字节数 nByteCount = ((gm.gmBlackBoxX + 31) >> 5) << 2; // 遍历行 for(i = 0; i < gm.gmBlackBoxY; i++) { // 遍历列 for(j = 0; j < nByteCount; j++) { BYTE code = lpBuffer[i * nByteCount + j]; // 遍历位 for(k = 0; k < 8; k++) { if(code & (0x80 >> k)) _tprintf(_T("█")); else _tprintf(_T(" ")); } } _tprintf(_T("\r\n")); } } } free(lpBuffer); return TRUE; } } return FALSE; } int PrintString(HDC hDC, LPCTSTR pString) { if(pString) { TCHAR* p = pString; while(*p) { if(!PrintCharacter(hDC, *p)) break; _tprintf(_T("\r\n")); p += 1; } return p - pString; } return 0; } int main() { // 获得当前控制台设备句柄 HWND hWnd = GetConsoleWindow(); HDC hDC = GetDC(hWnd); HFONT hFont = InitFont(); HFONT hOldFont = SelectObject(hDC, hFont); TCHAR strInput[256] = { 0 }; setlocale(LC_CTYPE, "chs"); _tprintf(_T("Input a character: ")); _tscanf(_T("%s"), strInput); PrintString(hDC, strInput); SelectObject(hDC, hOldFont); DeleteObject(hFont); ReleaseDC(hWnd, hDC); return 0; }
效果
程序代码:
Input a character: 你好,世界! █ █ █ █ █ ██████ ██ █ █ █ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ ██ █ █ █ █ █ ███ █ █████ █ █ █████ █ █ █ █ █ █ █ █ ███████ █ █ █ ██ █ █ ██ █ █ █ █ █ ██ █ █ █ █ █ █ █ █ █ █ █ ███████████ █ █ █ █ █ █ █ █ █ █ █████ █ █ █ █ ██████████ ████████ █ █ █ ████████ █ █ █ ████████ █ █ █ █ ██ ██ █ █ ██ █ █ █ █ ██ █ █ █ █ █ █ █ █ Press any key to continue
天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.