|
Can we do the same so that we can derive from Image too?
Best,
Jun
|
|
|
|
|
I suppose so. If you could manipulate the image class assembly and name the new image class as a friend it should work. Here is an MSDN article on friend assemblies in c#. Your are effectively exposing the internals of the image class to an outside assembly or class. That is what is happening with the bitmap class.
http://msdn2.microsoft.com/en-us/library/0tke9fxk.aspx
|
|
|
|
|
Bitmap can inherit from Image because it resides inside the same assembly. The only way you're going to get a class of your own creation to inherit from Image is if it was also inside the same assembly (System.Drawing). The problem is, unless you rewrite everything in the System.Drawing assembly and create your own drop-in replacement, you CAN'T add to the assembly!
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
Hmm, well it seems i can do everything i need to do with the bitmap class. Thanks any way.
|
|
|
|
|
Hello!
I´m trying to use Directory.Delete(path) but VS2005 says it´s not empty?!
I want to delete it anyway =/
Thanks
-- modified at 11:25 Thursday 29th June, 2006
|
|
|
|
|
suguimoto wrote: I want to delete it anyway =/
Use Directory.Delete(path,true);
-- modified at 11:27 Thursday 29th June, 2006
|
|
|
|
|
oh Thanks!!!
sorry for this newbie question
|
|
|
|
|
What does it really mean when overriding the OnPaint event? example if possible.
thank you
Donkaiser
|
|
|
|
|
That doesn't mean anything really. You can't override an event. You can, however, override a virtual method, such as Control.OnPaint(EventArgs). Overriding a method means that when the base implementation of OnPaint is invoked (the base, in this case, meaning Control.OnPaint) the overridden implementation is invoked. The method call "slides down" the class hierarchy and calls the most derived class's override of the method (unless the method is sealed with the 'sealed' modifier, but forget about that for now).
Josh
|
|
|
|
|
I want to use OnPaint to keep updating my drawings which mean i need to raise OnPaint event whenever i want to. so how can i raise an event?
Donkaiser
|
|
|
|
|
You could raise the paint event yourself, but that is not recommended. Just invalidate the control using the Invalidate method, and it will be redrawn.
---
b { font-weight: normal; }
|
|
|
|
|
How is that possible?
|
|
|
|
|
Call Control.Invalidate() . This will invalidate the entire region of the control and force a WM_PAINT message to be sent to the control's window. This message is what triggers the OnPaint event.
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
Sorry missunderstanding,
I was wondering about...
" You could raise the paint event yourself, but that is not recommended. "
How can you do that?
Thanks for more Info,
Martin
-- modified at 15:15 Thursday 29th June, 2006
|
|
|
|
|
Simply call Invalidate anywhere else in the control's code, except inside the Paint handler.
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
Sorry again,
You can really believe me when I'm saiing that I understand the Invalidate Method.
What I did not understand is what Guffa said before.
But maybe, my C# is better than my english.
Thank again,
Martin
|
|
|
|
|
What he means is that you should NOT call the Paint method directly. If you do, you can have very unexpected and strange results. You should only be painting the control when Windows expects you to. When it wants you to repaint, it'll send the WM_PAINT message to your control, thereby firing the Paint event.
When you call Invalidate, your telling the control to invalidate its client area. You haven't actually fired the Paint event. The control will let Windows know that it has to repaint itself. Windows will then figure out when it is safe for you to repaint your window and send back the paint message when it is appropriate for you to repaint.
Dave Kreskowiak
Microsoft MVP - Visual Basic
-- modified at 19:17 Thursday 29th June, 2006
|
|
|
|
|
Ohhhhhhhhhhhhhhhhhh,
You mean "this.OnPaint(....)";
But its the first time we are speaking of a method.
"What he means is that you should NOT call the Paint method directly"
Now I got it.
Thank you so much for your time Dave.
Martin
|
|
|
|
|
It's not possible to raise the OnPaint event. (You can't raise any event outside yours)
What you need ist the .Refresh Method.
This causes a Paint Event of Controls.
That means:
yourform or yourcontrol.Refresh();
All the best,
Martin
|
|
|
|
|
yes i main concern is flikering because at every update of my drawing the whole thing got redrawn.
panel.invalidate() and panel.refresh() fliker the screen. Is there a solution for that of by the way im developing in the CF 2.0. so possibilities are very limited.
Donkaiser
|
|
|
|
|
First make shure, that you do not invalidate or refresh in the OnPaint Event. (would make it recursive, I think)
here is what the designer makes:
this.SuspendLayout();
//code
this.ResumeLayout(false);
All the best,
Martin
|
|
|
|
|
you can also override the PaintBackground.
But the problem is because you see the client area when it redraws. You should create an off screen buffer. write to it, then write to the client after its all done. then you wont see any flicker.
WinForms is not a very good graphical program. And this is very complicated. I recommend an MFC book to fully understand how to control painting.
Although a method may exist to limit the flickering. I dont know of one and I use API's to contol that. But, a little flicker is okay for a business program.
Nick
1 line of code equals many bugs. So don't write any!!
|
|
|
|
|
Actually, if you set the style of the control to OptimizedDoubleBuffer it will handle all of the double buffer work for you. That is if you are using VS 2005
|
|
|
|
|
In order to reduce flickering you may have to use a technique which is commonly reffered to double-buffering. What that means is that you create graphics context in the background and draw there. When you're done, you 'swap' the two graphics contexts. What that means is that you basically copy the back buffer graphics context's contents to the active graphics context.
A quick search for double buffering will most likely give you all the information that you need.
----
www.digitalGetto.com
|
|
|
|
|
I try to implement double buffer but i can't get the handle of the SetStyle method
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
VS2005 give me the error saying that SetStyle and ControlStyles is not contained in the definition of the form.
how can i get the handle on this function to use on a panel to prevent flickering?
Donkaiser
Donkaiser
|
|
|
|