Grouping Graphics Together

vendiddy

Well-known member
Joined
May 14, 2006
Messages
64
Programming Experience
1-3
I am trying to make a program in which you click on the form to place graphical objects. Each graphical object will consist of a group of graphics.

For example, if I had a graphics object which was a table, it would consist of strings that make up the data and the lines which make up the boxes. If I had a graphics object which was a clock, it would be a circle, two lines, and the strings "1", "2", ..., "12".

Does anyone have advice on how a bunch of graphics which constitute one object (such as the clock) in one class/object? Going along with my example, I just want to be able to declare an instance of a clock and paint it on the form. Also, I want to be able to add some interactive functionality such as drag+drop and clocking.

Hope I made my problem clear. Thanks. :)
 
Methods is a way to group several instructions that together does a task, this could be sub methods and function methods. Classes is a way to group related methods and fields/properties that together makes a object definition. Further is Namespaces used to group several related classes etc. Look to how the Framework is organized for namespaces, classes and class members. You decide if your groups fits to one or more methods and if they should group to a class.

Your method/class needs the graphics instance used to paint through, usually some other objects Paint event provide this, and also usually the limiting rectangle bounds. If these requirements sound familiar you're right, it is basically what a Paint event handler method is given by the 'e' PaintEventArgs parameter. So you could define your painting method with same signature as the Paint handler and add your method to the objects Paint event subscription list, which means your method would be called every time the Object raised the Paint event. Or just call the method from Paint handler passing necessary info to be sure of the calling sequence when many painting methods should be done in specific order.
 
Okay, thanks. Is this a good approach?

