Tekst (napisy) z otoczką i/lub cieniem WinAPI (bez GDI+)

0

Witam,

Szukałem na Googlu i nie znalazłem (na razie). Jak w temacie - chodzi o uzyskanie napisów (tekstu nałożonego na obraz) z obwódką i/lub cieniem (jak napisy w filmach). Kod jak to zrobić w GDI+ znalazłem ale jak to zrobić w zwykłym GDI to już nie.

Rzecz w tym, żeby mieć w przeglądarce zdjęć widoczny nałożony opis wyciągnięty z pól IPTC, ale to już jest. Brakuje tylko obwódki/cienia, żeby napis był lepiej widoczny jeśli nie ma jednolitego tła.

Z góry dziękuje za wszelkie sugestie (linki itepe).

Pozdrawiam,
VdV

0

Jeżeli chodzi o uzyskanie obwódki wokół napisu to rozwiązanie jest następujące:

char t[] = "text";

SetBkMode(hdc, TRANSPARENT);

TextOut(hdc,0,0,t,strlen(t)); // aby było wypełnienie

BeginPath(hdc);

TextOut(hdc,0,0,t,strlen(t)); // aby była zamiana tekstu na ścieżkę

EndPath(hdc);

HPEN hP = CreatePen(PS_SOLID,1,RGB(150,150,150)); // aby ścieżka była rysowana wybranym przeze mnie piórem

SelectObject(hdc,hP); // ustawienie wybranego pióra

StrokePath(hdc); // aby narysować ścieżkę (obwódkę wokół czcionki)

DeleteObject(hP);
0

Jest jeszcze stary niezawodny sposób - malujesz jednym kolorem napis pogrubioną czcionką, i na nim drugim kolorem zwykłą czcionką. Tylko czcionka musi mieć znaki o stałej szerokości.

0

Pogrubiebie odpada - różne czcionki - wybrane przez użytkownika.

Dzięki za kod gringoM, ale jakoś nie mogę uzyskac efektu. Napis jest, ale obwódki nie ma (C++ VS):

testowowy kod:

	// ********************************************************************************************************
	// Drawing text with outline
	// ********************************************************************************************************
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR text[ ] = L"My  text with outline.";
	// settings
	COLORREF myColor = RGB(150,200,50); //this should be a parameter from settings
	int PenWidth = 2; //another parameter from settings
	bool Outline = FALSE; // one more - enabled/disabled
	// the doing
	hdc = BeginPaint(hWnd, &ps);
	SetBkMode(hdc, TRANSPARENT);
	TextOut(hdc,10,10,text,ARRAYSIZE(text)-1); // fill
	if (Outline)
	{
		BeginPath(hdc);
		TextOut(hdc,10,10,text,ARRAYSIZE(text)); // text into path
		EndPath(hdc);
		HPEN hP = CreatePen(PS_SOLID,PenWidth,myColor); // path to be drawn with selected pen
		SelectObject(hdc,hP); // pen settings
		StrokePath(hdc); // draw the path (outline around font)
		DeleteObject(hP);
	}
	EndPaint(hWnd, &ps);
	UpdateWindow(hWnd);

W czym rzecz?

Przy okazji znalazłem rozwiązanie wg MSDN:
http://msdn.microsoft.com/en-us/library/c8ezcwxf.aspx

To samo (path), ale jakoś inaczej ;)

0

Sorry, dałem wersję z Outline = FALSE; testowałem z TRUE oczywiście.

0

Z przykrością muszę stwierdzić, że najwyraźniej funkcje rysujące ścieżki nie działają z wszystkimi typami czcionek, nie zauważyłem wcześniej tego ponieważ standardowo używam czcionki innej od tej, która jest automatycznie ustawiana. Poniższy kod z użyciem czcionki Times New Roman działa bez zarzutu.

        PAINTSTRUCT ps;
        HDC hdc;
        TCHAR text[ ] = L"My  text with outline.";
        // settings
        COLORREF myColor = RGB(150,200,50); //this should be a parameter from settings
        int PenWidth = 2; //another parameter from settings
        bool Outline = true; // one more - enabled/disabled
        // the doing
        hdc = BeginPaint(hWnd, &ps);
	HFONT hFont = CreateFontW (100, 0,0,0,0,0,0,0,0,0,0,0,0, TEXT ("Times New Roman"));
	SelectObject(hdc,hFont);
        SetBkMode(hdc, TRANSPARENT);
        TextOut(hdc,10,10,text,ARRAYSIZE(text)-1); // fill
        if (Outline)
        {
                BeginPath(hdc);
                TextOut(hdc,10,10,text,ARRAYSIZE(text)); // text into path
                EndPath(hdc);
                HPEN hP = CreatePen(PS_SOLID,PenWidth,myColor); // path to be drawn with selected pen
                SelectObject(hdc,hP); // pen settings
                StrokePath(hdc); // draw the path (outline around font)
                DeleteObject(hP);
        }
        DeleteObject(hFont);
        EndPaint(hWnd, &ps);
0

Zdaje się, że czcionka musi być TrueType (wektorowa).

1 użytkowników online, w tym zalogowanych: 0, gości: 1