|
All,
I'm trying to replicate a design of a GUI which has numerous circles scattered across the form to represent the equivalent of an LED status light.
I'm a total noob at C# 2005, but my million dollar question is how can I do this?
|
|
|
|
|
Stuck At Zero wrote: ... million dollar question ...
For a million dollars, there are lots of us here who will do it for you! 
|
|
|
|
|
Start here[^].
Use the best guess
|
|
|
|
|
I'm actually trying to draw permanent circles onto the Form view of the app I'm trying to create to emulate LED status lights.
Is there nothing on the toolbox that I can use to draw circles directly onto the form view?
|
|
|
|
|
Not that I'm aware of, but you could possibly adapt one of the existing tools, or create a custom one of your own. Google for "custom tools" to find some samples and tutorials.
Use the best guess
|
|
|
|
|
I guess my only options may be to see if I can investigate if I can place 40+ buttons onto the form that I can disable but have visible and see if I can make them circular buttons with the ability for me to change the color of the button.
My other way I suppose would be to draw a circle on something like MS Paint and somehow save it with a transparent background. 50+ pictures on a form. The idea would be to either forcibly change the color of the circle on the picture or to use a different picture of the circle of a different color when an event happens. that I can simply change the color of the circle in the picture as needed (or have varying pictures of the same circle).
I actually thought this was going to be rather easy, but it seems making simple shapes on the GUI is not as easy as I had thought for C#.
Am I better off doing this on Visual C++ or Visual Basic?
|
|
|
|
|
Sounds like you're using Windows Forms. If you were to use WPF (Windows Presentation Foundation), then drawing circles and flipping their color would be trivial.
Do you have to use C# 2005? Why don't you move to 2010 or 2012 (even 2008)? You're simply making things harder for yourself with "older" technology.
|
|
|
|
|
I am using C# 2005 because the workgroup I'm in at work uses C# 2005. I would love to use "newer" technology, but the decision is above my paygrade.
I'm not sure what forms I'm using, other than it's what pops up when I try to make a GUI. Is WPF something that came out in a later version?
|
|
|
|
|
Whether you use "Windows Forms" or "WPF" is usually determined when you create a new Visual Studio project: i.e. choosing Console; Windows Forms; WPF; etc. when you create a new project.
WPF has been around for a while, but since I have only been using it from 2008 on, I don't know how 2005 supports it.
Anyway, if you're limited to 2005, create a new project in VS, and if you have the option to create a WPF project, then you're good to go (unless "the powers that be" insist you use only Windows Forms).
|
|
|
|
|
I'm a total newbie when it comes to C#, so I've been trying to wing it with online tutorials on making GUI apps.
Powers that be don't really care HOW I do it. They just want to see a notional version of what they had envisioned.
|
|
|
|
|
Gerry Schmitz wrote: You're simply making things harder for yourself with "older" technology. Not true, there is nothing in this question that cannot be solved quite easily in VS 2005.
Use the best guess
|
|
|
|
|
True. I should have said "generally"; or "moving forward".
I assumed that at some point, he would be doing something other than "drawing circles".
But I could be wrong.
|
|
|
|
|
I don't know how much this software will morph over time, but the only other special thing I will need to look into is a "console" window on one of the tabs of my GUI to take manual commands as things are running.
Outside of that, my best guess is that the "drawing circles" is the only quirky feature I need to have for this GUI that isn't obvious on the standard C# toolbox.
Time will prove me wrong.
|
|
|
|
|
Stuck At Zero wrote: Am I better off doing this on Visual C++ or Visual Basic? Only if you have more experience with either of those languages, although the issue is exactly the same whether you use VB.NET or C#. My original suggestion to use the graphics class is still your best option.
Use the best guess
|
|
|
|
|
Why is that "the best option"? I see no reason why it is better than say WPF. Or flipping picture images as the OP is thinking of.
|
|
|
|
|
Gerry Schmitz wrote: why it is better than say WPF. In the original question the OP states: "I'm a total noob at C# 2005", which suggests that WPF would be an even bigger mountain to climb.
Use the best guess
|
|
|
|
|
You assume too much. If the OP was prepared to use WPF, I would have posted a solution that any "noob" would have understood.
Any solution (in this case) that is at least object-oriented is superior to one that simply "draws".
The OP is creating a UI (not some scribbles); and creating "leds" implies managing "state" (i.e. on/off); image controls (the OP's thinking), "shapes", etc. are a lot more useful in this case than simply "drawing" (as you are suggesting).
|
|
|
|
|
Gerry Schmitz wrote: You assume too much Not at all; if someone states that they are completely new to C# then it's a fair bet that they would not find WPF easy.
Gerry Schmitz wrote: Any solution (in this case) that is at least object-oriented is superior to one that simply "draws". I never claimed that it wasn't.
Gerry Schmitz wrote: more useful in this case than simply "drawing" (as you are suggesting). I made no such suggestion; I merely pointed the OP at the .NET Graphics Class[^] which can be used to draw circles. I left the actual implementation to him/her to figure out.
Use the best guess
|
|
|
|
|
|
I don't know what VisualStudio it came with but there is a VisualBasic PowerPack that added the basic graphics objects to the toolbox for C# WinForm usage.
There's also multiple articles about creating LED controls on this site. Search
If you want to do it yourself, then you need to start looking into UserControls, and basically you create a class inheriting from UserControl and then you override the OnPaint event.
This is the OnPaint I did, its not great but it looks like a little led (with fade from colour to colour) which is all I wanted.
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen borderPen = new Pen(Color.Black);
borderPen.Width = ClientSize.Width <= 16 ? 2 : 4;
if (this.IsError)
{
using (Graphics g = e.Graphics)
{
SolidBrush brushError = new SolidBrush(ColorError);
g.FillEllipse(brushError, 0, 0, ClientSize.Width, ClientSize.Height);
g.DrawEllipse(borderPen, 0, 0, ClientSize.Width, ClientSize.Height);
brushError.Dispose();
}
}
else
{
Pen pen = new Pen(PercentageColor);
SolidBrush brushInside = new SolidBrush(PercentageColor);
int colorStepGradient = 1;
byte colorGradient = 255 / 10;
using (Graphics g = e.Graphics)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
int x = 0, y = 0;
Color origPenColor = pen.Color;
Color origBrushColor = brushInside.Color;
int width = ClientSize.Width, height = ClientSize.Height;
for (; x <= width && y <= height; x += colorStepGradient, y += colorStepGradient, width -= 2 * colorStepGradient, height -= 2 * colorStepGradient)
{
g.DrawEllipse(pen, x, y, width, height);
g.FillEllipse(brushInside, x, y, width, height);
byte newR = pen.Color.R;
byte newG = pen.Color.G;
byte newB = pen.Color.B;
if (pen.Color.R + colorGradient <= 255)
newR = (byte) (pen.Color.R + colorGradient);
if (pen.Color.G + colorGradient <= 255)
newG = (byte) (pen.Color.G + colorGradient);
if (pen.Color.B + colorGradient <= 255)
newB = (byte) (pen.Color.B + colorGradient);
Color newcolor = Color.FromArgb(newR, newG, newB);
pen.Color = newcolor;
brushInside.Color = newcolor;
}
pen.Color = origPenColor;
brushInside.Color = origBrushColor;
g.DrawEllipse(borderPen, 0, 0, ClientSize.Width, ClientSize.Height);
pen.Dispose();
brushInside.Dispose();
}
}
GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);
this.Region = new Region(path);
path.Dispose();
borderPen.Dispose();
}
|
|
|
|
|
I was just about to post that someone at work mentioned to me about the Visual Basic Power Pack. This is exactly what I was looking for.
Thanks so much for posting and walking a mile in my shoes.
I will look into the more specialized LED search you hyperlinked, but I suspect the Power Pack is all that I need.
I definitely want to avoid coding the "LEDs" by hand since I'm dealing with a lot of these things.
Thanks Again!!!
modified 25-Mar-13 16:33pm.
|
|
|
|
|
A custom user control seems a perfect solution then tbh.
You can go the route I took and do it all via code, or you could use the VB PowerPack to draw the circles on the empty canvas it gives you.
|
|
|
|
|
Fisrt let me say I dont have errors and all is working fine, I want to know the best way of doing this... I am consumming a web serving that return string xml...
<pre><api_result><data><credits>33</credits></data><call_result><result>True</result><error /></call_result></api_result>
I want the value "33", have the following and it works fine but wanted to know it's the right way to go...
string sReturnString = WebserviceName.ReturnMyValue(PassingSomeValues);
foreach (char cString in sReturnString.ToCharArray())
{
if (char.IsDigit(cString))
sCredits += cString.ToString();
}
return "Balance: sCredits";
I don't want to save it to a file, but just want to dislapy the value. Any recommnedations?
Thanking you in advance.
Addition: ..
Saving it to an xml file makes it easy to read the creadit element value <credits>33; but I dont want to create any files..
I remain joe!
modified 21-Mar-13 15:33pm.
|
|
|
|
|
- If you don't already have one, add a reference to
System.Xml.Linq ; - Add
using System.Linq; and using System.Xml.Linq; at the top of your code file; - Use:
XElement el = XElement.Parse(sReturnString);
string sCredits = (string)el.Elements("data").Elements("credits").FirstOrDefault();
return "Balance: " + sCredits;
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks, appreciated!
I remain joe!
|
|
|
|