|
Thanks Luc! I'm forming the opinion that you don't sleep much 'cause you're replies on here are legion!
Your idea, btw, looks perfect - it's workable and solves a lot of manual work in a very neat way!
It requires me to manage rows, etc. when resizing the GUI (people will 'expect' items to consume rows 2, 3, etc. automatically) but this is no big deal. When I want to deal with panning the row(s), I'll talk to the Windows message queue and post scroll events now I have the scroll bars for 'free'
Thanks again, Sir!
Dave
p.s. PictureBox? Nah, I'll drop it: I mentioned it simply to identify I had an image & to give readers a sense of what I want to present. Naturally, I will paint to the panel: as you say, there's no need for the PictureBox in your solution (I've got to render a thumbnail anyway - what does it matter where I eventually paint it?!)
|
|
|
|
|
You're welcome.
FWIW: reading all of MSDN and replying a couple of messages is more relaxing than a night's sleep.
|
|
|
|
|
Hi guys : I try to do the same functionality, i have a list of icons (toolbar), i want to scrool it with a finger swipe over a touch screen,
how is the best way to do this over a .net in compact framework ?
Have you a sample code to do that ?
Best Regards Paolo
|
|
|
|
|
I don't know. Probably in the same way. And no, no sample code.
|
|
|
|
|
I have a short program to draw a line and rectangle with the mouse. I am new to C# and am having trouble continuing this code to draw an ellipse(perhaps bounded by rectangle).
public void OnMouseMove_Handler(Object sender, MousEventArgs e)
{ if (e.Button == MouseButtons.Left)
{ Form CurrentForm = (Form)sender;
if (SelectedShape == "Line")
ControlPaint.DrawReversibleLine (CurrentForm.PointToScreen(StartPoint),
CurrentForm.PointToScreen(EndPoint), Color.Black);
EndPoint = new Point(e.X, e.Y);
ControlPaint.DrawReversibleLine(CurrentForm.PointToScreen(EndPoint), Color.Black);
}
Then I use an "else if" to do the same for the rectangle. I just cannot seem to get this to work for an ellipse. I know that I must construct rectangle and pass to Draw Ellipse method. Just cannot get it to work.
|
|
|
|
|
Please give specifics. "Cannot get it to work" doesn't clue us in to what the problem is.
|
|
|
|
|
|
Can you show the exact code that is supposed to draw the ellipse?
|
|
|
|
|
I tried the same as rectangle which works OK.
else if (SelectedShape == "Ellipse")
{ ControlPaint.DrawReversibleFrame(CurrentForm.EllipseToScreen(SelectionEllipse), Color.Black, FrameStyle.Dashed);
SelectionEllipse.width = e.x-SelectedEllipse.x;
SelectionEllipse.height = e.y-SelectedEllipse.y;
ControlPaint.DrawReversibleFrame(CurrentForm.EllipseToScreen(SelectionEllipse), Color.Black, FrameStyle.Dashed);
private void EllipseButton_Click(object sender, EventArgs e)
{ SelectedShape = "Ellipse"; }
I am trying to draw with the mouse event; works OK for line and rectangle. I probably am missing how to send to graphics as ellipse. Just cannot find the info on MSDN or here.
Thanks
|
|
|
|
|
I think you're going about it the wrong way.
Try this code:
(this would be your form)
System.Drawing.Graphics graphics = this.CreateGraphics();
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(
100, 100, 200, 200);
graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
|
|
|
|
|
Thank you, I will give it a try. It appears that the coordinates eare entered by the person doing the code. I am trying to draw this with the mouse and reversible frame. But, I will try. Thanks
|
|
|
|
|
Are you trying to do a rubber-banding effect?
There are a few articles here on Code Project that describe good ways to accomplish that.
|
|
|
|
|
I tried googling "EllipseToScreen" and couldn't find it anywhere.
Where did you find that method?
|
|
|
|
|
Thanks for the info about rubberbanding; I will try to find these articles. The Ellipse to screen I tried did not work. I got this info from a book VisualC# 2005 Express edition by Aneesha Bakharia. It works great for the Line or Rectangle. I just cannot get it to work on the Ellipse. Here is what I did for the Rectangle.
public partial class Form1 : Form
{
//Create variables to store rectangle object
Rectangle SelectionRectangle = new Rectangle();
Point StartPoint = new Point();
Point EndPoint = new Point();
string SelectedShape = "Rectangle";
public void OnMouseDown_Handler(Object sender, MouseEventArgs e)
{
//mousedown can capture start coordinates and reset rectangle
SelectionRectangle.Width = 0;
SelectionRectangle.Height = 0;
SelectionRectangle.X = e.X;
SelectionRectangle.Y = e.Y;
StartPoint.X = e.X;
StartPoint.Y = e.Y;
EndPoint = StartPoint;
}
else if (SelectedShape == "Rectangle") //This is during mouse move
{
ControlPaint.DrawReversibleFrame(CurrentForm.RectangleToScreen(SelectionRectangle),
Color.Black, FrameStyle.Dashed);
SelectionRectangle.Width = e.X - SelectionRectangle.X;
SelectionRectangle.Height = e.Y - SelectionRectangle.Y;
ControlPaint.DrawReversibleFrame(CurrentForm.RectangleToScreen(SelectionRectangle),
Color.Black, FrameStyle.Dashed);
else if (SelectedShape == "Rectangle") //This is during mouse up
{
ControlPaint.DrawReversibleFrame(CurrentForm.RectangleToScreen(SelectionRectangle),
Color.Black, FrameStyle.Dashed);
g.DrawRectangle(pen, SelectionRectangle);
}
g.Dispose();
|
|
|
|
|
The code you have posted is difficult to read. If you use the proper formatting to make it more readable you may receive more help.
Look for "code block" on the toolbar above the textbox you entered you're question and use it. Also, read the forum guideleines at the top. "Ellipse" is not a very descriptive subject.
I know the language. I've read a book. - _Madmatt
|
|
|
|
|
Sorry New to codeproject and C#. Got a couple books and self-teaching. I will review the codeproject info.
|
|
|
|
|
Hi Friend!
Are you trying to draw an ellipse like this ?
public partial class Form1 : Form
{
Rectangle SelectionRectangle = new Rectangle();
string SelectedShape = "None";
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (SelectedShape == "Ellipse")
{
SelectionRectangle.Width = 0;
SelectionRectangle.Height = 0;
SelectionRectangle.X = e.X;
SelectionRectangle.Y = e.Y;
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
SelectionRectangle.Width = e.X - SelectionRectangle.Left;
SelectionRectangle.Height = e.Y - SelectionRectangle.Top;
Invalidate();
Update();
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
if (SelectedShape == "Ellipse")
{
SelectionRectangle.Width = e.X - SelectionRectangle.Left;
SelectionRectangle.Height = e.Y - SelectionRectangle.Top;
Invalidate();
Update();
}
}
private void button2_Click(object sender, EventArgs e)
{
SelectedShape = "Ellipse";
}
private void button1_Click(object sender, EventArgs e)
{
SelectedShape = "None";
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
if ((SelectedShape == "Ellipse") && (SelectionRectangle != null))
{
Graphics g = e.Graphics;
g.DrawEllipse(Pens.Black, SelectionRectangle);
g.DrawRectangle(Pens.Gray, SelectionRectangle);
}
}
|
|
|
|
|
Lamrin Thank you, I will try this. I did something similar; but, with draw reversible frame. It
just kept drawing a rectangle. In your code, you refer to button 1 and 2. Are these the mouse clicks
or a button on the tool strip bar? Told you I was new to this.
|
|
|
|
|
Lamrin Thanks I tried something similar with draw reversible frame. It did not work; kept drawing a rectangle. I will try the version you supplied. When you show button 1 and 2 click; are these the mouse clicks? Prior to these click events, you show mouse down, move and up.
|
|
|
|
|
Hi Wayne Macdaid,
I think I need to give a little more explanation for my code. And I am sorry that I omitted to mention that you need to drag and drop two buttons on the form! Any way, here is a more detailed explanation of the code:
First create a 'Windows application' project (not console application) in Visual Studio (VS).
By default, you will have one blank form open in VS. Drag and drop two buttons. Name the first button "None" and the second "Ellipse". Now clicking the button1 sets the variable 'SelectedShape' to "None". So the application stops drawing ellipses. When you click button2 it sets the variable 'SelectedShape' to "Ellipse" and the application now starts drawing the ellipse whenever you start clicking and dragging on the form. In short, these buttons switch 'On' and switch 'Off' the drawing of the ellipse. By default, the variable 'SelectedShape' is set to 'None' at the time of initialisation of the application.
Now about the events.
We want to draw an ellipse only when 'SelectedShape' is set to 'Ellipse'. So when you press the mouse button down (see code Form1_MouseDown event)we check whether 'SelectedShape' has been set to "Ellipse". If so we store the X,Y co-ordinates from the mouse event as the top-left co-ords. of the SelectionRectangle.
After you press the left mouse button down, you have to drag the mouse to draw the ellipse ( and also, if needed, the bounding rectangle i.e. SelectionRectangle). When you move the mouse over the form, Windows generates 'MouseMove' events. So we have to handle this event when the mouse moves. We do this inside 'Form1_MouseMove'. Here, we first check if the left mouse button is still down. (Otherwise, the mouse button has been released). If so, we calculate the width and height of the SelectionRectangle using the the top-left co-ords. of the SelectionRectangle and the current mouse pointer position. Now one important point to note here is that we want to show a 'rubberbanding' effect in drawing the rectangle and ellipse. This will actually be done by the 'Form1_Paint' event. Since any changes in the size of the SelectionRectangle should be reflected on the Form immediately. So we first 'Invalidate' the form and then call 'Update' method. This will cause the 'Form1_Paint' event to be executed immediately.
Inside the 'Form1_Paint' event, we first check to see if the 'SelectedShape' is "Ellipse". If it is so, we proceed to draw the rectangle and the ellipse.
When we finish drawing the ellipse and releases the mouse button, we just store the re-calculated width and height of the 'SelectionRectangle' and again call 'Invalidate' and 'Update' and exit.
One important thing to note while doing graphics under Windows is that, Windows re-draws the contents of a window every now and then. i.e. when it is minimized, maximized, moved, is overlapped by any window or part of it etc. When redrawing it clears everything on its surface first. So what has been drawn outside of the window's 'OnPaint' event gets erased. So all drawing should be done inside the 'Paint' event. This is one major error committed by beginners to graphics under Windows.
Hope this clears your doubts.
Happy coding,
Lamrin
|
|
|
|
|
Thank you Lamrin - I will give this a try.
|
|
|
|
|
Lamrin
Instead of dragging two buttons; can I just put them on the toolbar. I would like to use button2 to also click button1 when clicked. Is this possible?
|
|
|
|
|
Hi,
Instead of dragging two buttons onto the form, you can very well use two buttons on the toolbar.Or even create a 'toolbox' like the one you find in the 'MS Paint' software. I dragged and dropped two buttons (as example) onto the form just to demonstrate how to draw an ellipse interactively!
But why do you want to click button titled 'Ellipse' when you click button titled 'None' automatically? My code is just a demonstration. The reason why I used two buttons are these :
1) There may be times when you don't want your program to draw an ellipse when the left mouse button is pressed and dragged on the form. So how to indicate to the program that you want to stop drawing ellipse? Set the variable 'SelectedShape' to 'None'.
2) Later when you want to again start drawing an ellipse, you click second button titled 'Ellipse' to save 'SelectedShape' to 'Ellipse'. The program now knows that it has to draw an ellipse whenever you press the left mouse button down and drag the mouse. How ? Because, the variable 'SelectedShape' now hold the value 'Ellipse'.
The purpose of the buttons is therefore to set a value for the 'SelectedShape' variable. The value set in this variable will be used by the code in the 'Paint' event to either draw an ellipse (if the varilable is set to 'Ellipse') or not to draw anything ( if the variable is set to 'None'). It is just my logic. You can design your own!
Now, if you want to click 'None' button automatically when you click the 'ellipse' button what do you expect the program to do ? To draw an ellipse or not ?
It may be possible to automatically click button 'None' when button 'Ellipse' is also clicked. But in this case it does not seem to logical as these two buttons do two opposite things!
|
|
|
|
|
Thanks Lamrin I understand now why there are two buttons. It seems to work OK. I do have a couple bugs to iron out. The application I did draws a line or rectangle with reversible frame. I have a button for either on the toolbar. It works well. Also on the menu under file is "New" and "Exit". The new button clears what is drawn on the form and exit closes the form. If I want to do the ellipse, I press the none button and then the ellipse button; I see the rectangle drawn; but, the ellipse doesn't show until I hit the New button? Then it does not clear the form until I hit None, then New. Just some bugs to work out.
I'll keep working on it. I then have to figure out where I can get info on adding a color button so the user can fill the drawn object with a color. I have a button "Color" where a drop down palette appears. The problems with this is that the palette eliminates anything drawn that it covers when it drops down. Also, it doesn't transfer color to the drawn item. I can get it to change the color of the button. Is there a section in MSDN to find this type of code? Thank you again for the information.
|
|
|
|
|
Hi Wayne Macdaid,
The reason why your drop down pallete wipes whatever was drawn previously when it drops down is due to the peculiarity of GUI system of Windows.
As your probably know, though you create your form with all the controls in C# (or any in any language with GUI features), it the Windows operating system which actually draws everything in the background.
You know that Windows can open multiple windows on our screen. When you click any window, it becomes activated and comes to the forefront and whatever was in the front goes back. Actually there are no layers on a computer screen. But Windows only visually simulates. How ? Windows redraws the currently activated windows over whatever is on the screen thus overlapping whatever was on the screen. Now you can see this window above all other windows. When you move any window (let us call it Window1) over another (let us call it Window2), the Window1 is redrawn over the Window2 and some part of the Window2 get erased. But if you click any visible part of Window2 again, it becomes active and Windows OS redraws Window2 completely so that all parts of it is fully visible. Thus the Windows Operating System frequently redraws either completely or some part of each window as appropriate.
Now, in your case you draw something on your form (I presume). Then when pull down your drop down palette, Windows OS actually redraws the pallete in a bigger size (as specified by you) and thus some part of your form is erased. Now when you minimize your palette after choosing your color, the area previosly erased has to be redrawn by Windows OS. But Windows OS has nothing to remember what was in that space earlier. So it just paints the background color. In effect, what was there before you pulled the palette down is erased!
How can you prevent it ? I don't know what type of software you are writing. But suppose it is something like MS Paint, then whenever your draw any shape, save its details into a suitable data structure. Then, in the paint event of the form, read that details of each shape in the data structure and redraw it again. This way your drawings won't seem to disappear. For example, create a class in C# as follows :
public class Shape<br />
{<br />
String ShapeName ;
}<br />
<br />
public class Line : Shape<br />
{<br />
Point StartPoint;<br />
Point EndPoint;<br />
<br />
public Line() : base()<br />
{<br />
ShapeName = "Line";<br />
.<br />
.<br />
.<br />
}<br />
}<br />
<br />
public class Circle : Shape<br />
{<br />
Point Centre;<br />
int Radius;<br />
<br />
public Circle()<br />
{<br />
ShapeName = "Circle";<br />
Radius = 0;<br />
Centre = new Point(0,0);
}<br />
}<br />
<br />
ArrayList ShapeList = new ArrayList();
Now add all shapes to the ShapeList whenever you create a shape. In 'Paint' event of the form (or any other control you are using), use the details of each shape in the ShapeList to redraw the shapes. That's all.
Well, I don't remember any section in MSDN suitable for you. But do a 'Google' search.
Happy coding!
|
|
|
|
|