Solved

Displaying text with an angle

Posted on 2002-05-15
8
491 Views
Last Modified: 2008-02-01
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
0
Comment
Question by:rvlokven
8 Comments
 
LVL 2

Expert Comment

by:mirtol
ID: 7011129
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.
0
 
LVL 32

Expert Comment

by:jhance
ID: 7011165
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);
}
0
 
LVL 6

Accepted Solution

by:
DrDelphi earned 50 total points
ID: 7011609
a Delphi example (Same VCL) from my website:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

  public
    { Public declarations }
   HF:Hfont;



procedure TForm1.FormCreate(Sender: TObject);
var
  LF: TLogFont;
begin
  FillChar(LF, SizeOf(LF), 0);
  with LF do begin
   lfWidth:=10;
   lfheight:=14;
   lfEscapement:=450; //45.0 degrees
   lfOrientation:=450;//45.0 degrees
   lfWeight:=FW_BOLD;
   lfCharSet:=DEFAULT_CHARSET;
   lfOutPrecision:=OUT_DEFAULT_PRECIS;
   lfClipPrecision:=CLIP_DEFAULT_PRECIS;
   lfQuality:=DEFAULT_QUALITY;
   lfPitchAndFamily:=DEFAULT_PITCH or FF_DONTCARE;
   lfFaceName:='Times New Roman';
  end;
  HF:=CreateFontIndirect(LF);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SelectObject(canvas.Handle, HF);
  TextOut(canvas.handle, 200, 200, 'Testline', 8);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SelectObject(canvas.handle, GetStockObject(DEFAULT_GUI_FONT));
  DeleteObject(HF);

end;



Good luck!!
www.drdelphi.com

0
 
LVL 32

Expert Comment

by:jhance
ID: 7011643
Why would a Delphi example be useful in the C++ topic area?  Just asking....
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 6

Expert Comment

by:DrDelphi
ID: 7011693
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!!
0
 
LVL 32

Expert Comment

by:jhance
ID: 7011699
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.
0
 
LVL 6

Expert Comment

by:DrDelphi
ID: 7011738
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!!
0
 
LVL 1

Expert Comment

by:wolfpackinc
ID: 7012299
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
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now