yyy Posted January 10, 2005 Share Posted January 10, 2005 Hello, I want to draw an outlined text using C#.Net. How can I do it? I think I need to use GDI but how exactly? All I know is how to draw a normal text. Thanks in advance for your help :) Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/ Share on other sites More sharing options...
0 kjordan2001 Posted January 10, 2005 Share Posted January 10, 2005 Just draw a lot of lines: http://csharpcomputing.com/Tutorials/Lesson15.htm Or if you want to get really fancy, draw lines that form Besier curves for each letter and that way it can go at any angle. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585267669 Share on other sites More sharing options...
0 yyy Posted January 10, 2005 Author Share Posted January 10, 2005 Thanks - but I think it is too complicated to me :blush: Nevermind - I've decided to do something else after all - sorry :rolleyes: Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585268827 Share on other sites More sharing options...
0 azcodemonkey Posted January 11, 2005 Share Posted January 11, 2005 It's pretty easy. From Windows Forms Programming in C# by Chris Sells GraphicsPath GetStringPath( string s, float dpi, RectangleF rect, Font font, StringFormat format) { GraphicsPath path = new GraphicsPath(); // Convert font size into appropriate coordinates float emSize = dpi * font.SizeInPoints / 72; path.AddString(s, font.FontFamily, (int)font.Style, emSize, rect, format); return path; } void Form_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; string s = "Outline"; RectangleF rect = this.ClientRectangle; Font font = this.Font; StringFormat format = StringFormat.GenericTypographic; float dpi = g.DpiY; using( GraphicsPath = GetStringPath(s, dpi, rect, font, format) ) { g.DrawPath(Pens.Black, path); } } Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585271552 Share on other sites More sharing options...
0 yyy Posted January 11, 2005 Author Share Posted January 11, 2005 Works nice :cool: Thanks a lot weenur :laugh: But I was thinking more of something like this: I want it to have an inner white color and a shadow. Do you think it is possible ? Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585271907 Share on other sites More sharing options...
0 azcodemonkey Posted January 11, 2005 Share Posted January 11, 2005 (edited) yyy said: I want it to have an inner white color and a shadow. Do you think it is possible ? It's possible. In the paint event. Graphics g = e.Graphics; string s = "Outline"; RectangleF rect = this.ClientRectangle; Font font = this.Font; StringFormat format = StringFormat.GenericTypographic; float dpi = g.DpiY; using( GraphicsPath path = GetStringPath(s, dpi, rect, font, format) ) { g.SmoothingMode = SmoothingMode.AntiAlias; RectangleF off = rect; off.Offset( 5, 5 ); using( GraphicsPath offPath = GetStringPath(s, dpi, off, font, format) ) { Brush b = new SolidBrush(Color.FromArgb(100, 0, 0, 0)); g.FillPath(b, offPath); b.Dispose(); } g.FillPath(Brushes.White, path); g.DrawPath(Pens.Black, path); } Edited January 11, 2005 by weenur Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585273484 Share on other sites More sharing options...
0 yyy Posted January 11, 2005 Author Share Posted January 11, 2005 :laugh: Thanks a lot weenur - that's really close :D Can I make the shadow even more smooth? Is there a way I can control the shadow width? Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585273695 Share on other sites More sharing options...
0 azcodemonkey Posted January 11, 2005 Share Posted January 11, 2005 (edited) yyy said: :laugh: Thanks a lot weenur - that's really close :D Can I make the shadow even more smooth? Is there a way I can control the shadow width? 585273695[/snapback] You want that with ice cream? :p You basically want a blur on the shadow, no? Edited January 11, 2005 by weenur Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585273880 Share on other sites More sharing options...
0 yyy Posted January 11, 2005 Author Share Posted January 11, 2005 Yes - I'm really sorry that I bother you :blush: :rolleyes: I didn't mean to do it. I was too rude :unsure: it's not urgent so if you have time I'll apprreciate your answer. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585274184 Share on other sites More sharing options...
0 azcodemonkey Posted January 11, 2005 Share Posted January 11, 2005 yyy said: Yes - I'm really sorry that I bother you :blush: :rolleyes: I didn't mean to do it. I was too rude :unsure: it's not urgent so if you have time I'll apprreciate your answer. 585274184[/snapback] No sweat. I'm just giving you grief. ;) I should be able to have an example for you as soon as I get some time. I also need to figure out how to convert a region to a bitmap. <anyone?> Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585275609 Share on other sites More sharing options...
0 yyy Posted January 11, 2005 Author Share Posted January 11, 2005 Actually I've found this: http://www.bobpowell.net/dropshadowtext.htm but it uses another method than yours. Anyway, don't hurry. I'm not sure if I'll use it eventually or not. I'll do another thing instead :) Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585275689 Share on other sites More sharing options...
0 _Pablo Posted January 11, 2005 Share Posted January 11, 2005 weenur said: No sweat. I'm just giving you grief. ;)I should be able to have an example for you as soon as I get some time. I also need to figure out how to convert a region to a bitmap. <anyone?> 585275609[/snapback] A Region of what? Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276058 Share on other sites More sharing options...
0 azcodemonkey Posted January 11, 2005 Share Posted January 11, 2005 I'm converting the GraphicsPath to a Region, and then from a Region to a Bitmap to perform raster operations on it. I see what Bob is doing. That's cool. The guy is a guru. I was actually going to do a gaussian blur on the shadow and make it adjustable. I'm just drawing a blank on how to make a Bitmap from a Region. Region class Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276170 Share on other sites More sharing options...
0 _Pablo Posted January 12, 2005 Share Posted January 12, 2005 weenur said: I'm converting the GraphicsPath to a Region, and then from a Region to a Bitmap to perform raster operations on it. I see what Bob is doing. That's cool. The guy is a guru. I was actually going to do a gaussian blur on the shadow and make it adjustable. I'm just drawing a blank on how to make a Bitmap from a Region.Region class 585276170[/snapback] Yes but a Region is simply that - a region. So to turn it into a Bitmap you need to use the region on a Bitmap e.g. Create a new Bitmap of the appropriate dimensions then use Graphics.FillRegion with a suitable Brush. Or am I missing something? Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276240 Share on other sites More sharing options...
0 azcodemonkey Posted January 12, 2005 Share Posted January 12, 2005 _Pablo said: Yes but a Region is simply that - a region. So to turn it into a Bitmap you need to use the region on a Bitmap e.g. Create a new Bitmap of the appropriate dimensions then use Graphics.FillRegion with a suitable Brush. Or am I missing something? 585276240[/snapback] See... that's what I couldn't remember. :D Thanks. It's been a while since I've done any GDI/+ to any extent. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276814 Share on other sites More sharing options...
0 _Pablo Posted January 12, 2005 Share Posted January 12, 2005 weenur said: See... that's what I couldn't remember. :D Thanks. It's been a while since I've done any GDI/+ to any extent. 585276814[/snapback] Funny...you virtually answered your own question with your previous post when you said "I'm just drawing a blank on how to make a Bitmap from a Region."! :p Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276872 Share on other sites More sharing options...
0 azcodemonkey Posted January 12, 2005 Share Posted January 12, 2005 _Pablo said: Funny...you virtually answered your own question with your previous post when you said "I'm just drawing a blank on how to make a Bitmap from a Region."! :p 585276872[/snapback] lmao! I didn't even catch that. I've been staying up too late playing World of Warcraft. :) Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585276902 Share on other sites More sharing options...
0 azcodemonkey Posted January 12, 2005 Share Posted January 12, 2005 OK, yyy. If this doesn't do it for you, use Bob Powell's version. You can, of course, modify it to your liking, and set it up to be configurable. First, add the Filters.cs file to your project. ( get it here ) <edit> you should dispose of the Regions when you're done, as well as the Bitmap. // In the paint handler Graphics g = e.Graphics; string s = "Outline"; Font font = this.Font; RectangleF rect = this.ClientRectangle; StringFormat format = StringFormat.GenericTypographic; float dpi = g.DpiY; using( GraphicsPath path = GetStringPath(s, dpi, rect, font, format) ) { g.SmoothingMode = SmoothingMode.AntiAlias; RectangleF off = rect; off.Offset( 2, 2 ); Bitmap bmp = null; using( GraphicsPath offPath = GetStringPath(s, dpi, off, font, format) ) { bmp = new Bitmap((int)rect.Width, (int)rect.Height); Graphics g2 = Graphics.FromImage(bmp); g2.CompositingMode = CompositingMode.SourceOver; g2.CompositingQuality = CompositingQuality.HighQuality; g2.SmoothingMode = SmoothingMode.AntiAlias; Brush b = new SolidBrush(Color.FromArgb(200, 0, 0, 0)); Region r = new Region(offPath); Region rxor = new Region(rect); g2.FillRegion(SystemBrushes.Control, rxor); rxor.Xor(r); g2.FillRegion(b, r); BitmapFilter.GaussianBlur(bmp, 4); BitmapFilter.GaussianBlur(bmp, 4); BitmapFilter.GaussianBlur(bmp, 4); BitmapFilter.GaussianBlur(bmp, 4); BitmapFilter.GaussianBlur(bmp, 4); b.Dispose(); g2.Dispose(); } if( bmp != null ) { // draw the image g.DrawImage(bmp, off); } g.FillPath(Brushes.White, path); g.DrawPath(Pens.Black, path); } } Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585277488 Share on other sites More sharing options...
0 yyy Posted January 12, 2005 Author Share Posted January 12, 2005 Thank you very very much Weenur and _Pablo :laugh: I really appreciate yout help :D I'lll try that later. And weenur - sorry again for nagging you :blush: Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585278078 Share on other sites More sharing options...
0 azcodemonkey Posted January 12, 2005 Share Posted January 12, 2005 yyy said: Thank you very very much Weenur and _Pablo :laugh: I really appreciate yout help :D I'lll try that later.And weenur - sorry again for nagging you :blush: 585278078[/snapback] I don't consider it nagging. It's a good way to learn for both of us. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585278305 Share on other sites More sharing options...
0 yyy Posted January 12, 2005 Author Share Posted January 12, 2005 Wow :laugh: it works great :cool: I just have 2 questions: 1. Are you sure that this source code (and the filters.cs file) are free to use and ditrobute ? I need this code for a freeware application which I plan to distrobute freely with the source code so I need to be sure. 2. This is not so important but I was wondering if there's a way to reduce the Memory usage of that code - it raises the application's Memory usage by about 3 MB I think. It's not that bad but I just wonder. Thanks again for helping me :) Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585281590 Share on other sites More sharing options...
0 azcodemonkey Posted January 12, 2005 Share Posted January 12, 2005 1. Ask the author. I'm sure that as long as you give credit where credit is due, you'll be fine. He is posting it for teaching purposes. 2. I'd have to look more closely at his code. I'm fairly certain that he's managed his memory properly. You could try doing a GC.Collect() at the end of the Paint event. I kind of doubt it'll help, but you never know. Is that memory footprint in release mode, or debug? Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585281673 Share on other sites More sharing options...
0 yyy Posted January 12, 2005 Author Share Posted January 12, 2005 weenur said: 1. Ask the author. I'm sure that as long as you give credit where credit is due, you'll be fine. He is posting it for teaching purposes.2. I'd have to look more closely at his code. I'm fairly certain that he's managed his memory properly. You could try doing a GC.Collect() at the end of the Paint event. I kind of doubt it'll help, but you never know. Is that memory footprint in release mode, or debug? 585281673[/snapback] Ok, I'll ask him. You don't need to look at the code - that's Ok. I was just wondering if there's a fast way to do it but you are right - probably the code's writer already thought of the memory issue. It isn't that bad after all. I think it is in the release mode. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585282073 Share on other sites More sharing options...
0 yyy Posted January 13, 2005 Author Share Posted January 13, 2005 I can't ask the "Windows Forms Programming in C#" book's author - I don't have his E-mail and I don't think he'll allow me to use that code since it was written in a book. Nevermind - I'll do something else. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585285520 Share on other sites More sharing options...
0 azcodemonkey Posted January 13, 2005 Share Posted January 13, 2005 yyy said: I can't ask the "Windows Forms Programming in C#" book's author - I don't have his E-mail and I don't think he'll allow me to use that code since it was written in a book. Nevermind - I'll do something else. 585285520[/snapback] Uh... use it. Quote Permission is granted to anyone to use this software for any purpose, including commercial applications, subject to the following restrictions1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is requested, as shown here: Portions copyright ? 2003 Chris Sells (http://www.sellsbrothers.com/). 2. No substantial portion of this source code may be redistributed without the express written permission of the copyright holders, where "substantial" is defined as enough code to be recognizably from this code. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585287226 Share on other sites More sharing options...
0 _Pablo Posted January 13, 2005 Share Posted January 13, 2005 Quote 2. No substantial portion of this source code may be redistributed without the express written permission of the copyright holders, where "substantial" is defined as enough code to be recognizably from this code. It's pretty explicit - if you are going to distribute the source of your project and it contains a "recognisable portion" of the books sample source code, then you will need to obtain permission from Chris Sells. So just drop him a mail at csells@sellsbrothers.com - he may even give you some advice on the memory footprint. Link to comment https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/#findComment-585288266 Share on other sites More sharing options...
Question
yyy
Hello,
I want to draw an outlined text using C#.Net. How can I do it? I think I need to use GDI but how exactly? All I know is how to draw a normal text.
Thanks in advance for your help :)
Link to comment
https://www.neowin.net/forum/topic/269276-c-drawing-outline-text/Share on other sites
32 answers to this question
Recommended Posts