чем заменили XOR Pen?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

чем заменили XOR Pen?

Сообщение Nick Bober » 29.12.2003 (Пн) 18:11

Народ, подскажите плз.
На ВБ6 был у меня на кнопочке такой код:
Код: Выделить всё
Private Sub cmd1_Click() 'pBox - PictureBox
    pBox.DrawMode = 7   'XOR Pen
    pBox.DrawStyle = 0  'Solid
    pBox.DrawWidth = 3  '
    pBox.ScaleMode = 3  'Pixel
    pBox.Line (100, 100)-(150, 150), vbWhite, B
End Sub

Т.е. нажимаем первый раз - есть линия, второй - нету.

Как это делают в ВБ.НЕТ?
Знаю, что примерно так:
Код: Выделить всё
    Private Sub cmd1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmd1.Click
        Dim g As Graphics = pBox.CreateGraphics
        Dim p1 As New Pen(Color.White, 3)
        Dim r As New Rectangle(100, 100, 50, 50)
        g.DrawRectangle(p1, r)
     End Sub

Но так нет XORа. Что я пропустил?

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 13.01.2004 (Вт) 13:29

Отвечаю на свой вопрос.
Код: Выделить всё
Public Class Form1
    Inherits System.Windows.Forms.Form

    Dim bHaveMouse As Boolean
    Dim ptOriginal As Point
    Dim ptLast As Point

    <System.Runtime.InteropServices.DllImport("gdi32.dll", CallingConvention:=System.Runtime.InteropServices.CallingConvention.Cdecl)> _
    Overloads Shared Function SetROP2( _
    ByVal hDC As IntPtr, ByVal DrawMode As Integer) As Integer
    End Function
#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    '<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    '    components = New System.ComponentModel.Container
    '    Me.Text = "Form1"
    'End Sub

#End Region

    ' Convert and Normalize the points and draw the reversible frame.
    Private Sub MyDrawReversibleRectangle(ByVal p1 As Point, ByVal p2 As Point)
        SetROP2(Me.Handle, 16)
        Dim rc As Rectangle
        ' Convert the points to screen coordinates.
        p1 = PointToScreen(p1)
        p2 = PointToScreen(p2)
        ' Normalize the rectangle.
        If (p1.X < p2.X) Then
            rc.X = p1.X
            rc.Width = p2.X - p1.X
        Else
            rc.X = p2.X
            rc.Width = p1.X - p2.X
        End If
        If (p1.Y < p2.Y) Then
            rc.Y = p1.Y
            rc.Height = p2.Y - p1.Y
        Else
            rc.Y = p2.Y
            rc.Height = p1.Y - p2.Y
        End If
        ' Draw the reversible frame.
        ControlPaint.DrawReversibleFrame(rc, Color.White, FrameStyle.Dashed)
    End Sub

    ' Called when the left mouse button is pressed down.
    Public Sub MyMouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        ' Make a note that we "have the mouse".
        bHaveMouse = True
        ' Store the "starting point" for this rubber-band rectangle.
        ptOriginal.X = e.X
        ptOriginal.Y = e.Y
        ' Special value lets us know that no previous
        ' rectangle needs to be erased.
        ptLast.X = -1
        ptLast.Y = -1
    End Sub

    ' called when the left mouse button is released
    Public Sub MyMouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        ' Set internal flag to know we no longer "have the mouse".
        bHaveMouse = False
        ' If we have drawn previously, draw again in that spot
        ' to remove the lines.
        If (ptLast.X <> -1) Then
            Dim ptCurrent As Point
            ptCurrent.X = e.X
            ptCurrent.Y = e.Y
            MyDrawReversibleRectangle(ptOriginal, ptLast)
        End If
        ' Set flags to know that there is no "previous" line to reverse.
        ptLast.X = -1
        ptLast.Y = -1
        ptOriginal.X = -1
        ptOriginal.Y = -1
    End Sub

    ' Called when the mouse is moved.
    Public Sub MyMouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        Dim ptCurrent As Point
        ptCurrent.X = e.X
        ptCurrent.Y = e.Y
        ' If we "have the mouse", then we draw our lines.
        If (bHaveMouse) Then
            ' If we have drawn previously, draw again in
            ' that spot to remove the lines.
            If (ptLast.X <> -1) Then
                MyDrawReversibleRectangle(ptOriginal, ptLast)
            End If
            ' Update last point.
            ptLast = ptCurrent
            ' Draw new lines.
            MyDrawReversibleRectangle(ptOriginal, ptCurrent)
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        bHaveMouse = False
    End Sub

    Private Sub InitializeComponent()
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(784, 590)
        Me.Name = "Form1"

    End Sub
End Class

Вся фишка в функции SetROP2. Ей надо скормить DC того, на чем будем рисовать. Полное описание читать в MSDN.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 16.06.2005 (Чт) 17:23

XOR режим в VB.NET есть - справку смотрите внимательнее
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.06.2005 (Пт) 17:13

вот посоветовал посмотреть справку и пошел смотреть сам. И нифига не нашел :cry:

но ведь помню - делал я прогу с использование режима XOR в VB.NET

года три назад дело было

мистика...
Весь мир матрица, а мы в нем потоки байтов!

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 17.06.2005 (Пт) 17:18

Если не ошибаюсь....

System.Drawing.Drawing2D.CombineMode.Xor

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.06.2005 (Пт) 17:24

val писал(а):Если не ошибаюсь....

System.Drawing.Drawing2D.CombineMode.Xor


эта штука для комбинирования областей (Rgn) - не то :?
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList