コード例 #1
0
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;
}
コード例 #2
0
ファイル: canvas.c プロジェクト: snapbug/atire
/*
	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;
}
コード例 #3
0
ファイル: CCXBitmapDC.cpp プロジェクト: geniikw/myFirst2DGame
 	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);
		}
 	}
コード例 #4
0
ファイル: gp_image.cpp プロジェクト: hjqqq/Forever
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 ;
}
コード例 #5
0
ファイル: easyhook-localhook.cpp プロジェクト: CoolOppo/ezgdi
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;
}