Link to home
Start Free TrialLog in
Avatar of rvlokven
rvlokven

asked on

Displaying text with an angle

Id like to display text on a canvas in a certain angle with VCL (not MFC). I've looked around and all i can find is just real big functions and loads of code.

Is there a simple way to display the way i want to?
tnx all
Avatar of mirtol
mirtol

Unless you can find a control somewhere which allows you to set angles, nope.

Simplest way is to call the windows CreateFontIndirect function and set the Font->Handle to this.

If you're going to do it alot then create a descendant of TFont which has an Escapement/Orientation property so you can easily create angled fonts. Then you can just pass the handle over and not worry each time about creating the font structure etc etc.
See the Windows SDK docs section titled:

Rotating Lines of Text

But the relevant portion of the code is quite simple:


// Draw the string 36 times, rotating 10 degrees
// counter-clockwise each time.
 
for (angle = 0; angle < 3600; angle += 100)
{
    plf->lfEscapement = angle;
    hfnt = CreateFontIndirect(plf);
    hfntPrev = SelectObject(hdc, hfnt);
    TextOut(hdc, rc.right / 2, rc.bottom / 2,
        lpszRotate, lstrlen(lpszRotate));
    SelectObject(hdc, hfntPrev);
    DeleteObject(hfnt);
}
ASKER CERTIFIED SOLUTION
Avatar of DrDelphi
DrDelphi

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Why would a Delphi example be useful in the C++ topic area?  Just asking....
Because the question was how to do this using VCL, meaning that he is using Borland C++ Builder, which is based on the exact same VCL as Delphi. The beauty of this is that I can take Delphi code and plug into BCB directly. And BCB code is usually easily adapted to Delphi, as well. That is why, though an ardent Delphian, I also have BCB code examples on my website...www.drdelphi.com (shameless plug).

Good luck!!
I guess I'm not sure what VCL is.  But in any case, this is really not a C++ or Delphi question at all but rather more suited to the Windows Programming topic.
VCL is an acronym for "Visual Component Library"... Borland's answer to MFC (Microsoft Foundation Classes). Every object in BCB and Delphi is ultimately derived from the VCL.As for whether this is the right area for the question... I am inclined to think that this is. rvlokven
is looking for a VCL C++ solution to his/her quaestion. Windows Programming is much too general for this. I mean, a PowerBuilder(or any other tool)  solution (if one even exists), isn't going to do him any good , would it?


Good luck!!
heres what I use from a label component:

 LOGFONT LogRec;
GetObject(Font->Handle,sizeof(LogRec),&LogRec);

LogRec.lfEscapement = 900;//90% angle
LogRec.lfOrientation = 900;

Canvas->Font->Handle=CreateFontIndirect(&LogRec);
//Writes a string on the canvas, starting at the point (X,Y), and then updates the PenPos to the end of the string.

//void __fastcall TextOut(int X, int Y, const System::AnsiString Text);
Canvas->TextOut(0,w,Caption);

which is same as DrDelphi but in C++ Builder