|
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!
|
|
|
|
|
In my opinion this (or using XmlReader directly) is the way to go:
Consistency - the web service uses xml responses because it is a standard with some pros e.g. extensibility and formatting. By not parsing xml according to the standard, you don't get the benefits from the standard.
Performance - XmlElement.parse is built upon XmlReader which is a sequential reader. It is both faster and cheaper in memory than XmlDocument that builds a complete DOM in memory.
Kind Regards,
Keld Ølykke
|
|
|
|
|
@Keld, thanks for the info...
I remain joe!
|
|
|
|
|
I'd use an XmlDocument.
string s = "<api_result><data><credits>33</credits></data><call_result><result>True</result><error /></call_result></api_result>" ;
System.Xml.XmlDocument doc = new System.Xml.XmlDocument() ;
doc.LoadXml ( s ) ;
System.Xml.XmlNode nod = doc.DocumentElement.SelectSingleNode ( "data/credits" ) ;
string v = nod.InnerText ;
|
|
|
|
|
|
Boipelo wrote: I want to know the best way of doing this...
Depends on what "best" means.
But since you are doing nothing but a simple value lookup what you are doing is probably the most performant (although probably not in a significant way.)
There are upside/downsides to ignoring the XML itself. For example if they change element names on the message your code still works. But if they add another element first with a numeric value it doesn't.
Conversely using XML if they change names then the code would fail. But if they add another element it would still work.
|
|
|
|
|
I was also scared of "...if they add another element with a numeric value". I am not seeing them changing the "element name", that wont happen.
Thanks for the comment.
I remain joe!
|
|
|
|
|
Boipelo wrote: I was also scared of "...if they add another element with a numeric value"
but only if it is first.
You can do a indexOf for the element name and then start parsing the numeric.
|
|
|
|
|
I'm trying to add an event handler for form closing event. I'm not very good at doing event handlers. I looked at http://stackoverflow.com/questions/7076751/how-do-i-avoid-validating-cancel-causing-app-exit-to-hang[^], among other places on the internet, but the thread is not getting to my method. It wasn't building until I added the property for FormClosing at the top. Hopefully someone here has an idea why it's not working. Thanks!
public partial class GenericPC : UserControl
{
...
public FormClosingEventHandler Closing { get; set; }
public Control GetPC(<params>)
{
...
this.Closing += new System.Windows.Forms.FormClosingEventHandler(this.updateLogsOnClose);
...
}
private void updateLogsOnClose(object sender, System.ComponentModel.CancelEventArgs e)
{
logCountsToFile(logCountFile);
}
...
}
modified 21-Mar-13 11:28am.
|
|
|
|