int ZLWin32PaintContext::stringWidth(const char *str, int len) const { if (myDisplayContext == 0) { return 0; } SIZE size; int utf8len = ZLUnicodeUtil::utf8Length(str, len); if (utf8len == len) { GetTextExtentPointA(myDisplayContext, str, len, &size); } else { static ZLUnicodeUtil::Ucs2String ucs2Str; ucs2Str.clear(); ZLUnicodeUtil::utf8ToUcs2(ucs2Str, str, len, utf8len); GetTextExtentPointW(myDisplayContext, ::wchar(ucs2Str), utf8len, &size); } return size.cx; }
/* ANT_CANVAS::RENDER_TEXT_SEGMENT() --------------------------------- */ long long ANT_canvas::render_text_segment(ANT_point *where, ANT_rgb *colour, char *string, long long string_length, ANT_point *text_size) { TEXTMETRIC text_metrics; SIZE size; static const long long RIGHT_MARGIN = 5; HGDIOBJ hfont; SelectObject(hDC, ascii_font); SetTextColor(hDC, RGB(colour->red, colour->green, colour->blue)); TextOutA(hDC, where->x + RIGHT_MARGIN, where->y, string, string_length); GetTextExtentPointA(hDC, string, string_length, &size); text_size->x = size.cx; text_size->y = size.cy; return string_length; }
CCXBitmapDC::CCXBitmapDC(const char *text, CGSize dimensions, UITextAlignment alignment, const char *fontName, float fontSize) { HWND hWnd = CCDirector::sharedDirector()->getOpenGLView()->getHWnd(); HDC hWndDC = GetDC(hWnd); m_hMemDC = CreateCompatibleDC(hWndDC); ReleaseDC(hWnd, hWndDC); // create font HFONT hFont = NULL; HFONT hNewFont = NULL; LOGFONT lFont = {0}; lFont.lfHeight = -(LONG)fontSize; MultiByteToWideChar(CP_ACP, 0, fontName, -1, lFont.lfFaceName, LF_FACESIZE); hFont = CreateFontIndirect(&lFont); if (hFont) { hNewFont = hFont; } else { hNewFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); } HGDIOBJ hOldFont = SelectObject(m_hMemDC, hNewFont); // calculate text size int len = strlen(text); SIZE extent; if (CGSize::CGSizeEqualToSize(dimensions, CGSizeZero)) { GetTextExtentPointA(m_hMemDC, text, len, &extent); } else { extent.cx = (int)dimensions.width; extent.cy = (int)dimensions.height; } // create hbitmap m_hBmp = CreateBitmap(extent.cx, extent.cy, 1, 32, NULL); m_hOld = SelectObject(m_hMemDC, m_hBmp); // set style DWORD dwStyle = DT_SINGLELINE | DT_VCENTER; switch (alignment) { case UITextAlignmentLeft: dwStyle |= DT_LEFT; break; case UITextAlignmentCenter: dwStyle |= DT_CENTER; break; case UITextAlignmentRight: dwStyle |= DT_RIGHT; break; default: dwStyle |= DT_CENTER; break; } // draw text RECT rc = {0, 0, extent.cx, extent.cy}; SetBkMode(m_hMemDC, TRANSPARENT); SetTextColor(m_hMemDC, RGB(255, 255, 255)); // white color DrawTextA(m_hMemDC, text, len, &rc, dwStyle); // free resource SelectObject(m_hMemDC, hOldFont); if (hFont) { DeleteObject(hFont); } }
const Point2F& TextImage::buildText (const char* text, const Point2F&, UV& getUV)//建立文字貼圖 { enum {MAX_TEXT_W = 512, MAX_TEXT_H = 32} ; if (bInit == false) { assert (hMemDC == NULL) ; assert (hBMP == NULL) ; bInit = true ; //建立mem dc, bitmap HDC screenDC = GetDC (NULL) ; hMemDC = CreateCompatibleDC (screenDC) ; ReleaseDC (NULL, screenDC) ; //背景色 // SetBkColor (hMemDC, RGB (0, 0, 0)) ; BITMAPINFO bmpInfo ; memset (&bmpInfo, 0, sizeof (bmpInfo)) ; bmpInfo.bmiHeader.biSize = sizeof (bmpInfo.bmiHeader) ; bmpInfo.bmiHeader.biWidth = MAX_TEXT_W ; bmpInfo.bmiHeader.biHeight = MAX_TEXT_H ; bmpInfo.bmiHeader.biPlanes = 1 ; bmpInfo.bmiHeader.biBitCount = 32 ; bmpInfo.bmiHeader.biCompression = BI_RGB ; bmpInfo.bmiHeader.biSizeImage = 0 ; bmpInfo.bmiHeader.biXPelsPerMeter = 10 ; bmpInfo.bmiHeader.biYPelsPerMeter = 10 ; bmpInfo.bmiHeader.biClrUsed = 0 ; bmpInfo.bmiHeader.biClrImportant = 0 ; hBMP = CreateDIBSection (hMemDC, &bmpInfo, DIB_RGB_COLORS, &pPixel, NULL, 0) ; // HPEN hPen = (HPEN)GetStockObject (WHITE_PEN) ; // SelectObject (hMemDC, hPen) ; SelectObject (hMemDC, hBMP) ; } //確保字串空間夠大 assert (strlen (text) < sizeof (Text)-1) ; if ((strcmp (Text, text) == 0)) { //相同,什麼都不做 getUV = uv ; return textSize ; } //-------------------- //複製字串 strcpy_s (Text, sizeof (Text), text) ; SIZE txtSize ; //寫字 BOOL bOK = TextOutA (hMemDC, 0, 0, Text, strlen (Text)) ; //取得大小 GetTextExtentPointA (hMemDC, Text, strlen (Text), &txtSize) ; textSize.x = (float32)txtSize.cx ; textSize.y = (float32)txtSize.cy ; //取得uv uv.u = (float)txtSize.cx/MAX_TEXT_W ; uv.v = (float)txtSize.cy/MAX_TEXT_H ; assert (uv.u <= 1.0f) ; assert (uv.v <= 1.0f) ; setPixel (MAX_TEXT_W, MAX_TEXT_H, pPixel) ; getUV = uv ; return textSize ; }
extern "C" int main(int argc, wchar_t* argv[]) { TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO(); NTSTATUS NtStatus; ULONG ACLEntries[1] = {0}; UNICODE_STRING* NameBuffer = NULL; ORIG_CreateFontIndirectW = CreateFontIndirectW; FORCE(LhInstallHook( ORIG_CreateFontIndirectW, IMPL_CreateFontIndirectW, (PVOID)0, hHook)); FORCE(LhSetInclusiveACL(ACLEntries, 1, hHook)); CreateFontIndirectW(0); CreateFontW(10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"system"); LOGFONTA lf = {}; CreateFontIndirectA(&lf); CreateFontA(12, 0, 0, 0, 400, 0, 0, 0, 2, 0, 0, 0, 0, "MARLETT"); #if 0 ORIG_GetTextExtentPoint32A = GetTextExtentPoint32A; FORCE(LhInstallHook( ORIG_GetTextExtentPoint32A, IMPL_GetTextExtentPoint32A, (PVOID)0, hHook)); HDC hdc = GetDC(NULL); SIZE size; FORCE(LhSetInclusiveACL(ACLEntries, 1, hHook)); GetTextExtentPoint32W(hdc, L"abc", 3, &size); GetTextExtentPointW(hdc, L"abc", 3, &size); GetTextExtentPoint32A(hdc, "abc", 3, &size); GetTextExtentPointA(hdc, "abc", 3, &size); #endif #if 0 ORIG_MessageBeepHook = MessageBeep; /* The following shows how to install and remove local hooks... */ FORCE(LhInstallHook( ORIG_MessageBeepHook, MessageBeepHook, (PVOID)0, hHook)); printf(".\n"); // won't invoke the hook handler because hooks are inactive after installation MessageBeep(123); getch(); BOOL flags = 1; FORCE(LhIsThreadIntercepted(hHook, 0, &flags)); printf("Intercepted %d\n", flags); // activate the hook for the current thread FORCE(LhSetInclusiveACL(ACLEntries, 1, hHook)); FORCE(LhIsThreadIntercepted(hHook, 0, &flags)); printf("Intercepted %d\n", flags); printf(".\n"); // will be redirected into the handler... MessageBeep(123); getch(); FORCE(LhSetGlobalExclusiveACL(ACLEntries, 1)); printf(".\n"); // will be redirected into the handler... MessageBeep(123); getch(); FORCE(LhSetGlobalInclusiveACL(ACLEntries, 1)); printf(".\n"); // will be redirected into the handler... MessageBeep(123); getch(); printf(".\n"); // won't invoke the hook handler because hooks are inactive after installation ORIG_MessageBeepHook(123); getch(); #endif // this will also invalidate "hHook", because it is a traced handle... LhUninstallAllHooks(); // this will do nothing because the hook is already removed... LhUninstallHook(hHook); printf(".\n"); // will be redirected into the handler... MessageBeep(123); getch(); // now we can safely release the traced handle delete hHook; hHook = NULL; // even if the hook is removed, we need to wait for memory release LhWaitForPendingRemovals(); return 0; ERROR_ABORT: if(hHook != NULL) delete hHook; if(NameBuffer != NULL) free(NameBuffer ); printf("\n[Error(0x%p)]: \"%S\" (code: %d {0x%p})\n", (PVOID)NtStatus, RtlGetLastErrorString(), RtlGetLastError(), (PVOID)RtlGetLastError()); _getch(); return NtStatus; }