Handling The Paint Event In The Base And Inherited Forms?
Sep 21, 2010
I have a form called BaseReportForm that handles drawing some stuff to in a panel to create a template for a bunch of reports. The drawing all takes place in the Panel's Paint event and this form will always be inherited. In the inherited forms, I draw the specific details of the report in the inherited form's Panel Paint event. So I am drawing to the same panel from the base form and from the inherited form. It all works fine, but when I try to open the design view for the inherited forms, I get the following error..
Quote:
The event Paint is read-only and cannot be changed.
I'm not sure I am handling my paint events correctly. Is there a different way I should be handling the drawing of these reports?
I have a base form and I inherit other forms from it. However, if i go back and change say the size of the base form, I don't see those changes take effect in my inherited forms. Does anyone know why that is? Is there a solution to this issue?So as far as design is goes, what exactly gets inherited by other forms?
From jmchillihiney's most excellent code bank sumission on Drawing:Quote:The way GDI+ works, controls get repainted on screen over and over again, sometimes many times in quick succession. On each of these occasions the control's Paint event is raised. You need to use the Paint event of the control to perform your own drawing or else, the next time the control is repainted, your drawing will just disappear as the control paints over it.
When you're creating a custom control you should override the OnPaint method and perform your drawing there. When you're designing a form or user control and you want to add custom drawing to a child control you handle that control's Paint event, then perform your drawing in the event handler.
You may have seen, or heard people talk about, controls flickering on screen. That's caused by repainting large areas of the control repeatedly and happens because painting on screen is actually quite a slow process. As such, you should try to do as little of it as possible.So, I am attempting to draw part of a custom control. I have placed a SplitContainer on a UserControl, and oriented it vertically. I then shrunk to top panel to 15 pixels in height. I have two Methods which each draw a different type of Path + fill into the panel, and then draw a border around it (One is a gradient fill, and the other is just a plain color). The idea is that when the user clicks on this panel, it switches from one to the other (a "Selected State" and "Not-Selected" state).
I have also created an icon which looks like the +/- widget on a treeview (or more specifically, on the vs2008 Toolbox, which is essentially what I am trying to emulate here . . .) which toggles as the control is selected/unselected. Not that ultimately, the selected state will change when the user selects OTHER controls, but the Expand/Collapse gizmo will toggle when the user clicks on the panel in question.
Again, check out the vs2008 toolbox. The Group "headers" are what I am after here. Believe it or not, all of this now WORKS (gee me, look what I did!) EXCEPT the initialization. If I "Handle" the paint event of the SplitCOntainer.Panel1 object in any way which prevents the flickering jmc alludes to above, any redrawing required by either initialization OR hiding/unhiding of the host form is prevented. And it seems like the SplitContainer panel is constantly redraing (probably checking to see if the splitter has been moved).
I can post some code, but it is a little confusing, since I am dealing with some semi-complex interaction here. Also, It is not necssecarily structured well ()yet). AFTER I figured out the drawing bits, THEN I was going to try to do some refactoring and restructuring. Code Follows in next post.
I always get this error during the Paint event: System.AccessViolationException was unhandled. The weird thing is that it doesn't happen the first time it goes through.
Here's the code.
Friend CustomFont As Font = GetCustomFont()
Private Function GetCustomFont() As Drawing.Font Try Dim PFC As Drawing.Text.PrivateFontCollection
[CODE]...
Symbols is just a 2 dimensional array of characters.
I am trying to create a form where depending on what the user selects, they are shown a collection of images from the web. Depending on what they select there will be a different amount of images so each picture will need to be added dynamically.
I am able to create PictureBoxes dynamically however I'm stumped how to create event handling in order for each control to give a unique response.This is what I originally tried but I got an error..
Private Sub Form1_Load For i=0 To 10 Dim picBox As PictureBox
[code]....
The error I got was
'AddressOf' operand must be the name of a method (without parentheses)
How ridiculous that you can't include arguments in your AddressOf! Can anyone shed some light on my situation (or knows a better way of carrying out my goal)?
The program below trhows an error in the line "mTable2 = mTable.Copy". The error is: "Unable to cast object of type 'System.Data.DataTable' to type InherintanceQuestion.InheritedTable". This is because mTables is an instance of the InheritedTable class which inherits a DataTable and mTable is a DataTable. So, is there any way I can create the mTable2 to the mTable.copy to the mTable.
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
I have a project that has mainly two objects, both inheriting from a base. Like this:
Public Class Vehicle Property Model As String Property Make As String[code].....
The above function doesn't work because myVehicle is a Vehicle, not a Truck.Is there a way I can pass around a Vehicle type and have the IDE know which type to use? Or am I completely missing a better way to do this?
If I defined a ENUM in a base object with serveral default values. When I inherit from the base object I want to add more options the the ENUM list which are specific to the inheriting object.
For example my base could have a ENUM called Direction with values: None ALL Stop Start
I create a new class call Compass which inherits the base class and what to add the following to the ENUM Direction. I create a new class call Navigation which inherits the base class and what to add the following to the ENUM Direction. So, In my inheriting class haow do I extend the ENUM.
i've finally got round to learning about classes and inheritance, but i'm not sure how to proceed. i have a base class Employee, which is inherited by 2 derived classes. how do i use the same Employee class in both derived classes? obviously if i write a sub new for both of them + declare a new Employee class, they won't be using the same class. heres my Employee class:
In re-engineering a windows forms application, I find that a lot of code-behind in the various form classes is duplicative and I'm trying to centralize as many procedures as possible into a base class which can be inherited and used by the subclassed forms.
This process seems to be going well and is making the code in my subclasses much simpler and hopefully easier to maintain, but I'm not sure where to draw the line between leaving code in the subclasses and engineering for generic resusability and moving it to the base class.
Specifically, in some subclasses I have code which manipulates variables and objects specific to the subclass, and although I could move the code-behind into the base class, the base class code references specific objects which are needed to compile. For example, each subclass manipulates a databound datagridview and form detail controls which allows the user to select between multi-record and detailed single-record views of a datatable.
In Visual Basic 2008 do I need to declare dummy data objects in the base class so that the base class will compile? Or is there a way to indicate that the data objects will be provided by the subclass?
I have admin module. This module have one master page which has the no of panels at left side. I have to make this panels visible and invisible with base control class which is constructed in VB language. I'm working with asp.net 2.0 with c# web site.
how do i construct this base control class and manage panels with Master Page on link button click event.
I would like to build a base class for my SQL Data Access Layer. I have most of it based out, but have a question about how to handle errors within the base class. I have a method for ExecuteNonQuery, ExecuteReader, ect...
I suspect I am being very silly here but I have the following setup
Class MustInherit myBaseClass 'some stuff End Class Class myInheritedClassA
[code]....
Running this results in the following error
Unhandled Exception: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException:
[code]....
is there any way of 'Widening' the inherited class to the base class so this would work?
EDIT:regarding XmlInclude(typeof inheritedClass), currently this method could potentially return a number of types of inherited class (i.e myInheritedClassA and myInheritedClassB) is it case of simply having to add each of the inheritedTypes in this tag?
How can I cause the Paint event to fire from a Form_Click() event? This is what I'm trying to do...
Public Class StrTests01 Private Sub StrTests01_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click Dim ps As Graphics = Me.CreateGraphics()
I understand that inherited classes can't be converted from base classes. But is there any way to write a conversion sub, so that the base class gets assigned to MyBase, then extra properties are added?[code]...
I have alot of experience in working in VBA for excel, but not so much experience in creating my own structures so it's all still a bit foggy. I'm trying to capture the event for when the F1 key is pressed, not just when the form is active, but anytime the program is running. The code below expressing the handling is automatically generated for me in VB Express... But I'd like to change the situation to encompass anytime the program is open. I guess I have to reference events that happen in windows in general, but i don't know how to do it. I think i have to create the even in a class module?
I get this: Base class 'System.Windows.Forms.Panel' specified for class 'MenuButton' cannot be different from the base class 'System.Windows.Forms.UserControl' of one of its other partial types.
The only way I know to force a paint event in my pictureboxes is to do a 'Picturebox1.invalidate'. I read that this isn't the best way to do it though, so what's the best way to make my picture boxes repaint?
Weird issue: I have application that I fire some code in the Form_Paint event for the main form, it works fine on my machine, but on other machines is not working at all.
I tried to debug the code on the other machine, and Form_Paint event is not triggered at all!
I was wondering how i would go about threading a paint event. I know the basic multithreading but i cant figure out how i would go about applying this on a paint event. This is the way i know how to go about multithreading.
however it will draw it behind objects for example if i have a groupbox it will draw(i assume its still drawing at leaste) behind the group box and i cant see it
[url]... I managed to figure out how to paint a bitmap on a form. With some slight modification, I managed to make it so that the position of the bitmap can change based on key strokes.However, for some reason, it only does this once. It can't be that the xPosition and yPosition aren't responding since I rigged two labels to tell me their values and they are changing. So how can I make the bitmap respond.[code]...
I want to create a track bar using paint event, but the problem is on mouse move event<Me.Invalidate()> is very slow since the graphic become unvisible for milli seconds and then return back, is there a way to make it faster?(doesn't become invisible)
correct way to draw rectangles onto a picturebox, and also to explain the paint event more clearly.Basically I have an application where a picturebox contains an image, this image is a small computer monitor as such:
The idea of this part of my application is that the user can draw small window size rectangles which represent windows later on. I have already used some excellent code on this forum to be able to draw the rectangles on the picturebox (As pictured above), the rectangle outline is drawn from MouseDown and MouseUp respectivley.
The problem I am encountering is with the 'repainting' of this rectangle. I have included code to repaint the rectangle in the Paint event of the picturebox. This works when you move the picturebox 'off screen' and bring it back. However when the form is re-sized or other various things occur the rectangle is not re-drawn? even though the picturebox 'appears' to be clean and always there!
My code is below, it is not full and complete, but the few main subs listed should give an indication as to how I am currently creating the rectangle:
Private Sub picboxAdvDisplay_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picboxAdvDisplay.MouseDown 'Set the flag for Drawing enabled
[code]....
1. What is the CORRECT way to draw a rectangle onto a Picturebox?
2. How do you code so that the rectangle is ALWAYS visible/drawn on a form re-size, minimise, window overlap etc etc.
during the development of my project, i've the need to raise the paint event of a form, to make it with rounded angle.The strange thing is that, when i use the invalidate comand on it, the repaint event (that sometimes doesn't go and i don't know why), doesn't make it like i need, that is, the dimension of the side is one instead of six pixel, and the angle are rounded, but the border is not visible.
I've got a bug in my program that I can't work out, during a paint event. The only way I can think to solve it is to watch the screen being updated one thing at a time. Problem is, I've put a break in and then I try stepping through the program one line at a time, but when I go to look at the screen it's blank - probably because I'm in the middle of a paint event? Is there some way that I can get my screen to update after each command?