|
I'd like to extend the functionality of drawing.image However when attempting to inherit im told that drawing.image has no constructor defined. How do I go about extending this class? Thanks.
|
|
|
|
|
Image's constructor is internal, so you can't use it from outside of the System.Drawing.dll assembly. Is there a reason why you don't want to derive from the Bitmap class instead? Bitmap has public ctors.
Josh
|
|
|
|
|
You can't derive from Image since it's constructors are internal. You'll have to derive from one of its children, like Bitmap.
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
How does it have childern if its constructors are internal?
Best,
Jun
|
|
|
|
|
It's weird. It's an abstract class (MustInherit for you VB'ers) that you can't inherit from. Yet, Bitmap and Metafile both inherit from it. I can't figure out how they did it. I copied the Bitmap class code method-for-method, property-for-property, using the lastest .NET Reflector and into my own implementation, and still couldn't get it to compile.
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
Bitmap and Metafile can inherit because they are in the same assembly.
|
|
|
|
|
I just remembered that, about 20 minutes after I posted that message. :->
Dave Kreskowiak
Microsoft MVP - Visual Basic
|
|
|
|
|
Ahh, Thanks much every one. I think bitmap can inherit from image because the image constructor is defined as a "friend" of bitmap in the assembly.
-- modified at 14:56 Thursday 29th June, 2006
|
|
|
|
|
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
|
|
|
|