Skip to main content
Email Password   helpLost your password?

(See history for list of changes.) 

HtmlDemo

Introduction

This is a library of 100% managed code that draws beautifully formatted HTML. It comes along with three WinForms controls:

And a static method ready to draw HTML:

Note: The drawing engine is based on the CSS Level 2 specification.

Background

For years, I have been planning for a project like this. I prepared myself quite well. I went through the entire CSS Level 2 specification along with the HTML 4.01 specification.

One of the most interesting things I found is this: Drawing HTML is no more than laying out a bunch of boxes with borders margins and paddings. Once you overpass this paradigm, everything else is to help the code actually place the boxes on the right place, and then paint the string each box contains.

Imagine the power that drawing full-rich-formatted HTML on your controls can give to your applications. Use bold when you need it, italics on every message, and borders and fonts as you may like or need everywhere on the desktop application. One of the first projects where I will use it is on the tooltips of my Ribbon Project.

Although I have not tested it on mono yet, there should be no problem at all, since all of the code in the library is managed code and the methods it uses to paint are quite basic. It draws lines, rectangles, curves and text.

For now, the render looks really nice. Sometimes it can fool you to think you're using a real Web browser, trust me, download the demo, it is just an EXE and a DLL.

Using the Code

The library locates the code under the System.Drawing.Html namespace. The controls that render HTML are under the System.Windows.Forms namespace.

The renderer follows the CSS Box Model. Box model is nothing but a tree of boxes, just as the tree of HTML, each of these boxes is represented by a very used class called CssBox. The start node is represented by the class InitialContainer.

All the known CSS properties apply to each of these boxes. Each box may contain any number of child boxes and just one parent. The only box that has no parent at all is the so called Initial Container.

A typical use of an Initial Container to draw HTML would look like this:

//Create the InitialContainer
InitialContainer c = new InitialContainer("<html>");
 
//Give bounds to the container
c.SetBounds(ClientRectangle);
 
//Measure bounds of each box on the tree
c.MeasureBounds(graphics);

//Paint the HTML document
c.Paint(graphics);

renderer_002.jpg

First a label, then a panel and at last a ToolTip, all of which support HTML rendering.

You may never use it, since I provided controls and methods that create this object for you.

HtmlPanel

A panel that is ready to accept HTML code via its Text property. Its full name is System.Windows.Forms.HtmlPanel.

The only properties you need to know are:

The panel will update the bounds of the elements as you scroll or resize the control.

HtmlLabel

A label that is ready to accept HTML code via its Text property. Its full name is System.Windows.Forms.HtmlLabel.

The only properties you need to know are:

Some interesting things:

HtmlToolTip

Works exactly like the ToolTip you already know, with the little difference that this tooltip will render HTML on it. It's full name is System.Windows.Forms.HtmlToolTip.

There are no properties here to learn. Use it just the way you use the ToolTip that comes with the framework. Internally, it just handles the OwnerDraw event.

Some Features of my Own

I took the liberty of adding a couple of features:

These are achieved through the following CSS properties:

What's Currently Supported by the Renderer?

Points of Interest

What can I say, this is one of the most fun projects I've ever been involved with. And so far, it runs beautifully and checks its original design goals.

I am planning to give it full rendering support, to the day that you may visualize a web page just as a good web browser would; and why not, make a WYSIWYG HTML editor to give amazing HTML editing power to your applications.

I'm also planning to make sure it runs perfectly well on Mono and on Mobile platforms.

In the next few days, I'll publish a list of supported HTML tags and CSS properties.

History

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralNice. What about CF? Pin
walterman
8:32 30 Oct '09  
GeneralQuestion Pin
Tactor
11:13 16 Oct '09  
GeneralNew version? Pin
Ashar Shah
5:18 9 Oct '09  
QuestionMost excelent article!!!!, how can palce input tag??? Pin
rio_p
4:25 7 Oct '09  
GeneralFantastic work, buddy ! Pin
indra.mukherjee
4:56 30 Aug '09  
GeneralGreat work Pin
toddmo
17:49 23 Aug '09  
GeneralFont issues on som OSs (with fix) Pin
Fashtas
21:29 17 Aug '09  
GeneralParagraph align does not work if Paragraph contains multiple Elements Pin
Andreas Stolle
2:32 31 Jul '09  
GeneralAwesome Pin
David Roh
23:28 28 Jul '09  
GeneralLicense? Pin
Cory Crooks
10:48 7 Jul '09  
QuestionProblems with spaces after punctuation and "&nbsp;" [modified] Pin
JPaula
14:03 25 Jun '09  
GeneralFont Size not honoured - trying to fix it [modified] Pin
JPaula
12:01 23 Jun '09  
GeneralBR was not working. Pin
dnaprice
6:41 18 Jun '09  
GeneralSame here Pin
JPaula
15:43 23 Jun '09  
GeneralBR Fixed Pin
Andreas Stolle
2:22 31 Jul '09  
GeneralRe: BR Fixed Pin
Doncp
15:32 14 Oct '09  
GeneralMissing Navigating Event Pin
Jan Prochazka alias jena
0:59 16 May '09  
GeneralRe: Missing Navigating Event Pin
Member 6038196
0:48 22 May '09  
GeneralRe: Missing Navigating Event Pin
Jan Prochazka alias jena
10:00 25 May '09  
QuestionPossible browser? Pin
The Dogcow Farmer
13:54 12 May '09  
GeneralBase64 encoded images support Pin
Fco. Javier Marin
5:44 6 May '09  
GeneralChanges to support Transparency Pin
JoaoGouveia
16:28 24 Apr '09  
GeneralRe: Changes to support Transparency Pin
Jose M. Menendez Poó
16:15 27 Apr '09  
General Not Supported. Pin
Abydosgater
16:23 16 Apr '09  
GeneralSeems nice. <table style="height: 100%"> not being honored Pin
TK_dna
8:38 8 Apr '09  


Last Updated 29 Jan 2009 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009