Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [.NET] Difficoltà traduzione vb .net->c#

    Salve a tutti.
    Sto tentando di convertire una classe scritta per vb .net e ho incontrato qualche difficoltà, quindi veniamo subito al codice:
    VB .Net
    La classe eredita da System.windows.Forms.NativeWindow
    codice:
    Public Delegate Sub BtnClickedEventHandler(ByVal sender As Object, ByVal e As System.EventArgs)
    Public Delegate Sub BtnHelpClickedEventHandler(ByVal sender As Object, ByVal e As System.EventArgs)
    Public Delegate Sub BtnStateChangeEventHandler(ByVal sender As Object, ByVal st As state)
    Public Delegate Sub BtnIndexChangeEventHandler(ByVal sender As Object, ByVal e As EventArgs)
    
    Public Event BtnClicked As BtnClickedEventHandler
    Public Event BtnHelpClicked As BtnHelpClickedEventHandler
    Public Event BtnStateChanged As BtnStateChangeEventHandler
    Public Event BtnIndexChange As BtnIndexChangeEventHandler
    
    //Costruttore
    Public Sub New(ByVal parent As Form)
            AddHandler parent.HandleCreated, AddressOf Me.OnHandleCreated
            AddHandler parent.HandleDestroyed, AddressOf Me.OnHandleDestroyed
            AddHandler parent.TextChanged, AddressOf Me.OnTextChanged
            AddHandler BtnStateChanged, AddressOf Me.StateChange
            AddHandler BtnHelpClicked, AddressOf Me.Helpbtnclicked
            Me.parent = parent
    End Sub 'New
    io ho tradotto in questa maniera:
    C#
    codice:
    public delegate void BtnClickedEventHandler(Object sender,System.EventArgs e);
    public delegate void BtnHelpClickedEventHandler(Object sender, System.EventArgs e);
    public delegate void BtnStateChangeEventHandler(Object sender, stato st);
    public delegate void BtnIndexChangeEventHandler(Object sender, System.EventArgs e);
    
    public event BtnClickedEventHandler BtnClicked;
    public event BtnIndexChangeEventHandler BtnIndexChange;
    public event BtnStateChangeEventHandler BtnStateChanged;
    public event BtnHelpClickedEventHandler BtnHelpClicked;
    
    //Costruttore
    public titleButton(Form p)
    {
                p.HandleCreated += new EventHandler(this.onHandleCreate);
                p.HandleDestroyed += new EventHandler(this.OnHandleDestroyed);
                p.TextChanged += new EventHandler(this.OnTextChanged);
                //Qui non so come tradurre
                //AddHandler BtnStateChanged, AddressOf Me.StateChange
                //AddHandler BtnHelpClicked, AddressOf Me.Helpbtnclicked
                this.parent = p;
    }

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Prova questo

    http://forum.html.it/forum/newreply....readid=1222372

    server per tradurre vb.net <--> c#

  3. #3
    Grazie ho risolto, ma mi si è presentato un altro problema che forse dovrebbe essere l'ultimo scoglio:

    in VB .Net ho questo codice:
    codice:
    Friend Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Int32, ByVal msg As Int32, ByVal wParam As Int32, _
        ByRef lParam As RECT) As Int32
    dove RECT è una struttura di questo tipo:
    codice:
    Friend Structure RECT
            Public left As Integer
            Public top As Integer
            Public right As Integer
            Public bottom As Integer
    
    
            Public Sub New(ByVal rect As Rectangle)
                MyClass.New(rect.Left, rect.Top, rect.Right, rect.Bottom)
            End Sub 'New
    
            Public Sub New(ByVal left As Integer, ByVal top As Integer, ByVal right As Integer, ByVal bottom As Integer)
                Me.left = left
                Me.top = top
                Me.right = right
                Me.bottom = bottom
            End Sub 'New
    
            Public Function ToRectangle() As Rectangle
                Return New Rectangle(Me.left, Me.top, Me.right - Me.left, Me.bottom - Me.top)
            End Function 'ToRectangle
    End Structure 'RECT
    nella classe viene richiamata la sendmessage in questo modo
    codice:
    SendMessage(parent.Handle.ToInt32, WM_SYSCOMMAND, SC_CONTEXTHELP, Nothing)
    La conversione in C# che ho fatto risulta quindi
    codice:
    //Strutture RECT
    internal struct RECT
    {
                int left;
                int top;
                int right;
                int bottom;
    
                public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
                {
    
                }
    
                public RECT(int l, int t, int r, int b)
                {
                    this.left = l;
                    this.top = t;
                    this.right = r;
                    this.bottom = b;
                }
    
                public Rectangle toRectangle()
                {
                    return new Rectangle(this.left, this.top, this.right - this.left, this.bottom - this.top);
                }
    };
    
    //API SendMessage
    [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern int SendMessage(int hwnd, int msg, int wParam, RECT lParam);
    
    //Richiamo la funzione
    SendMessage(parent.Handle.ToInt32(), WM_SYSCOMMAND, SC_CONTEXTHELP, null)
    Quest'ultima operazione genera un errore di tipo:
    "La corrispondenza migliore del metodo di overload per 'fourth_button.titleButton.SendMessage(int, int, int, fourth_button.titleButton.RECT)' presenta alcuni argomenti non validi"
    e ovviamente in seguito
    Argomento '4': impossibile convertire da '<null>' a 'fourth_button.titleButton.RECT'

    Come posso risolvere?

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    prova con un new RECT() al posto di null..

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma se alla fine non usi la struttura RECT, evita di dichiararla e scrivi solamente

    codice:
    [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern int SendMessage(int hwnd, int msg, int wParam, int lParam);
    
    SendMessage(parent.Handle.ToInt32(), WM_SYSCOMMAND, SC_CONTEXTHELP, 0)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Ovviamente funziona! Grazie ho risolto tutti i problemi a compile time, ore mi resta da capire perché a run time non funziona....

    Nello specifico

    codice:
    [DllImport("uxtheme.dll", EntryPoint="DrawThemeBackground", SetLastError = true)]
    public extern static Int32 drawThemeBackground(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, RECT pRect, IntPtr pClipRect);
    
    RECT r = new RECT(new Rectangle(pos.X, pos.Y, Convert.ToInt32(btn_w), Convert.ToInt32(btn_h)));
    
    IntPtr thema = openThemeData(this.Handle, "Window");
    
    IntPtr hDC = g.GetHdc();
    
    Int32 ret = drawThemeBackground(thema, hDC, 15, 1, r, IntPtr.Zero);
    Non funziona drawThemeBackground invece di S_OK mi restituisce -2147467261

    il codice vb .net è così:
    codice:
    <DllImport("Uxtheme", EntryPoint:="DrawThemeBackground", SetLastError:=True)> _
    Friend Shared Function drawThemeBackground(ByVal hTheme As IntPtr, ByVal hDC As IntPtr, ByVal iPartId As Int32, ByVal iStateId As Int32, ByRef pRect As RECT, ByVal nullRECT As IntPtr) As <MarshalAs(UnmanagedType.Error)> Int32
        End Function
    
    Dim r As RECT = New RECT(New Rectangle(pos.X, pos.Y, btn_width, btn_height))
    Dim thema As IntPtr = openThemeData(Me.Handle, "Window")
    Dim hDC As IntPtr = g.GetHdc
    Dim ret As Integer = drawThemeBackground(thema, hDC, 15, 1, r, IntPtr.Zero)
    e ovviamente funziona in quanto ret == 0

    ho controllato e r viene istanziato correttamente, thema e hDC sono IntPtr validi

    g è un oggetto Graphics
    codice:
    IntPtr handle = new IntPtr(GetWindowDC(parent.Handle.ToInt32()));
    Graphics g = Graphics.FromHdc(handle);
    Proprio non riesco a venirne a capo suggerimenti?
    Allego anche la classe completa in modo da dare più informazioni.

    Per testare la classe dentro il metodo InitializeComponent()
    codice:
    titleButton myButton = new titleButton(this);
    http://rapidshare.com/files/99298879...Button.cs.html

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.