Давайте попробуем это.
TPanel
и вставьте в пользовательский класс Panel, который вы можете найти ниже, перезаписав существующее определение. TPanel
в панели инструментов и поместите один экземпляр в форму. TPanel
и вставьте этот код в метод обработчика:
Private Sub TPanel1_Paint(sender As Object, e As PaintEventArgs) Handles TPanel1.Paint
Dim canvas As Control = DirectCast(sender, Control)
Dim rect As Rectangle = ScaleImageFrame(imgBasketBall, canvas.ClientRectangle)
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
e.Graphics.CompositingMode = CompositingMode.SourceOver
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half
e.Graphics.DrawImage(imgBasketBall, rect)
End Sub
Private Function ScaleImageFrame(sourceImage As Bitmap, destinationFrame As Rectangle) As Rectangle
Dim rect As RectangleF = New RectangleF(0, 0, sourceImage.Width, sourceImage.Height)
'Define the ratio between the Image Rectangle and the Container ClientRectangle
Dim ratio As Single = CType(Math.Max(destinationFrame.Width, destinationFrame.Height) /
Math.Max(rect.Width, rect.Height), Single)
rect.Size = New SizeF(rect.Width * ratio, rect.Height * ratio)
'Use Integer division to avoid negative values
rect.Location = New Point((destinationFrame.Width - CInt(rect.Width)) \ 2,
(destinationFrame.Height - CInt(rect.Height)) \ 2)
Return Rectangle.Round(rect)
End Function
TPanel
) panColored1
и panColored2
должны быть имена двух существующих панелей, на которых должно быть расположено изображение. Пример кода размещает изображение в центре двух панелей, используя TPanel1.Location( (...) )
Private imgBasketBall As Bitmap = Nothing
Public Sub New()
InitializeComponent()
imgBasketBall = DirectCast(Image.FromFile("basketball.png").Clone(), Bitmap)
TPanel1.Size = New Size(120, 120)
TPanel1.Location = New Point(panColored1.Left + (panColored1.Width - TPanel1.Width) \ 2,
panColored1.Top + (panColored1.Height + panColored2.Height - TPanel1.Height) \ 2)
TPanel1.BringToFront()
End Sub
Результат:
Bitmap Size Bitmap Size
(1245x1242) (1178x2000)
Класс TPanel
(прозрачная панель):
Imports System.ComponentModel
Public Class TPanel
Inherits Panel
Private Const WS_EX_TRANSPARENT As Integer = &H20
Public Sub New()
Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or
ControlStyles.UserPaint Or
ControlStyles.Opaque Or
ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
Me.UpdateStyles()
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
e.Graphics.FillRectangle(Brushes.Transparent, Me.ClientRectangle)
MyBase.OnPaint(e)
End Sub
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim parameters As CreateParams = MyBase.CreateParams
parameters.ExStyle = parameters.ExStyle Or WS_EX_TRANSPARENT
Return parameters
End Get
End Property
End Class
Поймайте только исключения, которые можно обработать. Так, например, при использовании внешних ресурсов, лучшая практика должна поймать определенные исключения, что Вы знаете, что можно обработать. В случае файлов это может быть (IOException, SecurityException, и т.д.), в случае Базы данных, исключением может быть SqlException или другие.
В любом случае не ловите исключения, что Вы не обрабатываете, позволяете им течь к верхнему уровню, который может. Или если по некоторым причинам Вы ловите исключения, но не обрабатываете их, повторно бросают их использующий просто бросьте; (который создаст перебросок IL op, в противоположность плоскодонке).
В случае использования ресурсов, которые Вы не знаете, какие исключения могли бы выдать, Вы отчасти вынуждены поймать общий тип исключительной ситуации. И в этом случае вещь сейфов состояла бы в том, чтобы использовать упомянутые ресурсы от другого домена приложения (если возможный), или позвольте пузырю исключения до верхнего уровня (исключая UI), где они могут быть отображены или зарегистрированы.
Я думаю, что существует три причины иметь блок выгоды:
Если Вы придерживаетесь их, у Вас должно быть очень немного блоков выгоды по сравнению с try/finally
блоки - и они try/finally
блоки почти всегда просто звонят Dispose
, и поэтому лучше всего записанный как using
операторы.
Нижняя строка: очень важно иметь a finally
блок к бесплатным ресурсам, но catch
блоки должны обычно быть более редкими.
Это - то, что я нашел, и это имеет смысл мне.. Проверьте вручную на очевидные вещи, позвольте выгоде попытки сделать остальных..
У Eric Lippert есть хороший блог на этом, здесь.
Нет никакого смысла (за исключением того, "чтобы досаждать" (см. блог)) ловля исключения, если Вы не можете сделать что-то полезное; и в большинстве случаев Вы просто не можете - таким образом позволять ему пузырь (Ваш UI должен, очевидно, чистить и отобразить что-то).
У Вас могла бы, однако, быть "попытка/наконец" иметь дело с управлением ресурсами. Или даже инструмент для очистки, блок "использования", чтобы сделать то же.
Я думаю, что абсолютный ответ абсолютно условен (как управление делает Вы имеете по среде, что является ожидаемым балансом между производительностью и непротиворечивостью и многими другими, я уверен), но вообще говоря, я всегда делаю, предпочитая безопасность потенциально более медленной производительности.
это всегда зависит от того, чего Вы хотите достигнуть. Сервер, не отвечающий, мог бы быть достаточно серьезным для остановки всех, что стандартная программа, что выполнение, и исключение должно быть брошено в вызывающую сторону.
В других случаях Вы не заботитесь, не удалось ли Вам обновить дб или нет. Затем потребление исключения в порядке.
Очевидно, Вы не хотите показывать отслеживание стека своему конечному пользователю, тем не менее, таким образом, необходимо будет поймать его где-нибудь.