[Last Call] Learn about multicloud storage options and how to improve your company's cloud strategy. Register Now

x
?
Solved

Visual Basic 2008 Graphics - Drawing multiple circumscribed circles Part 2

Posted on 2009-05-07
7
Medium Priority
?
763 Views
Last Modified: 2013-11-27
Circle within a circle within a circle...etc...etc...down to 1 point

Ellipses must have a constant radius on both x and y axis "Perfect Circles Only".

Please Include complete project (which includes form1) with screenshot.

CircleDemo2.jpg
0
Comment
Question by:NerdsOfTech
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
7 Comments
 
LVL 86

Accepted Solution

by:
Mike Tomlinson earned 2000 total points
ID: 24331342
Same thing but going inwards using a diminishing radius value:
Public Class Form1
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.DoubleBuffered = True
    End Sub
 
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Static R As New Random
 
        Dim C As Color
        Dim rc As Rectangle
 
        Dim center As New Point(Me.ClientRectangle.Width / 2, Me.ClientRectangle.Height / 2)
        Dim radius As Integer = Math.Min(Me.ClientRectangle.Width, Me.ClientRectangle.Height) / 2
 
        While radius > 0
            rc = New Rectangle(center.X - radius, center.Y - radius, radius * 2, radius * 2)
            C = Color.FromArgb(255, R.Next(0, 256), R.Next(0, 256), R.Next(0, 256))
            Using P As New Pen(C, 2)
                e.Graphics.DrawEllipse(P, rc)
            End Using
            radius = radius - 1
        End While
    End Sub
 
    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.Refresh()
    End Sub
 
End Class

Open in new window

CircleDemo3.jpg
0
 
LVL 19

Author Closing Comment

by:NerdsOfTech
ID: 31579259
Perfection! Cool effects when you resize it too! Thank you Idle_Mind once again.
0
 
LVL 32

Expert Comment

by:Daniel Wilson
ID: 24331751
Very nice.  What I was working on used a PictureBox.  Yours is cleaner.

And I was unfamiliar with DoubleBuffered.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx


0
NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 24331803
DoubleBuffered is great...but it only works for the FORM itself.  =\

If you want to DoubleBuffer a Panel or PictureBox (basically anything else) then you have to INHERIT that control and manual use SetStyle() to properly configure it:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle(VS.71).aspx

Something like:

    Public Class SomeThing
        Inherits SomeControl

        Public Sub New()
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.UserPaint, True)
            Me.UpdateStyles()
        End Sub

    End Class

0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 24331921
@NerdsOfTech...thanx for the totally unexpected donation!  Much appreciated...  =)

I was playing around, just for grits and shins...try this out:
(Right Click the Form)
Public Class Form1
 
    Private CM As New ContextMenu
    Private PreviewWidth As Integer = 15
    Private PreviewMargin As Integer = 3
    Private SelectedColor As Color = Color.Cyan
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.DoubleBuffered = True
        For Each C As Color In System.ComponentModel.TypeDescriptor.GetConverter(GetType(Color)).GetStandardValues
            If Not C.IsSystemColor Then
                Dim mi As New MenuItem(C.ToKnownColor.ToString)
                mi.Tag = C.ToKnownColor
                mi.OwnerDraw = True
                AddHandler mi.MeasureItem, AddressOf mi_MeasureItem
                AddHandler mi.DrawItem, AddressOf mi_DrawItem
                AddHandler mi.Click, AddressOf mi_Click
                CM.MenuItems.Add(mi)
            End If
        Next
        Me.ContextMenu = CM
    End Sub
 
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Static R As New Random
 
        Dim C As Color
        Dim rc As Rectangle
        Dim percent As Double
 
        Dim center As New Point(Me.ClientRectangle.Width / 2, Me.ClientRectangle.Height / 2)
        Dim radius As Integer = Math.Min(Me.ClientRectangle.Width, Me.ClientRectangle.Height) / 2
        Dim startRadius As Integer = radius
 
        While radius > 0
            rc = New Rectangle(center.X - radius, center.Y - radius, radius * 2, radius * 2)
            percent = (startRadius - radius) / startRadius
            C = Color.FromArgb(255, percent * SelectedColor.R, percent * SelectedColor.G, percent * SelectedColor.B)
            Using P As New Pen(C, 2)
                e.Graphics.DrawEllipse(P, rc)
            End Using
            radius = radius - 1
        End While
    End Sub
 
    Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Me.Refresh()
    End Sub
 
    Private Sub mi_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs)
        Dim mi As MenuItem = CType(sender, MenuItem)
        Dim sz As SizeF = e.Graphics.MeasureString(mi.Text, Me.Font)
        e.ItemHeight = sz.Height
        e.ItemWidth = sz.Width + PreviewWidth + (2 * PreviewMargin)
    End Sub
 
    Private Sub mi_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs)
        Dim mi As MenuItem = CType(sender, MenuItem)
        e.DrawBackground()
        e.Graphics.DrawString(mi.Text, Me.Font, Brushes.Black, e.Bounds.X + PreviewWidth + (2 * PreviewMargin), e.Bounds.Y)
        Dim rc As New Rectangle(e.Bounds.X + PreviewMargin, e.Bounds.Y + PreviewMargin, PreviewWidth, e.Bounds.Height - (2 * PreviewMargin))
        Using sb As New SolidBrush(Color.FromKnownColor(mi.Tag))
            e.Graphics.FillRectangle(sb, rc)
        End Using
        e.Graphics.DrawRectangle(Pens.Black, rc)
    End Sub
 
    Private Sub mi_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim mi As MenuItem = CType(sender, MenuItem)
        SelectedColor = Color.FromKnownColor(mi.Tag)
        Me.Refresh()
    End Sub
 
End Class

Open in new window

CircleDemo4.jpg
0
 
LVL 19

Author Comment

by:NerdsOfTech
ID: 24332000
WOW! THAT is stellar! Now that... is extremely cool.
0
 
LVL 19

Author Comment

by:NerdsOfTech
ID: 24332021
Your welcome. You deserved it.

=NerdsOfTech
0

Featured Post

Tech or Treat! - Giveaway

Submit an article about your scariest tech experience—and the solution—and you’ll be automatically entered to win one of 4 fantastic tech gadgets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article shows a few slightly more advanced techniques for Windows 7 gadget programming, including how to save and restore user settings for your gadget and how to populate the "details" panel that is displayed in the Windows 7 gadget gallery.  …
If you have ever found yourself doing a repetitive action with the mouse and keyboard, and if you have even a little programming experience, there is a good chance that you can use a text editor to whip together a sort of macro to automate the proce…
This is Part 3 in a 3-part series on Experts Exchange to discuss error handling in VBA code written for Excel. Part 1 of this series discussed basic error handling code using VBA. http://www.experts-exchange.com/videos/1478/Excel-Error-Handlin…
Want to learn how to record your desktop screen without having to use an outside camera. Click on this video and learn how to use the cool google extension called "Screencastify"! Step 1: Open a new google tab Step 2: Go to the left hand upper corn…

650 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question