VB.NET:
[SIZE=2][COLOR=#0000ff][COLOR=blue][FONT=Courier New]Imports[/FONT][/COLOR][FONT=Courier New][COLOR=#000000] [COLOR=black]System[/COLOR].[COLOR=black]Drawing[/COLOR].[COLOR=black]Drawing2D[/COLOR][/COLOR][/FONT][/COLOR][/SIZE]
[COLOR=#0000ff][SIZE=2][COLOR=blue][FONT=Courier New]Public [/FONT][/COLOR][FONT=Courier New][COLOR=blue]Class[/COLOR][COLOR=#000000] [COLOR=black]Atom[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Public[/COLOR][COLOR=#000000] [COLOR=black]Node[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]GraphicsPath[/COLOR][/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]S[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]String[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Private [/COLOR][COLOR=blue]Shared[/COLOR][COLOR=#000000] [COLOR=black]GeneralSymbols[/COLOR]() [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]String[/COLOR][COLOR=#000000] = {[/COLOR][COLOR=maroon]"A"[/COLOR][COLOR=#000000], [/COLOR][COLOR=maroon]"B"[/COLOR][COLOR=#000000], [/COLOR][COLOR=maroon]"C"[/COLOR][COLOR=#000000], [/COLOR][COLOR=maroon]"D"[/COLOR][COLOR=#000000]}[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Private [/COLOR][COLOR=blue]Const[/COLOR][COLOR=#000000] [COLOR=black]Size[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Single[/COLOR][COLOR=#000000] = 20[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]SymbolIndex[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000] = -1[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]X[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000], [COLOR=black]Y[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]SF[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]StringFormat[/COLOR][/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]_IsSelected[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Boolean[/COLOR][COLOR=#000000] = [/COLOR][COLOR=blue]False[/COLOR][/FONT][/SIZE]
 
 
[SIZE=2][FONT=Courier New][COLOR=blue]Sub [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]x[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000], [/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]y[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].new([COLOR=black]GeneralSymbols[/COLOR](0), [COLOR=black]x[/COLOR], [COLOR=black]y[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Sub [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]Symbol[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]String[/COLOR][COLOR=#000000], [/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]x[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000], [/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]y[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].[COLOR=black]X[/COLOR] = [COLOR=black]x[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].[COLOR=black]Y[/COLOR] = [COLOR=black]y[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].[COLOR=black]S[/COLOR] = [COLOR=black]Symbol[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]Node[/COLOR] = [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000] [COLOR=black]GraphicsPath[/COLOR][/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]SF[/COLOR] = [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000] [COLOR=black]StringFormat[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]SF[/COLOR].[COLOR=black]Alignment[/COLOR] = [COLOR=black]StringAlignment[/COLOR].[COLOR=black]Center[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]SF[/COLOR].[COLOR=black]LineAlignment[/COLOR] = [COLOR=black]StringAlignment[/COLOR].[COLOR=black]Center[/COLOR][/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]UpdateGraphics[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
 
 
[SIZE=2][FONT=Courier New][COLOR=blue]Public [/COLOR][COLOR=blue]ReadOnly [/COLOR][COLOR=blue]Property[/COLOR][COLOR=#000000] [COLOR=black]GraphicsData[/COLOR]() [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]GraphicsPath[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Get[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Return[/COLOR][COLOR=#000000] [COLOR=black]Node[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Get[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Property[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=blue]Sub[/COLOR][COLOR=#000000] [COLOR=black]UpdateGraphics[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]Node[/COLOR].[COLOR=black]Reset[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]Node[/COLOR].[COLOR=black]AddEllipse[/COLOR]([COLOR=black]X[/COLOR] - [COLOR=black]Size[/COLOR] / 2, [COLOR=black]Y[/COLOR] - [COLOR=black]Size[/COLOR] / 2, [COLOR=black]Size[/COLOR], [COLOR=black]Size[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
 
 
[SIZE=2][FONT=Courier New][COLOR=blue]Public[/COLOR][COLOR=blue]Sub[/COLOR][COLOR=#000000] [COLOR=black]Move[/COLOR]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]x[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000], [/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]y[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].[COLOR=black]X[/COLOR] = [COLOR=black]x[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Me[/COLOR][COLOR=#000000].[COLOR=black]Y[/COLOR] = [COLOR=black]y[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]UpdateGraphics[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
 
 
[SIZE=2][FONT=Courier New][COLOR=blue]Public [/COLOR][COLOR=blue]Function[/COLOR][COLOR=#000000] [COLOR=black]ISaHit[/COLOR]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]x[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000], [/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]y[/COLOR] [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Integer[/COLOR][COLOR=#000000]) [/COLOR][COLOR=blue]As [/COLOR][COLOR=blue]Boolean[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Return[/COLOR][COLOR=#000000] [COLOR=black]Node[/COLOR].[COLOR=black]IsVisible[/COLOR]([COLOR=black]x[/COLOR], [COLOR=black]y[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Function[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Public[/COLOR][COLOR=blue]Property[/COLOR][COLOR=#000000] [COLOR=black]IsSelected[/COLOR]() [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Boolean[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Get[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Return[/COLOR][COLOR=#000000] [COLOR=black]_IsSelected[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Get[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Set[/COLOR][COLOR=#000000]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]value[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=blue]Boolean[/COLOR][COLOR=#000000])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000][COLOR=black]    _IsSelected[/COLOR] = [COLOR=black]value[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]If[/COLOR][COLOR=#000000] [COLOR=black]_IsSelected[/COLOR] [/COLOR][COLOR=blue]Then[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]            [COLOR=black]     MyBrush[/COLOR] = [COLOR=black]Brushes[/COLOR].[COLOR=black]Crimson[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]            [COLOR=black]     MyPen[/COLOR] = [COLOR=black]Pens[/COLOR].[COLOR=black]Crimson[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Else[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]                   [COLOR=black]MyBrush[/COLOR] = [COLOR=black]Brushes[/COLOR].[COLOR=black]Black[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]                   [COLOR=black]MyPen[/COLOR] = [COLOR=black]Pens[/COLOR].[COLOR=black]Black[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End [/COLOR][COLOR=blue]If[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End [/COLOR][COLOR=blue]Set[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Property[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Public[/COLOR][COLOR=blue]Sub[/COLOR][COLOR=#000000] [COLOR=black]CycleSymbol[/COLOR]()[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]SymbolIndex[/COLOR] += 1[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]SymbolIndex[/COLOR] = [COLOR=black]SymbolIndex[/COLOR] [/COLOR][COLOR=blue]Mod[/COLOR][COLOR=#000000] [COLOR=black]GeneralSymbols[/COLOR].[COLOR=black]Length[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]S[/COLOR] = [COLOR=black]GeneralSymbols[/COLOR]([COLOR=black]SymbolIndex[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
 
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]MyBrush[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]Brush[/COLOR] = [COLOR=black]Brushes[/COLOR].[COLOR=black]Black[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]MyPen[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]Pen[/COLOR] = [COLOR=black]Pens[/COLOR].[COLOR=black]Black[/COLOR][/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Private[/COLOR][COLOR=#000000] [COLOR=black]MyFont[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]Font[/COLOR] = [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000] [COLOR=black]Font[/COLOR]([/COLOR][COLOR=maroon]"Arial"[/COLOR][COLOR=#000000], 10S, [COLOR=black]FontStyle[/COLOR].[COLOR=black]Regular[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]Public[/COLOR][COLOR=blue]Sub[/COLOR][COLOR=#000000] [COLOR=black]Paint[/COLOR]([/COLOR][COLOR=blue]ByVal[/COLOR][COLOR=#000000] [COLOR=black]G[/COLOR] [/COLOR][COLOR=blue]As[/COLOR][COLOR=#000000] [COLOR=black]Graphics[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]G[/COLOR].[COLOR=black]DrawPath[/COLOR]([COLOR=black]MyPen[/COLOR], [COLOR=black]GraphicsData[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=#000000]    [COLOR=black]G[/COLOR].[COLOR=black]DrawString[/COLOR]([COLOR=black]S[/COLOR], [/COLOR][COLOR=blue]New[/COLOR][COLOR=#000000] [COLOR=black]Font[/COLOR]([/COLOR][COLOR=maroon]"Arial"[/COLOR][COLOR=#000000], 10S, [COLOR=black]FontStyle[/COLOR].[COLOR=black]Regular[/COLOR]), [COLOR=black]MyBrush[/COLOR], [COLOR=black]X[/COLOR], [COLOR=black]Y[/COLOR], [COLOR=black]SF[/COLOR])[/COLOR][/FONT][/SIZE]
[SIZE=2][FONT=Courier New][COLOR=blue]End[/COLOR][COLOR=blue]Sub[/COLOR][/FONT][/SIZE]
[SIZE=2][COLOR=blue][FONT=Courier New]End[/FONT][/COLOR][FONT=Courier New][COLOR=blue]Class[/COLOR][/FONT][/SIZE]
 
[/COLOR]

In the paint event of my picturebox, I have
VB.NET:
[SIZE=2][COLOR=#0000ff]For[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Each[/COLOR][/SIZE][SIZE=2] A [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] Atom [/SIZE][SIZE=2][COLOR=#0000ff]In[/COLOR][/SIZE][SIZE=2] Atoms[/SIZE]
[SIZE=2]A.Paint(e.Graphics)[/SIZE]
[SIZE=2][COLOR=#0000ff]Next[/COLOR][/SIZE]

What exactly does the Invalidate() method for the picture box do? Does it cause the surface to be redrawn? (Doesn't the paint method already do this?) I'm guessing it will be more efficient if I specify a smaller region when I call Invalidate (am I right?).

Thanks.:)
 
That looks just perfect! About Invalidate method, this was what I found:
Invalidates a specific region of the control and causes a paint message to be sent to the control.
 
Back
Top