BCB - Canvas drukarki - problem z rozmiarem czcionki

0

Witam,

Sprawa jest taka: mam do zaimplementowania podglad wydruku i wydruk. Na wydruku musze miec pewien tekst o orientacji pionowej. Napisalem taka funkcje do wyswietlania pionowego tekstu:

 void AngleTextOut(String sText, int x, int y)
   {
	TLogFont *LogFont = new TLogFont();
	TFont *SaveFont = new TFont();
	c->Font->Size = 8*(zoom/100.0);
	SaveFont->Assign(c->Font);
	GetObject(SaveFont->Handle, sizeof(TLogFont), LogFont);
	LogFont->lfEscapement = 900;
	LogFont->lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
	c->Font->Handle = CreateFontIndirect(LogFont);
	SetBkMode(c->Handle, TRANSPARENT);

	c->TextOut(x*jedn_x, y*jedn_y, sText);
	c->Font->Assign(SaveFont);

	delete SaveFont;
   }

Problem z tym, ze jezeli wyswietlam tekst na Canvasie podgladu jest ok - ale jezeli wrzuce to na Canvas drukarki (wtedy zoom=100), to juz nie dziala - wtedy rozmiar czcionki jest zalezny od DPI drukarki i dla duzych DPI czcionka ma tak maly rozmiar, ze jej nie widac.

Pytanie: dlaczego tak sie dzieje i w czym problem? Jak mam obliczac rozmiar czcionki?

Jezeli wyswietlam tekst normalnie poziomo za pomoca standardowego TextOut, rozmiary czcionek sa zawsze zachowane i nie ma takiego problemu.

0
void AngleTextOut(String sText, int x, int y)
   {
        TFont *SaveFont = new TFont();
        c->Font->Size = 8*(zoom/100.0);
        SaveFont->Assign(c->Font);

        TLogFont LogFont;
        GetObject(c->Font->Handle, sizeof(TLogFont), &LogFont); //tu nie jestem pewien czy tak ma być z tym & ale chodzi o to, że na końcu ma być adres LogFont (w delphi to wygląda tak Addr(LogFont))
        LogFont->lfEscapement = 900;
        LogFont->lfOrientation = 900;
        LogFont->lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
        
        HFONT nfont; //nowy font
        HFONT ofont; //stary font
        nfont = CreateFontIndirect(LogFont); //stworzenie fontu
        ofont = SelectObject(c->Handle, nfont); //przypisanie go do DC (stary - ten który tam był font ląduje w ofont)

        SetBkMode(c->Handle, TRANSPARENT);

        c->TextOut(x*jedn_x, y*jedn_y, sText);
        nfont := SelectObject(c->handle, ofont); //przywrócenie starego fontu do DC i "pobranie" tego, który stworzyliśmy
        DeleteObject(nfont); //usuniecie naszego, stworzonego fontu

        c->Font->Assign(SaveFont);
        delete SaveFont;
   }

u mnie pod delphi takie coś działa (znaczy trochę bardziej zakręcone ale taki jest mniej więcej sens)

0

Ok, twoj kod dziala jak trzeba - ale nie wiem dlaczego moj nie dzialal, w sumie przeciez zrobione jest to tak samo :|

I nie wiem jaka to roznica, czy Canvas drukarki, czy Canvas z TImage...

Jeszcze tak dla uscislenia (moze przyda sie komus, kto bedzie to czytal w przyszlosci):

/tu nie jestem pewien czy tak ma być z tym & ale chodzi o to, że na końcu ma być adres LogFont (w delphi to wygląda tak Addr(LogFont))

U mnie bylo bez "&", a to dlatego, ze:

TLogFont *LogFont = new TLogFont();

Przyzwyczailem sie, ze wszystko co ma na poczatku 'T' deklaruje dynamicznie (klasy VCL), ale w tym konkretnym przypadku nie trzeba tego robic, wtedy rzeczywiscie:

TLogFont LogFont;
GetObject(c->Font->Handle, sizeof(TLogFont), &LogFont);

//...ale:

LogFont.lfEscapement = 900;
LogFont.lfOrientation = 900;
LogFont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;

No ale to tak troche OffTopic, bo pewnie kazdy, kto uzywa BCB to wie.

0

zauważ, że miałeś

GetObject(SaveFont->Handle, sizeof(TLogFont), LogFont);
a GetObject jako pierwszy parametr wymaga handle DC a nie fontu, poza tym SaveFont i c->Font to nie to samo

i tu
c->Font->Handle = CreateFontIndirect(LogFont);
miałeś jakieś dziwne przypisanie, które przypuszczam nie działało tak jakbyś chciał, a które powinno wyglądać tak
nfont = CreateFontIndirect(LogFont); //stworzenie fontu
ofont = SelectObject(c->Handle, nfont);

a co do & to w Delphi nie trzeba przy wskaźnikach zawsze dawać ^ (np. każda zmienna klasowa to wskaźnik) więc nie zwróciłem uwagi

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