// Draws a cross-hatch and labels the cX, cY point. BOOL dpi_Label(HDC hdc, double cX, double cY, COLORREF color, HFONT font, UINT align) { wchar_t tmp[16]; swprintf(tmp, 16, L"%-2.3f, %-2.3f", cX, cY); UINT old_ta = GetTextAlign(hdc); COLORREF old_color = GetTextColor(hdc); HFONT old_font = GetCurrentObject(hdc, OBJ_FONT); HPEN old_pen = GetCurrentObject(hdc, OBJ_PEN); SetTextColor(hdc, color); SetTextAlign(hdc, align); // TA_CENTER | VTA_TOP SelectObject(hdc, font); SelectObject(hdc, GetStockObject(WHITE_PEN)); // Draw cross-hair: dpi_MoveTo(hdc, cX, cY - 0.05); dpi_LineTo(hdc, cX, cY + 0.0525); dpi_MoveTo(hdc, cX - 0.05, cY); dpi_LineTo(hdc, cX + 0.0525, cY); // Label: BOOL ret = TextOutW(hdc, (int)(cX * dpi), (int)(cY * dpi), tmp, (int)wcslen(tmp)); SelectObject(hdc, old_pen); SelectObject(hdc, old_font); SetTextAlign(hdc, old_ta); SetTextColor(hdc, old_color); return ret; }
void KTraceEMF::CompareDC(HDC hDC) { Compare(m_value[0], GetMapMode(hDC), "MapMode : %d\r\n"); Compare(m_value[1], GetGraphicsMode(hDC), "GraphicsMode : %d\r\n"); XFORM xm; GetWorldTransform(hDC, & xm); Compare(m_float[0], xm.eM11, "WT.eM11 : %8.5f\r\n"); Compare(m_float[1], xm.eM12, "WT.eM12 : %8.5f\r\n"); Compare(m_float[2], xm.eM21, "WT.eM21 : %8.5f\r\n"); Compare(m_float[3], xm.eM22, "WT.eM22 : %8.5f\r\n"); Compare(m_float[4], xm.eDx, "WT.eDx : %8.5f\r\n"); Compare(m_float[5], xm.eDy, "WT.eDy : %8.5f\r\n"); Compare(m_value[2], GetBkMode(hDC), "BkMode : %d\r\n"); Compare(m_value[3], GetROP2(hDC), "ROP2 : %d\r\n"); Compare(m_value[4], ((int)GetTextAlign(hDC)), "TextAlign : 0x%x\r\n"); Compare(m_object[0], GetCurrentObject(hDC, OBJ_PEN), "Pen : 0x%08x\r\n"); Compare(m_object[1], GetCurrentObject(hDC, OBJ_BRUSH), "Brush : 0x%08x\r\n"); Compare(m_object[2], GetCurrentObject(hDC, OBJ_FONT), "Font : 0x%08x\r\n"); Compare(m_object[3], GetCurrentObject(hDC, OBJ_PAL), "Palette : 0x%08x\r\n"); Compare(m_object[4], GetCurrentObject(hDC, OBJ_COLORSPACE), "ColorSpace : 0x%08x\r\n"); Compare(m_object[5], GetCurrentObject(hDC, OBJ_BITMAP), "Bitmap : 0x%08x\r\n"); }
UINT far pascal zGetTextAlign( HDC pp1 ) { UINT r; SaveRegs(); /* ** Log IN Parameters (No Create/Destroy Checking Yet!) */ LogIn( (LPSTR)"APICALL:GetTextAlign HDC+", pp1 ); /* ** Call the API! */ RestoreRegs(); GrovelDS(); r = GetTextAlign(pp1); UnGrovelDS(); SaveRegs(); /* ** Log Return Code & OUT Parameters (No Create/Destroy Checking Yet!) */ LogOut( (LPSTR)"APIRET:GetTextAlign UINT++", r, (short)0 ); RestoreRegs(); return( r ); }
void SOUI::SToolbox::OnPaint( IRenderTarget *pRT ) { __super::OnPaint(pRT); SPainter painter; BeforePaint(pRT, painter); if (m_pIcon) { SIZE sz = m_pIcon->GetSkinSize(); CRect rc = GetWindowRect(); rc.left += (rc.Width() - sz.cx)/2 + m_IconOffsetX; rc.top += (rc.Height() - sz.cy)/2 + m_IconOffsetY; rc.right = rc.left + sz.cx; rc.bottom = rc.top + sz.cy; m_pIcon->Draw(pRT, rc, 0); } if (!m_strText.IsEmpty()) { SIZE szChar; pRT->MeasureText(m_strText, m_strText.GetLength(), &szChar); CRect chRc = GetWindowRect(); chRc.left += (chRc.Width() - szChar.cx)/2 + m_TextOffsetX; chRc.top += (chRc.Height() - szChar.cy)/2 + m_TextOffsetY; if (GetState() & WndState_PushDown) chRc.top++; chRc.right = chRc.left + szChar.cx; chRc.bottom = chRc.top + szChar.cy; pRT->DrawText(m_strText, m_strText.GetLength(), chRc, GetTextAlign()); } AfterPaint(pRT, painter); }
static void IsInsidePointW(const HDC DC, int X, int Y, LPCWSTR Str, int Count) { SIZE Size; if ((Count > 0) && GetTextExtentPoint32W(DC, Str, Count, &Size)) { DWORD Flags = GetTextAlign(DC); POINT Pt; RECT Rect; if (Flags & TA_UPDATECP) { GetCurrentPositionEx(DC, &Pt); } else { Pt.x = X; Pt.y = Y; } if (Flags & TA_CENTER) { Pt.x-=(Size.cx/2); } else if (Flags & TA_RIGHT) { Pt.x-=Size.cx; } if (Flags & TA_BASELINE) { TEXTMETRICW tm; GetTextMetricsW(DC, &tm); Pt.y-=tm.tmAscent; } else if (Flags & TA_BOTTOM) { Pt.y-=Size.cy; } LPtoDP(DC, &Pt, 1); Rect.left = Pt.x; Rect.right = Pt.x + Size.cx; Rect.top = Pt.y; Rect.bottom = Pt.y + Size.cy; // Bug: We don't check Pt.y here, as don't call PtInRect() directly, because // in Title bar, Start Menu, IE, FireFox, Opera etc., the Rect.top and Rect.bottom will be wrong. // I try to use GetDCOrgEx(DC, &Pt), but they are not normal HDC that Pt.x and Pt.y will equal to 0 in these cases. // And use GetWindowRect() then get Rect.left and Rect.top is only useful on Title bar. if (((Rect.left <= Rect.right) && (CurParams->Pt.x >= Rect.left) && (CurParams->Pt.x <= Rect.right)) || ((Rect.left > Rect.right) && (CurParams->Pt.x <= Rect.left) && (CurParams->Pt.x >= Rect.right))) { int BegPos; //if (PtInRect(&Rect, CurParams->Pt)) { CurParams->Active = !PtInRect(&Rect, CurParams->Pt); //CurParams->Active = FALSE; BegPos = (int)((abs((CurParams->Pt.x - Rect.left) / (Rect.right - Rect.left)) * (Count - 1)) + 0.5); while ((BegPos < Count - 1) && GetTextExtentPoint32W(DC, Str, BegPos + 1, &Size) && (Size.cx < CurParams->Pt.x - Rect.left)) BegPos++; while ((BegPos >= 0) && GetTextExtentPoint32W(DC, Str, BegPos + 1, &Size) && (Size.cx > CurParams->Pt.x - Rect.left)) BegPos--; if (BegPos < Count - 1) BegPos++; CurParams->BeginPos = BegPos; if (Count > 255) CurParams->WordLen = 255; else CurParams->WordLen = Count; CurParams->Unicode = TRUE; CopyMemory(CurParams->MatchedWordW, Str, CurParams->WordLen * sizeof(wchar_t)); } } }
static void IsInsidePointA(const HDC DC, int X, int Y, LPCSTR Str, int Count) { SIZE Size; if ((Count > 0) && GetTextExtentPoint32A(DC, Str, Count, &Size)) { DWORD Flags = GetTextAlign(DC); POINT Pt; RECT Rect; if (Flags & TA_UPDATECP) { GetCurrentPositionEx(DC, &Pt); } else { Pt.x = X; Pt.y = Y; } if (Flags & TA_CENTER) { Pt.x-=(Size.cx/2); } else if (Flags & TA_RIGHT) { Pt.x-=Size.cx; } if (Flags & TA_BASELINE) { TEXTMETRIC tm; GetTextMetricsA(DC, &tm); Pt.y-=tm.tmAscent; } else if (Flags & TA_BOTTOM) { Pt.y-=Size.cy; } LPtoDP(DC, &Pt, 1); Rect.left = Pt.x; Rect.right = Pt.x + Size.cx; Rect.top = Pt.y; Rect.bottom = Pt.y + Size.cy; if (((Rect.left <= Rect.right) && (CurParams->Pt.x >= Rect.left) && (CurParams->Pt.x <= Rect.right)) || ((Rect.left > Rect.right) && (CurParams->Pt.x <= Rect.left) && (CurParams->Pt.x >= Rect.right))) { int BegPos; //if (PtInRect(&Rect, CurParams->Pt)) { CurParams->Active = !PtInRect(&Rect, CurParams->Pt); //CurParams->Active = FALSE; BegPos = (int)((abs((CurParams->Pt.x - Rect.left) / (Rect.right - Rect.left)) * (Count - 1)) + 0.5); while ((BegPos < Count - 1) && GetTextExtentPoint32A(DC, Str, BegPos + 1, &Size) && (Size.cx < CurParams->Pt.x - Rect.left)) BegPos++; while ((BegPos >= 0) && GetTextExtentPoint32A(DC, Str, BegPos + 1, &Size) && (Size.cx > CurParams->Pt.x - Rect.left)) BegPos--; if (BegPos < Count - 1) BegPos++; CurParams->BeginPos = BegPos; if (Count > 255) CurParams->WordLen = 255; else CurParams->WordLen = Count; CurParams->Unicode = FALSE; CopyMemory(CurParams->MatchedWordA, Str, CurParams->WordLen); } } }
BOOL CPreviewDC::ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths) { ASSERT(m_hDC != NULL); ASSERT(m_hAttribDC != NULL); ASSERT(lpszString != NULL); ASSERT(lpDxWidths == NULL || AfxIsValidAddress(lpDxWidths, sizeof(int) * nCount, FALSE)); ASSERT(AfxIsValidAddress(lpszString, nCount, FALSE)); int* pDeltas = NULL; LPTSTR pOutputString = NULL; int nRightFixup = 0; if (lpDxWidths == NULL) { if (nCount == 0) // Do nothing return TRUE; TRY { pDeltas = new int[nCount]; pOutputString = new TCHAR[nCount]; } CATCH_ALL(e) { delete[] pDeltas; // in case it was allocated // Note: DELETE_EXCEPTION(e) not required return FALSE; // Could not allocate buffer, cannot display } END_CATCH_ALL ComputeDeltas(x, (LPTSTR)lpszString, nCount, FALSE, 0, NULL, 0, pOutputString, pDeltas, nRightFixup); lpDxWidths = pDeltas; lpszString = pOutputString; } BOOL bSuccess = ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths); if (nRightFixup != 0 && bSuccess && (GetTextAlign() & TA_UPDATECP)) { CPoint pt; ::GetCurrentPositionEx(m_hDC, &pt); MoveTo(pt.x - nRightFixup, pt.y); } delete[] pDeltas; delete[] pOutputString; return bSuccess; }
virtual BOOL on_draw (HELEMENT he, UINT draw_type, HDC hdc, const RECT& rc ) { if( draw_type != DRAW_CONTENT ) return FALSE; /*do default draw*/ dom::element el = he; UINT pta = GetTextAlign(hdc); SetTextAlign(hdc, TA_LEFT | TA_TOP |TA_NOUPDATECP); DrawTextW(hdc, el.text(), -1, const_cast<RECT*>(&rc), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_PATH_ELLIPSIS); SetTextAlign(hdc, pta); return TRUE; /*skip default draw as we did it already*/ }
CSize CPreviewDC::TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount, int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin) { ASSERT(m_hAttribDC != NULL); ASSERT(m_hDC != NULL); ASSERT(lpszString != NULL); ASSERT(AfxIsValidAddress(lpszString, nCount)); ASSERT(lpnTabStopPositions == NULL || AfxIsValidAddress(lpnTabStopPositions, sizeof(int) * nTabPositions, FALSE)); if (nCount <= 0) return 0; // nCount is zero, there is nothing to print int* pDeltas = NULL; LPTSTR pOutputString = NULL; int nRightFixup; TRY { pDeltas = new int[nCount]; pOutputString = new TCHAR[nCount]; } CATCH_ALL(e) { delete[] pDeltas; // Note: DELETE_EXCEPTION(e) not required return 0; // signify error } END_CATCH_ALL UINT uCount = nCount; CSize sizeFinalExtent = ComputeDeltas(x, lpszString, uCount, TRUE, nTabPositions, lpnTabStopPositions, nTabOrigin, pOutputString, pDeltas, nRightFixup); BOOL bSuccess = ExtTextOut(x, y, 0, NULL, pOutputString, uCount, pDeltas); delete[] pDeltas; delete[] pOutputString; if (bSuccess && (GetTextAlign() & TA_UPDATECP)) { CPoint pt; ::GetCurrentPositionEx(m_hDC, &pt); MoveTo(pt.x - nRightFixup, pt.y); } return sizeFinalExtent; }
bool painter::begin(const dc_context *context) { _context = context; _text_alignment = GetTextAlign(_context->hdc); assert(_text_alignment != GDI_ERROR); _text_color = parse_palette_color(_context->hdc, GetTextColor(_context->hdc)); if (_text_color == CLR_INVALID) _text_color = 0; // transparent DC may not have background color _bg_color = parse_palette_color(_context->hdc, GetBkColor(_context->hdc)); return true; }
void DisplayMessage(int x, int y, char *Msg) { UINT fMode; HDC dc; dc = Screen->GetFront()->GetDC(); fMode = GetTextAlign(dc); SetTextAlign(dc, TA_CENTER | VTA_CENTER); Screen->GetFront()->TextXY(x, y, GreenTxt, Msg); SetTextAlign(dc, fMode); Screen->GetFront()->ReleaseDC(); }
/* * @implemented */ BOOL WINAPI LpkExtTextOut( HDC hdc, int x, int y, UINT fuOptions, const RECT *lprc, LPCWSTR lpString, UINT uCount, const INT *lpDx, INT unknown) { LPWORD glyphs = NULL; INT cGlyphs; UNREFERENCED_PARAMETER(unknown); if (!(fuOptions & ETO_IGNORELANGUAGE)) fuOptions |= ETO_IGNORELANGUAGE; /* Check text direction */ if ((GetLayout(hdc) & LAYOUT_RTL) || (GetTextAlign(hdc) & TA_RTLREADING)) { if (!(fuOptions & ETO_RTLREADING)) fuOptions |= ETO_RTLREADING; } /* Check if the string requires complex script processing and not a "glyph indices" array */ if (ScriptIsComplex(lpString, uCount, SIC_COMPLEX) == S_OK && !(fuOptions & ETO_GLYPH_INDEX)) { BIDI_Reorder(hdc, lpString, uCount, GCP_REORDER, (fuOptions & ETO_RTLREADING) ? WINE_GCPW_FORCE_RTL : WINE_GCPW_FORCE_LTR, NULL, uCount, NULL, &glyphs, &cGlyphs); fuOptions |= ETO_GLYPH_INDEX; if (uCount > cGlyphs) cGlyphs = uCount; return ExtTextOutW(hdc, x, y, fuOptions, lprc, (LPWSTR)glyphs, cGlyphs, lpDx); } return ExtTextOutW(hdc, x, y, fuOptions, lprc, lpString, uCount, lpDx); }
void DisplaySpaceyMsg(void) { UINT fMode; HDC dc; dc = Screen->GetBack()->GetDC(); fMode = GetTextAlign(dc); SetTextAlign(dc, TA_CENTER | VTA_CENTER); Screen->GetBack()->TextXY(320, 2, GreenTxt, "SPACEY VADERS"); Screen->GetBack()->TextXY(320, 20, GreenTxt, "by Paul Lord '97"); SetTextAlign(dc, fMode); Screen->GetBack()->ReleaseDC(); }
void STextButton::OnPaint( IRenderTarget *pRT ) { SPainter painter; BeforePaint(pRT, painter); CRect rcText; GetTextRect(rcText); DrawText(pRT,m_strText, m_strText.GetLength(), rcText, GetTextAlign()); //draw focus rect if(IsFocused()) { DrawFocus(pRT); } AfterPaint(pRT, painter); }
virtual BOOL on_draw (HELEMENT he, UINT draw_type, HDC hdc, const RECT& rc ) { if( draw_type != DRAW_CONTENT ) return FALSE; /*do default draw*/ dom::element el = he; UINT pta = GetTextAlign(hdc); SetTextAlign(hdc, TA_LEFT | TA_TOP |TA_NOUPDATECP); #ifdef _WIN32_WCE CString fileName(el.text()); CString dottedFileName; FormatFileName(hdc, fileName, dottedFileName, rc.right - rc.left); DrawTextW(hdc, dottedFileName, -1, const_cast<RECT*>(&rc), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX | DT_NOCLIP); #else DrawTextW(hdc, el.text(), -1, const_cast<RECT*>(&rc), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_PATH_ELLIPSIS | DT_NOPREFIX); #endif SetTextAlign(hdc, pta); return TRUE; /*skip default draw as we did it already*/ }
void SComboBase::OnPaint(IRenderTarget * pRT ) { SPainter painter; BeforePaint(pRT, painter); if(GetCurSel() != -1 && m_pEdit==NULL) { CRect rcText; GetTextRect(rcText); SStringT strText=GetWindowText(); DrawText(pRT,strText, strText.GetLength(), rcText, GetTextAlign()); } //draw focus rect if(IsFocused()) { DrawFocus(pRT); } AfterPaint(pRT, painter); CRect rcBtn; GetDropBtnRect(&rcBtn); m_pSkinBtn->Draw(pRT,rcBtn,IIF_STATE3(m_dwBtnState,WndState_Normal,WndState_Hover,WndState_PushDown)); }
void CPreviewDC::MirrorAttributes() { ASSERT(m_hAttribDC != NULL); if (m_hDC != NULL) { // extract and re-set Pen and Brush HGDIOBJ hTemp = ::SelectObject(m_hAttribDC, ::GetStockObject(BLACK_PEN)); ::SelectObject(m_hAttribDC, hTemp); ::SelectObject(m_hDC, hTemp); hTemp = ::SelectObject(m_hAttribDC, ::GetStockObject(BLACK_BRUSH)); ::SelectObject(m_hAttribDC, hTemp); ::SelectObject(m_hDC, hTemp); SetROP2(GetROP2()); SetBkMode(GetBkMode()); SetTextAlign(GetTextAlign()); SetPolyFillMode(GetPolyFillMode()); SetStretchBltMode(GetStretchBltMode()); SetTextColor(GetNearestColor(GetTextColor())); SetBkColor(GetNearestColor(GetBkColor())); } }
virtual BOOL on_draw (HELEMENT he, UINT draw_type, HDC hdc, const RECT& rc ) { if( draw_type != DRAW_CONTENT ) return FALSE; /*do default draw*/ dom::element el = he; const wchar_t* filename = el.get_attribute("filename"); if( !filename ) return FALSE; // no such attribute at all. // 先画图标 SHFILEINFOW sfi; HIMAGELIST hlist = (HIMAGELIST) SHGetFileInfoW( filename, 0, &sfi, sizeof(SHFILEINFO), /*SHGFI_USEFILEATTRIBUTES |*/ SHGFI_SYSICONINDEX | SHGFI_SMALLICON ); if(!hlist) return FALSE; int szx = 16; int szy = 16; ImageList_GetIconSize(hlist, &szx, &szy); int x = rc.left - 19; // 水平居左 // + (rc.right - rc.left - szx) / 2; int y = rc.top + (rc.bottom - rc.top - szy) / 2; // 垂直居中 //draw_file_icon(hdc, x, y, filename); ImageList_Draw(hlist, sfi.iIcon, hdc, x, y, ILD_TRANSPARENT); // 输出文字 UINT pta = GetTextAlign(hdc); SetTextAlign(hdc, TA_LEFT | TA_TOP |TA_NOUPDATECP); DrawTextW(hdc, (is_fullpath(el) && (wcslen(filename) > 1)) ? filename : el.text(), -1,const_cast<RECT*>(&rc), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_PATH_ELLIPSIS | DT_NOPREFIX); SetTextAlign(hdc, pta); return TRUE; /*skip default draw as we did it already*/ }
void DisplaySplashScreen(void) { static BOOL DrawScreen; HDC dc; // Print the Text... Testing char TitleText1[16][80]= { {" "}, {" "}, {" "}, {" = 25 POINTS"}, {" "}, {" "}, {" = 50 POINTS"}, {" "}, {" "}, {" = 75 POINTS"}, {" "}, {" "}, {" = 100 POINTS"}, {" "}, {" "}, {" "}, }; char TitleText2[5][80]= { {" = - 100 POINTS"}, {" "}, {" "}, {" = - 100 POINTS"}, {" "}, }; char TitleText3[3][80]= { {"PRESS [RETURN] TO START THE GAME, ESC TO EXIT"}, {" "}, {"'Spacey Vaders' - by Paul Lord - [email protected]"}, }; //Load Back image Screen->LoadBitmap(TITLEBMP); UINT fMode; // Display the text message dc = Screen->GetBack()->GetDC(); fMode = GetTextAlign(dc); SetTextAlign(dc, TA_CENTER | VTA_CENTER); int index; for (index=0; index< 16; index++) { Screen->GetBack()->TextXY(320, 100+(index*15), GreenTxt, TitleText1[index]); } for (index=0; index< 5; index++) { Screen->GetBack()->TextXY(320, 100+((index+16)*15), RedTxt, TitleText2[index]); } for (index=0; index< 3; index++) { Screen->GetBack()->TextXY(320, 100+((index+21)*15), GreenTxt, TitleText3[index]); } SetTextAlign(dc, fMode); Screen->GetBack()->ReleaseDC(); // Display the Vader Sprites Vaders->SetFrame(0); Vaders->SetPos(220,120); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Vaders->SetFrame(4); Vaders->SetPos(220,170); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Vaders->SetFrame(8); Vaders->SetPos(220,218); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Vaders->SetFrame(41); Vaders->SetPos(220,265); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Vaders->SetFrame(14); Vaders->SetPos(220,320); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Vaders->SetFrame(16); Vaders->SetPos(220,370); Vaders->Draw(Screen->GetBack(), 0, 0, CDXBLT_TRANS); Screen->Flip(); }
//Hook TextOutA的过程 DLLEXPORT BOOL WINAPI NHExtTextOutA(HDC hdc, int X, //当前需要绘制的文本的起始位置 int Y, UINT fuOptions, CONST RECT *lprc, LPCTSTR lpString, UINT cbCount, CONST INT *lpDx) { POINT pt; HWND hWDC; HWND hWPT; DWORD dwThreadIdWithPoint = 0; DWORD dwThreadIdCurr = 0; // restore RestoreWin32Api(&g_ExtTextOutAHook, HOOK_NEED_CHECK); /* if (cbCount != 0) { char cBuffer[0x100]; wsprintf(cBuffer, "-> NHExtTextOutA : %s (%s) (%d)\n", "start", lpString, cbCount); OutputDebugString(cBuffer); } */ //DbgFilePrintf("-> NHExtTextOutA : lpString(%s), cbCount(%d)\n", lpString, cbCount); pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y; hWDC = WindowFromDC(hdc); hWPT = WindowFromPoint(pt); dwThreadIdWithPoint = GetWindowThreadProcessId(hWPT, NULL); dwThreadIdCurr = GetCurrentThreadId(); if(dwThreadIdWithPoint == dwThreadIdCurr) { if (hWDC == NULL || hWPT == hWDC || IsParentOrSelf(hWPT, hWDC) || IsParentOrSelf(hWDC, hWPT)) { if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpString, cbCount)) && (cbCount > 0)) { g_nTextAlign = GetTextAlign(hdc); g_nExtra = GetTextCharacterExtra(hdc); GetCurrentPositionEx(hdc, &g_CurPos); GetTextMetrics(hdc, &g_tm); g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; bRecAllRect = FALSE; //findword.c中的代码,取出当前字符的矩形范围 GetStringRect(hdc, (LPSTR)lpString, cbCount, X, Y, &g_rcTotalRect, lpDx); bRecAllRect = TRUE; if ((WindowFromDC != NULL)&&(WindowFromDC(hdc) == NULL)) { g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; AddToTextOutBuffer(hdc, (LPSTR)lpString, cbCount, X, Y, lpDx); } else { GetDCOrgEx(hdc, &g_dwDCOrg); //findword.c中的代码,取出当前位置下的单词 GetCurMousePosWord(hdc, (LPSTR)lpString, cbCount, X, Y, lpDx); } } } } // call ExtTextOutA ExtTextOutA(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); HookWin32Api(&g_ExtTextOutAHook, HOOK_NEED_CHECK); return TRUE; }
//Hook TextOutW 的过程 DLLEXPORT BOOL WINAPI NHExtTextOutW(HDC hdc, int X, int Y, UINT fuOptions, CONST RECT *lprc, LPCWSTR lpString, UINT cbCount, CONST INT *lpDx) { POINT pt; HWND hWDC; HWND hWPT; DWORD dwThreadIdWithPoint = 0; DWORD dwThreadIdCurr = 0; // restore RestoreWin32Api(&g_ExtTextOutWHook, HOOK_NEED_CHECK); /* { char cBuffer[0x100]; wsprintf(cBuffer, "-> NHExtTextOutW : %s\n", "start"); OutputDebugString(cBuffer); } */ //DbgFilePrintf("-> NHExtTextOutW : lpString(%s), cbCount(%d)\n", lpString, cbCount); pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y; hWDC = WindowFromDC(hdc); hWPT = WindowFromPoint(pt); // 01/17/2000 // Fix Bug3: get word error when IE window overlaps. // Fix Bug3 begin dwThreadIdWithPoint = GetWindowThreadProcessId(hWPT, NULL); dwThreadIdCurr = GetCurrentThreadId(); if(dwThreadIdWithPoint == dwThreadIdCurr) { // Fix Bug3 end if (hWDC == NULL || hWPT == hWDC || IsParentOrSelf(hWPT, hWDC) || IsParentOrSelf(hWDC, hWPT)) { if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpString, cbCount)) && (cbCount > 0)) { /* { //char cBuffer[0x100]; //wsprintf(cBuffer, ">>>----> NHExtTextOutW : (%s) %d\n", lpTemp, cbCount); //OutputDebugString(cBuffer); } */ g_nTextAlign = GetTextAlign(hdc); g_nExtra = GetTextCharacterExtra(hdc); GetCurrentPositionEx(hdc, &g_CurPos); GetTextMetrics(hdc, &g_tm); g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; bRecAllRect = FALSE; GetStringRectW(hdc, lpString, cbCount, X, Y, &g_rcTotalRect, lpDx); bRecAllRect = TRUE; //{DbgFilePrintf("--> NHExtTextOutW: lpTemp(%s)len(%d)\n", lpTemp, strlen(lpTemp));} //{DbgFilePrintf("--> NHExtTextOutW: X(%d)Y(%d), g_rcTotalRect(%d,%d,%d,%d)\n", X, Y, g_rcTotalRect.left, g_rcTotalRect.top, g_rcTotalRect.right, g_rcTotalRect.bottom);} if ((WindowFromDC != NULL)&&(WindowFromDC(hdc) == NULL)) { g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; // 01/19/2000 // Fix Bug5: get word position error sometimes // Fix Bug5 begin AddToTextOutBufferW(hdc, lpString, cbCount, X, Y, lpDx); // Fix Bug5 end } else { GetDCOrgEx(hdc, &g_dwDCOrg); // 01/19/2000 // Fix Bug5: get word position error sometimes // Fix Bug5 begin GetCurMousePosWordW(hdc, lpString, cbCount, X, Y, lpDx); // Fix Bug5 end } } } } // call ExtTextOutW ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); //调用封装好的HooK过程 HookWin32Api(&g_ExtTextOutWHook, HOOK_NEED_CHECK); return TRUE; }
//Hook TextOutW 的过程 DLLEXPORT BOOL WINAPI NHTextOutW(HDC hdc, int nXStart, int nYStart, LPCWSTR lpString, int cbString) { POINT pt; HWND hWDC; HWND hWPT; DWORD dwThreadIdWithPoint = 0; DWORD dwThreadIdCurr = 0; /* { char cBuffer[0x100]; wsprintf(cBuffer, "-> NHTextOutW : %s\n", "start"); OutputDebugString(cBuffer); } */ //DbgFilePrintf("-> NHTextOutW : lpString(%s), cbString(%d)\n", lpString, cbString); // restore RestoreWin32Api(&g_TextOutWHook, HOOK_NEED_CHECK); pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y; hWDC = WindowFromDC(hdc); hWPT = WindowFromPoint(pt); dwThreadIdWithPoint = GetWindowThreadProcessId(hWPT, NULL); dwThreadIdCurr = GetCurrentThreadId(); if(dwThreadIdWithPoint == dwThreadIdCurr) { if (hWDC == NULL || hWPT == hWDC || IsParentOrSelf(hWPT, hWDC) || IsParentOrSelf(hWDC, hWPT)) { if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpString, cbString)) && (cbString > 0)) { g_nTextAlign = GetTextAlign(hdc); g_nExtra = GetTextCharacterExtra(hdc); GetCurrentPositionEx(hdc, &g_CurPos); GetTextMetrics(hdc, &g_tm); g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; bRecAllRect = FALSE; GetStringRectW(hdc, lpString, cbString, nXStart, nYStart, &g_rcTotalRect, NULL); bRecAllRect = TRUE; if ((WindowFromDC != NULL)&&(WindowFromDC(hdc) == NULL)) { g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; // 01/19/2000 // Fix Bug5: get word position error sometimes // Fix Bug5 begin AddToTextOutBufferW(hdc, lpString, cbString, nXStart, nYStart, NULL); //Fix Bug5 end } else { GetDCOrgEx(hdc, &g_dwDCOrg); // 01/19/2000 // Fix Bug5: get word position error sometimes // Fix Bug5 begin GetCurMousePosWordW(hdc, lpString, cbString, nXStart, nYStart, NULL); //Fix Bug5 end } } } } // call TextOutW 处理完我们的函数之后,回调系统的TextOutW函数,以便系统继续进行 TextOutW(hdc, nXStart, nYStart, lpString, cbString); HookWin32Api(&g_TextOutWHook, HOOK_NEED_CHECK); return TRUE; }
//Hook TextOutA的过程 DLLEXPORT BOOL WINAPI NHTextOutA(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString) { POINT pt; HWND hWDC; HWND hWPT; DWORD dwThreadIdWithPoint = 0; DWORD dwThreadIdCurr = 0; /* { char cBuffer[0x100]; wsprintf(cBuffer, "-> NHTextOutA : %s\n", "start"); OutputDebugString(cBuffer); } */ //DbgFilePrintf("-> NHTextOutA : lpString(%s), cbString(%d)\n", lpString, cbString); // restore RestoreWin32Api(&g_TextOutAHook, HOOK_NEED_CHECK); // pt.x = g_CurMousePos.x; pt.y = g_CurMousePos.y; hWDC = WindowFromDC(hdc); //Xianfeng:对方所在窗体句柄 hWPT = WindowFromPoint(pt); //Xianfeng:鼠标所在窗体句柄 dwThreadIdWithPoint = GetWindowThreadProcessId(hWPT, NULL); //Xianfeng:取得鼠标所在窗体线程ID dwThreadIdCurr = GetCurrentThreadId(); //Xianfeng:取得当前线程ID if(dwThreadIdWithPoint == dwThreadIdCurr) { if (hWDC == NULL || hWPT == hWDC || IsParentOrSelf(hWPT, hWDC) || IsParentOrSelf(hWDC, hWPT)) { if ((g_bAllowGetCurWord) && (!IsBadReadPtr(lpString, cbString)) && (cbString > 0)) { g_nTextAlign = GetTextAlign(hdc); //Xianfeng:取得当前DC的文本对齐方式,在后面计算矩形用 g_nExtra = GetTextCharacterExtra(hdc); //Xianfeng:取得字符间空隙,单位估计是像素 GetCurrentPositionEx(hdc, &g_CurPos); //Xianfeng:取得当前DC的逻辑位置 GetTextMetrics(hdc, &g_tm); //Xianfeng:取得当前DC的font的基本信息 g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; bRecAllRect = FALSE; GetStringRect(hdc, (LPSTR)lpString, cbString, nXStart, nYStart, &g_rcTotalRect, NULL); bRecAllRect = TRUE; if ((WindowFromDC != NULL)&&(WindowFromDC(hdc) == NULL)) { g_dwDCOrg.x = 0; g_dwDCOrg.y = 0; //Xianfeng:保存输出字符信息到内存 AddToTextOutBuffer(hdc, (LPSTR)lpString, cbString, nXStart, nYStart, NULL); } else { //Xianfeng:取回DC原点,通常的值是客户区左上角相对于窗体左上角的偏移量 GetDCOrgEx(hdc, &g_dwDCOrg); //Xianfeng:获取当前鼠标下的字 GetCurMousePosWord(hdc, (LPSTR)lpString, cbString, nXStart, nYStart, NULL); } } } } // call TextOutA TextOutA(hdc, nXStart, nYStart, lpString, cbString); HookWin32Api(&g_TextOutAHook, HOOK_NEED_CHECK); return TRUE; }
void KDCAttributes::DumpDC(HDC hDC) { POINT pnt; SIZE size; m_List.DeleteAll(); Add(_T("Technology"), _T("%d"), GetDeviceCaps(hDC, TECHNOLOGY)); Add(_T("width"), _T("%d"), GetDeviceCaps(hDC, HORZRES)); Add(_T("height"), _T("%d"), GetDeviceCaps(hDC, VERTRES)); GetDCOrgEx(hDC, & pnt); Add(_T("DC Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); TCHAR szTitle[MAX_PATH]; szTitle[0] = 0; GetWindowText(WindowFromDC(hDC), szTitle, MAX_PATH); Add(_T("Window"), _T("0x%X \"%s\""), WindowFromDC(hDC), szTitle); Add(_T("Bitmap"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BITMAP)); Add(_T("Graphics Mode"), _T("%d"), GetGraphicsMode(hDC)); Add(_T("Mapping Mode"), _T("%d"), GetMapMode(hDC)); GetViewportExtEx(hDC, & size); Add(_T("Viewport Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetViewportOrgEx(hDC, & pnt); Add(_T("Viewport Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); GetWindowExtEx(hDC, & size); Add(_T("Window Extent"), _T("{ %d, %d }"), size.cx, size.cy); GetWindowOrgEx(hDC, & pnt); Add(_T("Window Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); XFORM xform; GetWorldTransform(hDC, & xform); Add(_T("World transformation"), _T("{ %f, %f, %f, %f, %f, %f }"), xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy); // transformation Add(_T("Background Color"), _T("0x%X"), GetBkColor(hDC)); Add(_T("Text Color"), _T("0x%X"), GetTextColor(hDC)); Add(_T("Palette"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PAL)); { COLORADJUSTMENT ca; GetColorAdjustment(hDC, & ca); Add(_T("Color Adjustment"), _T("{ %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d }"), ca.caSize, ca.caFlags, ca.caIlluminantIndex, ca.caRedGamma, ca.caGreenGamma, ca.caBlueGamma, ca.caReferenceBlack, ca.caReferenceWhite, ca.caContrast, ca.caBrightness, ca.caColorfulness, ca.caRedGreenTint); } Add(_T("Color Space"), _T("0x%X"), GetColorSpace(hDC)); Add(_T("ICM Mode"), _T("%d"), SetICMMode(hDC, ICM_QUERY)); { TCHAR szProfile[MAX_PATH]; DWORD dwSize = MAX_PATH; szProfile[0] = 0; GetICMProfile(hDC, & dwSize, szProfile); Add(_T("ICM Profile"), _T("%s"), szProfile); } GetCurrentPositionEx(hDC, & pnt); Add(_T("Current Position"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("ROP2"), _T("%d"), GetROP2(hDC)); Add(_T("Background Mode"), _T("%d"), GetBkMode(hDC)); Add(_T("Logical Pen"), _T("0x%X"), GetCurrentObject(hDC, OBJ_PEN)); Add(_T("DC Pen Color"), _T("0x%X"), GetDCPenColor(hDC)); Add(_T("Arc Direction"), _T("%d"), GetArcDirection(hDC)); FLOAT miter; GetMiterLimit(hDC, & miter); Add(_T("Miter Limit"), _T("%f"), miter); Add(_T("Logical Brush"), _T("0x%X"), GetCurrentObject(hDC, OBJ_BRUSH)); Add(_T("DC Brush Color"), _T("0x%X"), GetDCBrushColor(hDC)); GetBrushOrgEx(hDC, & pnt); Add(_T("Brush Origin"), _T("{ %d, %d }"), pnt.x, pnt.y); Add(_T("Polygon Filling Mode"), _T("%d"), GetPolyFillMode(hDC)); Add(_T("Bitmap Stretching Mode"), _T("%d"), GetStretchBltMode(hDC)); Add(_T("Logical Font"), _T("0x%X"), GetCurrentObject(hDC, OBJ_FONT)); Add(_T("Inter-character spacing"), _T("%d"), GetTextCharacterExtra(hDC)); DWORD flag = SetMapperFlags(hDC, 0); SetMapperFlags(hDC, flag); Add(_T("Font Mapper Flags"), _T("0x%X"), flag); Add(_T("Text Alignment"), _T("0x%X"), GetTextAlign(hDC)); Add(_T("Text Justification"), _T("write only"), 0); Add(_T("Layout"), _T("%d"), GetLayout(hDC)); Add(_T("Path"), _T("%d bytes"), GetPath(hDC, NULL, NULL, 0)); RECT rect; int typ = GetClipBox(hDC, & rect); HRGN hRgn = CreateRectRgn(0, 0, 1, 1); GetClipRgn(hDC, hRgn); Add(_T("Clipping"), _T("type %d clip box { %d, %d, %d, %d } size %d bytes"), typ, rect.left, rect.top, rect.right, rect.bottom, GetRegionData(hRgn, 0, NULL) ); GetMetaRgn(hDC, hRgn); GetRgnBox(hRgn, & rect); Add(_T("Meta Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); for (int i=1; i<=5; i++) { int rslt = GetRandomRgn(hDC, hRgn, i); if ( rslt==1 ) { GetRgnBox(hRgn, & rect); Add(_T("Random Region"), _T("size %d bytes, rgn box { %d, %d, %d, %d }"), GetRegionData(hRgn, 0, NULL), rect.left, rect.top, rect.right, rect.bottom); } else if ( rslt==0 ) Add(_T("Random Region"), _T("NULL"), 0); else Add(_T("Random Region"), _T("FAIL"), 0); } DeleteObject(hRgn); GetBoundsRect(hDC, & rect, 0); Add(_T("Bounds Rectangle"), _T("{ %d, %d, %d, %d }"), rect.left, rect.top, rect.right, rect.bottom); }
void SGroup::OnPaint(IRenderTarget *pRT) { SPainter painter; BeforePaint(pRT, painter); CSize szFnt; pRT->MeasureText(m_strText, m_strText.GetLength(),&szFnt); CRect rcText=GetWindowRect(); rcText.left+=GROUP_HEADER,rcText.right-=GROUP_HEADER; rcText.bottom=rcText.top+szFnt.cy+2; if(GetTextAlign() & DT_CENTER) { rcText.left+=(rcText.Width()-szFnt.cx)/2; rcText.right=rcText.left+szFnt.cx; } else if(GetTextAlign() & DT_RIGHT) { rcText.left=rcText.right-szFnt.cx; } else { rcText.right=rcText.left+szFnt.cx; } if(!m_strText.IsEmpty()) { CRect rcClip=rcText; rcClip.InflateRect(5,5,5,5); pRT->PushClipRect(&rcClip,RGN_DIFF); } { CRect rcGroupBox = GetWindowRect(); if(!m_strText.IsEmpty()) rcGroupBox.top+=szFnt.cy/2; rcGroupBox.DeflateRect(1,1,1,0); CAutoRefPtr<IPen> pen1,pen2,oldPen; pRT->CreatePen(PS_SOLID,m_crLine1,1,&pen1); pRT->CreatePen(PS_SOLID,m_crLine2,1,&pen2); pRT->SelectObject(pen1,(IRenderObj**)&oldPen); pRT->DrawRoundRect(&rcGroupBox,CPoint(m_nRound,m_nRound)); pRT->SelectObject(pen2); rcGroupBox.InflateRect(1,1,1,-1); pRT->DrawRoundRect(&rcGroupBox,CPoint(m_nRound,m_nRound)); pRT->SelectObject(oldPen); } if(!m_strText.IsEmpty()) { pRT->PopClip(); pRT->DrawText(m_strText, m_strText.GetLength(), rcText, DT_SINGLELINE|DT_VCENTER); } AfterPaint(pRT, painter); }
/********************************************************************** * EMFDRV_ExtTextOut */ BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx ) { EMREXTTEXTOUTW *pemr; DWORD nSize; BOOL ret; EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev; int textHeight = 0; int textWidth = 0; const UINT textAlign = GetTextAlign(physDev->hdc); nSize = sizeof(*pemr) + ((count+1) & ~1) * sizeof(WCHAR) + count * sizeof(INT); TRACE("%s %s count %d nSize = %ld\n", debugstr_wn(str, count), wine_dbgstr_rect(lprect), count, nSize); pemr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nSize); pemr->emr.iType = EMR_EXTTEXTOUTW; pemr->emr.nSize = nSize; pemr->iGraphicsMode = GetGraphicsMode(physDev->hdc); pemr->exScale = pemr->eyScale = 1.0; /* FIXME */ pemr->emrtext.ptlReference.x = x; pemr->emrtext.ptlReference.y = y; pemr->emrtext.nChars = count; pemr->emrtext.offString = sizeof(*pemr); memcpy((char*)pemr + pemr->emrtext.offString, str, count * sizeof(WCHAR)); pemr->emrtext.fOptions = flags; if(!lprect) { pemr->emrtext.rcl.left = pemr->emrtext.rcl.top = 0; pemr->emrtext.rcl.right = pemr->emrtext.rcl.bottom = -1; } else { pemr->emrtext.rcl.left = lprect->left; pemr->emrtext.rcl.top = lprect->top; pemr->emrtext.rcl.right = lprect->right; pemr->emrtext.rcl.bottom = lprect->bottom; } pemr->emrtext.offDx = pemr->emrtext.offString + ((count+1) & ~1) * sizeof(WCHAR); if(lpDx) { UINT i; SIZE strSize; memcpy((char*)pemr + pemr->emrtext.offDx, lpDx, count * sizeof(INT)); for (i = 0; i < count; i++) { textWidth += lpDx[i]; } GetTextExtentPoint32W(physDev->hdc, str, count, &strSize); textHeight = strSize.cy; } else { UINT i; INT *dx = (INT *)((char*)pemr + pemr->emrtext.offDx); SIZE charSize; for (i = 0; i < count; i++) { GetTextExtentPoint32W(physDev->hdc, str + i, 1, &charSize); dx[i] = charSize.cx; textWidth += charSize.cx; textHeight = max(textHeight, charSize.cy); } } switch (textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER)) { case TA_CENTER: { pemr->rclBounds.left = x - (textWidth / 2) - 1; pemr->rclBounds.right = x + (textWidth / 2) + 1; break; } case TA_RIGHT: { pemr->rclBounds.left = x - textWidth - 1; pemr->rclBounds.right = x; break; } default: { /* TA_LEFT */ pemr->rclBounds.left = x; pemr->rclBounds.right = x + textWidth + 1; } } switch (textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE)) { case TA_BASELINE: { TEXTMETRICW tm; GetTextMetricsW(physDev->hdc, &tm); /* Play safe here... it's better to have a bounding box */ /* that is too big than too small. */ pemr->rclBounds.top = y - textHeight - 1; pemr->rclBounds.bottom = y + tm.tmDescent + 1; break; } case TA_BOTTOM: { pemr->rclBounds.top = y - textHeight - 1; pemr->rclBounds.bottom = y; break; } default: { /* TA_TOP */ pemr->rclBounds.top = y; pemr->rclBounds.bottom = y + textHeight + 1; } } ret = EMFDRV_WriteRecord( dev, &pemr->emr ); if(ret) EMFDRV_UpdateBBox( dev, &pemr->rclBounds ); HeapFree( GetProcessHeap(), 0, pemr ); return ret; }
CGumpEntity* CGumpStatic::Clone() { CGumpStatic* obj = new CGumpStatic(GetHueId(), GetFontId(), GetTextAlign()); obj->Copy( this ); return obj; }
static void GdiTextOut(HDC m_hDC, TextAlign textAlign, TextBaseline baseLine, const wchar_t* psz, int textlen, int ix, int iy) { assert(GetTextAlign(m_hDC) == TA_LEFT); SIZE sz; ::GetTextExtentPointW(m_hDC, psz, textlen, &sz); int newx = ix; int newy = iy; switch (textAlign) { case TextAlignStart: newx = ix; break; case TextAlignEnd: newx = ix - sz.cx; break; case TextAlignLeft: newx = ix; break; case TextAlignRight: newx = ix - sz.cx; break; case TextAlignCenter: newx = ix - sz.cx / 2; break; default: assert(false); } switch (baseLine) { case TextBaselineTop : newy = iy; break;//The top of the em square case TextBaselineHanging: newy = iy; break; //The hanging baseline case TextBaselineMiddle : newy = iy - sz.cy / 2; break; //The middle of the em square case TextBaselineAlphabetic : { TEXTMETRIC tm; GetTextMetrics(m_hDC, &tm); newy = iy - (tm.tmHeight - tm.tmDescent); } break;//The alphabetic baseline case TextBaselineIdeographic : { TEXTMETRIC tm; GetTextMetrics(m_hDC, &tm); newy = iy - (tm.tmHeight); } break; //The ideographic baseline case TextBaselineBottom : newy = iy - sz.cy; break;//The bottom of the em square default: break; } TextOut(m_hDC, newx, newy, psz, wcslen(psz)); }
static BOOL CALLBACK status_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { status_t * s = (status_t*)GetWindowLong(hDlg, GWL_USERDATA); switch (uMsg) { case WM_INITDIALOG : SetWindowLong(hDlg, GWL_USERDATA, lParam); s = (status_t*)lParam; s->hGraph = GetDlgItem(hDlg, IDC_STATUS_GRAPH); s->hDc = GetDC(s->hGraph); { RECT rect; GetWindowRect(s->hGraph, &rect); s->width = rect.right - rect.left; s->height = rect.bottom - rect.top; } s->width31 = s->width/31; s->stride = (s->width/4+1)*4; s->buffer = malloc(s->width * s->stride); s->bi = malloc(sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)); memset(s->bi, 0, sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)); s->bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); s->bi->bmiHeader.biWidth = s->stride; s->bi->bmiHeader.biHeight = s->height; s->bi->bmiHeader.biPlanes = 1; s->bi->bmiHeader.biBitCount = 8; s->bi->bmiHeader.biCompression = BI_RGB; set_bic(s->bi->bmiColors, CLR_BG, 0, 0, 0); set_bic(s->bi->bmiColors, CLR_FG, 128, 128, 128); set_bic(s->bi->bmiColors, CLR_QUANT_I, 255, 0, 0); set_bic(s->bi->bmiColors, CLR_QUANT_P, 0, 0, 255); set_bic(s->bi->bmiColors, CLR_QUANT_B, 0, 192, 0); SelectObject(s->hDc, GetStockObject(DEFAULT_GUI_FONT)); SetBkColor(s->hDc, *(DWORD*)&s->bi->bmiColors[CLR_BG]); SetTextColor(s->hDc, *(DWORD*)&s->bi->bmiColors[CLR_FG]); GetTextMetrics(s->hDc, &s->tm); draw_graph(s); SetTimer(hDlg, IDC_STATUS_GRAPH, 1000, NULL); /* 1 second */ break; case WM_DESTROY : free(s->buffer); free(s->bi); KillTimer(hDlg, IDC_STATUS_GRAPH); s->hDlg = NULL; break; case WM_DRAWITEM : if (wParam==IDC_STATUS_GRAPH) { int i; /* copy buffer into dc */ SetDIBitsToDevice(s->hDc, 0, 0, s->width, s->height, 0, 0, 0, s->height, s->buffer, s->bi, DIB_RGB_COLORS); SetTextAlign(s->hDc, GetTextAlign(s->hDc)|TA_CENTER); for (i=0; i<31; i++) { TextOut(s->hDc, i*s->width31 + s->width/62, s->height-s->tm.tmHeight, number[i], strlen(number[i])); } } break; case WM_TIMER : if (wParam==IDC_STATUS_GRAPH) { double avg_q; char buf[16]; SetDlgItemInt(hDlg, IDC_STATUS_I_NUM, (unsigned int)s->count[1], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_P_NUM, (unsigned int)s->count[2], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_B_NUM, (unsigned int)s->count[3], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_NUM, (unsigned int)s->count[0], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_IQ_MIN, s->min_quant[1], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_IQ_MAX, s->max_quant[1], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_PQ_MIN, s->min_quant[2], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_PQ_MAX, s->max_quant[2], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_BQ_MIN, s->min_quant[3], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_BQ_MAX, s->max_quant[3], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_Q_MIN, s->min_quant[0], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_Q_MAX, s->max_quant[0], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_IL_MIN, s->min_length[1], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_IL_MAX, s->max_length[1], FALSE); if (s->count[1]>0) SetDlgItemInt(hDlg, IDC_STATUS_IL_AVG, (unsigned int)(s->tot_length[1]/s->count[1]), FALSE); else SetDlgItemInt(hDlg, IDC_STATUS_IL_AVG, 0, FALSE); SetDlgItemInt(hDlg, IDC_STATUS_IL_TOT, (unsigned int)(s->tot_length[1]/1024), FALSE); SetDlgItemInt(hDlg, IDC_STATUS_PL_MIN, s->min_length[2], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_PL_MAX, s->max_length[2], FALSE); if (s->count[2]>0) SetDlgItemInt(hDlg, IDC_STATUS_PL_AVG, (unsigned int)(s->tot_length[2]/s->count[2]), FALSE); else SetDlgItemInt(hDlg, IDC_STATUS_PL_AVG, 0, FALSE); SetDlgItemInt(hDlg, IDC_STATUS_PL_TOT, (unsigned int)(s->tot_length[2]/1024), FALSE); SetDlgItemInt(hDlg, IDC_STATUS_BL_MIN, s->min_length[3], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_BL_MAX, s->max_length[3], FALSE); if (s->count[3]>0) SetDlgItemInt(hDlg, IDC_STATUS_BL_AVG, (unsigned int)(s->tot_length[3]/s->count[3]), FALSE); else SetDlgItemInt(hDlg, IDC_STATUS_BL_AVG, 0, FALSE); SetDlgItemInt(hDlg, IDC_STATUS_BL_TOT, (unsigned int)(s->tot_length[3]/1024), FALSE); SetDlgItemInt(hDlg, IDC_STATUS_L_MIN, s->min_length[0], FALSE); SetDlgItemInt(hDlg, IDC_STATUS_L_MAX, s->max_length[0], FALSE); if (s->count[0]>0) SetDlgItemInt(hDlg, IDC_STATUS_L_AVG, (int)(s->tot_length[0]/s->count[0]), FALSE); else SetDlgItemInt(hDlg, IDC_STATUS_L_AVG, 0, FALSE); SetDlgItemInt(hDlg, IDC_STATUS_L_TOT, (unsigned int)(s->tot_length[0]/1024), FALSE); if (s->count[0]>0) { uint64_t kbits = 8*s->tot_length[0]/1000; double secs = (double)s->count[0]/s->fps; SetDlgItemInt(hDlg, IDC_STATUS_KBPS, (int)(kbits/secs), FALSE); }else{ SetDlgItemInt(hDlg, IDC_STATUS_KBPS, 0, FALSE); } avg_q = avg_quant(s->quant[0], s->min_quant[1], s->max_quant[1], buf) * s->count[1]; SetDlgItemText(hDlg, IDC_STATUS_IQ_AVG, buf); avg_q += avg_quant(s->quant[1], s->min_quant[2], s->max_quant[2], buf) * s->count[2]; SetDlgItemText(hDlg, IDC_STATUS_PQ_AVG, buf); avg_q += avg_quant(s->quant[2], s->min_quant[3], s->max_quant[3], buf) * s->count[3]; SetDlgItemText(hDlg, IDC_STATUS_BQ_AVG, buf); if (s->count[0] != 0) avg_q /= (double)s->count[0]; sprintf(buf, "%.2f", avg_q); SetDlgItemText(hDlg, IDC_STATUS_Q_AVG, buf); draw_graph(s); InvalidateRect(s->hGraph, NULL, FALSE); } break; case WM_COMMAND : if (LOWORD(wParam)==IDCANCEL) { DestroyWindow(hDlg); } break; default : return FALSE; } return TRUE; }
/********************************************************************** * EMFDRV_ExtTextOut */ BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx ) { EMFDRV_PDEVICE *physDev = get_emf_physdev( dev ); EMREXTTEXTOUTW *pemr; DWORD nSize; BOOL ret; int textHeight = 0; int textWidth = 0; const UINT textAlign = GetTextAlign( dev->hdc ); const INT graphicsMode = GetGraphicsMode( dev->hdc ); FLOAT exScale, eyScale; nSize = sizeof(*pemr) + ((count+1) & ~1) * sizeof(WCHAR) + count * sizeof(INT); TRACE("%s %s count %d nSize = %d\n", debugstr_wn(str, count), wine_dbgstr_rect(lprect), count, nSize); pemr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nSize); if (graphicsMode == GM_COMPATIBLE) { const INT horzSize = GetDeviceCaps( dev->hdc, HORZSIZE ); const INT horzRes = GetDeviceCaps( dev->hdc, HORZRES ); const INT vertSize = GetDeviceCaps( dev->hdc, VERTSIZE ); const INT vertRes = GetDeviceCaps( dev->hdc, VERTRES ); SIZE wndext, vportext; GetViewportExtEx( dev->hdc, &vportext ); GetWindowExtEx( dev->hdc, &wndext ); exScale = 100.0 * ((FLOAT)horzSize / (FLOAT)horzRes) / ((FLOAT)wndext.cx / (FLOAT)vportext.cx); eyScale = 100.0 * ((FLOAT)vertSize / (FLOAT)vertRes) / ((FLOAT)wndext.cy / (FLOAT)vportext.cy); } else { exScale = 0.0; eyScale = 0.0; } pemr->emr.iType = EMR_EXTTEXTOUTW; pemr->emr.nSize = nSize; pemr->iGraphicsMode = graphicsMode; pemr->exScale = exScale; pemr->eyScale = eyScale; pemr->emrtext.ptlReference.x = x; pemr->emrtext.ptlReference.y = y; pemr->emrtext.nChars = count; pemr->emrtext.offString = sizeof(*pemr); memcpy((char*)pemr + pemr->emrtext.offString, str, count * sizeof(WCHAR)); pemr->emrtext.fOptions = flags; if(!lprect) { pemr->emrtext.rcl.left = pemr->emrtext.rcl.top = 0; pemr->emrtext.rcl.right = pemr->emrtext.rcl.bottom = -1; } else { pemr->emrtext.rcl.left = lprect->left; pemr->emrtext.rcl.top = lprect->top; pemr->emrtext.rcl.right = lprect->right; pemr->emrtext.rcl.bottom = lprect->bottom; } pemr->emrtext.offDx = pemr->emrtext.offString + ((count+1) & ~1) * sizeof(WCHAR); if(lpDx) { UINT i; SIZE strSize; memcpy((char*)pemr + pemr->emrtext.offDx, lpDx, count * sizeof(INT)); for (i = 0; i < count; i++) { textWidth += lpDx[i]; } if (GetTextExtentPoint32W( dev->hdc, str, count, &strSize )) textHeight = strSize.cy; } else { UINT i; INT *dx = (INT *)((char*)pemr + pemr->emrtext.offDx); SIZE charSize; for (i = 0; i < count; i++) { if (GetTextExtentPoint32W( dev->hdc, str + i, 1, &charSize )) { dx[i] = charSize.cx; textWidth += charSize.cx; textHeight = max(textHeight, charSize.cy); } } } if (physDev->path) { pemr->rclBounds.left = pemr->rclBounds.top = 0; pemr->rclBounds.right = pemr->rclBounds.bottom = -1; goto no_bounds; } /* FIXME: handle font escapement */ switch (textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER)) { case TA_CENTER: { pemr->rclBounds.left = x - (textWidth / 2) - 1; pemr->rclBounds.right = x + (textWidth / 2) + 1; break; } case TA_RIGHT: { pemr->rclBounds.left = x - textWidth - 1; pemr->rclBounds.right = x; break; } default: { /* TA_LEFT */ pemr->rclBounds.left = x; pemr->rclBounds.right = x + textWidth + 1; } } switch (textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE)) { case TA_BASELINE: { TEXTMETRICW tm; if (!GetTextMetricsW( dev->hdc, &tm )) tm.tmDescent = 0; /* Play safe here... it's better to have a bounding box */ /* that is too big than too small. */ pemr->rclBounds.top = y - textHeight - 1; pemr->rclBounds.bottom = y + tm.tmDescent + 1; break; } case TA_BOTTOM: { pemr->rclBounds.top = y - textHeight - 1; pemr->rclBounds.bottom = y; break; } default: { /* TA_TOP */ pemr->rclBounds.top = y; pemr->rclBounds.bottom = y + textHeight + 1; } } EMFDRV_UpdateBBox( dev, &pemr->rclBounds ); no_bounds: ret = EMFDRV_WriteRecord( dev, &pemr->emr ); HeapFree( GetProcessHeap(), 0, pemr ); return ret; }