nikorba
asked on
Drawing on a panel using solid brush ,,,, overriding onpaint problem
Hello there ,,,, I have made a window application , , , it consists of a panel form , from which
you can create a new mdichild window , inside the mdichild window there is a panel
i can draw inside the panel , but the problem is that when i minimize the child form and maximize it
everything i painted on it dissapears
so what should i write exactly in the onpaint
you can create a new mdichild window , inside the mdichild window there is a panel
i can draw inside the panel , but the problem is that when i minimize the child form and maximize it
everything i painted on it dissapears
so what should i write exactly in the onpaint
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
shouldpaint = false;
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
shouldpaint = true;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (shouldpaint)
{
Graphics graphics = panel1.CreateGraphics();
graphics.FillEllipse(frm.Mybrush,e.X,e.Y,frm.XX,frm.YY);
graphics.Dispose();
}
}
protected override void OnPaint (PaintEventArgs pe)
{
}
ASKER
Hi jaime , thanx for your comment , i know that it's expected behaviour ,,, but i wanna know how i can change it ,, ,
again i tried this but it didnt work
again i tried this but it didnt work
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
xxx = e.X; // just to keep track of the mouse position
yyy = e.Y; //although maybe i can use mouseposition.x
}
protected override void OnPaint (PaintEventArgs pe)
{
if (shouldpaint)
{
Graphics graphics = panel1.CreateGraphics();
graphics.FillEllipse(frm.Mybrush, xxx,yyy, frm.XX, frm.YY);
graphics.Dispose();
}
}
You don't need to create a Graphics object, there is an existing at 'pe' argument:
protected override void OnPaint (PaintEventArgs pe)
{
if (shouldpaint)
{
pe.Graphics.FillEllipse(fr m.Mybrush, xxx,yyy, frm.XX, frm.YY);
}
}
protected override void OnPaint (PaintEventArgs pe)
{
if (shouldpaint)
{
pe.Graphics.FillEllipse(fr
}
}
ASKER
it didnt work :(
OnPaint always work. Unless you have undesired values in your xx, yy variables, Or maybe shouldpaint = false
ASKER
but it didnt :( , , , ,
shouldnt i call the onpaint , from the mouse move event ? ? ? ?
i also tried using the panel1.invalidate to call the onpaint but ,,, nothing's new
SO any Idea?
shouldnt i call the onpaint , from the mouse move event ? ? ? ?
i also tried using the panel1.invalidate to call the onpaint but ,,, nothing's new
SO any Idea?
Oh, I see your problem, just need to force repainting:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
xxx = e.X; // just to keep track of the mouse position
yyy = e.Y; //although maybe i can use mouseposition.x
this.Invalidate(); // or this.Refresh();
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
xxx = e.X; // just to keep track of the mouse position
yyy = e.Y; //although maybe i can use mouseposition.x
this.Invalidate(); // or this.Refresh();
}
ASKER
Hi buddy , again thanx for ur help ,,,
here is the code ,,, what's wrong with it ?
it's not working also
i can paint on the panel but the onpaint event is not working
here is the code ,,, what's wrong with it ?
it's not working also
i can paint on the panel but the onpaint event is not working
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace usingMDI
{
public partial class Panel : Form
{
bool shouldpaint = false;
Form1 frm = (Form1)ActiveForm;
int xxx ;
int yyy ;
public Panel()
{
InitializeComponent();
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
shouldpaint = true;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
xxx = e.X;
yyy = e.Y;
if (shouldpaint)
{
Graphics graphics = panel1.CreateGraphics();
graphics.FillEllipse(frm.Mybrush, e.X, e.Y, frm.XX, frm.YY);
graphics.Dispose();
this.Invalidate();
}
}
protected override void OnPaint (PaintEventArgs pe)
{
if (shouldpaint)
{
pe.Graphics.FillEllipse(frm.Mybrush, xxx,yyy, frm.XX, frm.YY);
}
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
shouldpaint = false;
}
}
}
try with the following:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace usingMDI
{
public partial class Panel : Form
{
bool shouldpaint = false;
// Form1 frm = (Form1)ActiveForm;
Brush myBrush = Brushes.Black;
int xxx ;
int yyy ;
public Panel()
{
InitializeComponent();
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
shouldpaint = true;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
xxx = e.X;
yyy = e.Y;
if (shouldpaint)
this.Invalidate();
}
protected override void OnPaint (PaintEventArgs e)
{
if (shouldpaint)
{
e.Graphics.FillEllipse(this.Mybrush, xxx,yyy, 10, 10); // frm.XX, frm.YY);
}
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
shouldpaint = false;
}
}
}
ASKER
I tried it ,,, i couldnt even paint , , , on the panel.
does any ellipse appears on your form?
are you event methods really tied to your events?
are you event methods really tied to your events?
ASKER
Hi , i saw the tutorial application and it was disappointing that the programmer has declared more than 1000 rectangle in order to fit the paint on a form ,,,, check it out ,
i dont wanna declare hundreds of recrangles inorder to be able to paint on the panel ,,,,
i know that i gotta use the paint method , and i know that it works painting a square or rectangle or fixed shape and i know how !, ,, , , , but i dont know how to use it for hand painting using a mouse move :S
i dont wanna declare hundreds of recrangles inorder to be able to paint on the panel ,,,,
i know that i gotta use the paint method , and i know that it works painting a square or rectangle or fixed shape and i know how !, ,, , , , but i dont know how to use it for hand painting using a mouse move :S
I think you still don't understand the painting paradigm. it is basically vector oriented, so real paint is not stored on memory, but it repaints all the drawing everytime onPaint is invoked. That's why painting is saved into several rectangles.
Another alternative is to paint into a bitmap, not to screen, with every mouse action, then at onPaint event, just show the bitmap everytime it is required. This approach is used by photo-retouching-like software.
So your best chance is to look into such kind of code sample.
Another alternative is to paint into a bitmap, not to screen, with every mouse action, then at onPaint event, just show the bitmap everytime it is required. This approach is used by photo-retouching-like software.
So your best chance is to look into such kind of code sample.
ASKER
my sage brother , im not solving a home work , , , would you please lead me to a sample or give me a solution to this problem ,,,
because saving in rectangles didnt suit me best!!
Again thank you
because saving in rectangles didnt suit me best!!
Again thank you
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
That's why you have to put your paint operations at the OnPaint event to repaint it every time it is needed.