Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Displaying text with an angle

Posted on 2002-05-15
8
Medium Priority
?
521 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 200 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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 32

Expert Comment

by:jhance
ID: 7011643
Why would a Delphi example be useful in the C++ topic area?  Just asking....
0
 
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

Important Lessons on Recovering from Petya

In their most recent webinar, Skyport Systems explores ways to isolate and protect critical databases to keep the core of your company safe from harm.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

972 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