Archives for: October 2005, 06
06/10/05
Electric Editing makes The Daily Grind
Just bragging :-) Here it is: The Daily Grind 725
If you haven't seen my Electric Editing plugin, look here.
Update: I just noticed that Jim Holmes also wrote a report about it on Visual Studio Hacks.
Horizontal lines
Just saw this post in a newsgroup about how to show the horizontal lines that Microsoft likes to use in their dialogs. A lot of people replied with ideas of using other controls, like panels, to achieve the desired effect - to me, a much simpler and more effective idea is to just create a control myself.
So, the specific style described by the OP seems to be this:

This is what you get by using a label set to a height of 2 and with a BorderStyle of Fixed3D. The OP said explicitely that this was what he wanted, which I find curious because the lines in my Word Options dialog, for instance, look quite different:

So, to account for both needs, I included the etched border as well as the single line border in my sample. I'm sure there are millions of other line styles out there, but these should be simple to include once the framework is there. Here's the control source code:
public enum HLineType {
Etched,
Single
}
public class HorizontalLine : Control {
public HorizontalLine( ) {
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.FixedHeight |
ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |
ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
lineType = HLineType.Etched;
}
public override System.Drawing.Size GetPreferredSize(Size proposedSize) {
if (proposedSize == Size.Empty)
return new Size(150, 10);
return proposedSize;
}
private HLineType lineType;
[DefaultValue(HLineType.Etched)]
public HLineType LineType {
get {
return lineType;
}
set {
if (lineType != value) {
lineType = value;
CreatePen( );
Invalidate( );
}
}
}
public override Color ForeColor {
get {
return base.ForeColor;
}
set {
base.ForeColor = value;
CreatePen();
}
}
Pen pen;
void CreatePen( ) {
if (pen != null) {
pen.Dispose( );
pen = null;
}
if (lineType == HLineType.Single)
pen = new Pen(ForeColor);
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
switch (lineType) {
case HLineType.Etched:
ControlPaint.DrawBorder3D(e.Graphics, ClientRectangle,
Border3DStyle.Etched, Border3DSide.Top);
break;
case HLineType.Single:
e.Graphics.DrawLine(pen, 0, 0, Width - 1, 0);
break;
}
}
}
This was done in VS 2005 beta 2. You might have to make minor changes for .NET 1 if needed - I'm not 100% sure about the flags in the SetStyle call, look them up if you need to.


