Jag använder en liten underbar kod i VB för en Autolist i en textruta.
Nu undrar jag, kan man översätta den till C#?
Det handlar bl a om ett API-anrop och några konstanter.
Private Declare Function SendMessage _
Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Const EM_GETFIRSTVISIBLELINE = &HCE
Const EM_LINEFROMCHAR = &HC9
Const EM_LINELENGTH = &HC1
Const EM_LINEINDEX = &HBB
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
If Chr(KeyAscii) = ";" Then
Combo1.Visible = True
Dim p As POINTAPI
GetCaretPos p
Combo1.left = ScaleX(p.x, vbPixels, vbTwips) + Text1(8).left + 60
Combo1.tOp = ScaleY(p.y, vbPixels, vbTwips) + Text1(8).tOp + ScaleY(Text1(8).Font.Size, vbPoints, vbTwips) + 60
ElseIf Combo1.Visible = True Then
Combo1.Visible = False
End If
End Sub
Då tar jag dig på orden och ger dig lite hjälp bara med själva deklarationerna:
private struct POINTAPI
{
public int X;
public int Y;
};
[DllImport("user32.dll")]
private static extern int SendMessage(
int hWnd,
uint Msg,
int wParam,
int lParam
);
[DllImport("user32.dll")]
private static extern bool GetCaretPos(ref POINTAPI point);
private const int EM_LINEINDEX = 0xBB;
private const int EM_LINEFROMCHAR = 0xC9;
private const int EM_LINELENGTH = 0xC1;
private const int EM_LINEINDEX = 0xBB;
Resten av koden känns svår att översätta "on-the-fly" om man inte riktigt vet hur det egentligen ska se ut. Man får nog sätta sig med studion, rita upp kontrollerna, köra lite trial-and-error, googla lite, osv ..
Jo, fast nu är det ju inte VB.NET utan VB6/5/4. Vad man kan göra om man har större kodmängder är ju att först översätta från VB6 till VB.NET mha den inbyggda "Upgrade Wizarden" i .NET-Studion och sen översätta från VB-NET till C# ganska automatiskt. Problemet är bara att "Upgrade Wizarden" oftast bara klarar de självklara bitarna och lämnar kvar de "svåra". (Jag har testat på koden ovan.)