Mit VC++ DLL auf VisualBasic Form Grafik zeichnen
-
Ich will von einem VC++ DLL aus
auf eine aufrufende VB-Form
Grafik zeichnen. (MS Visual Studio 6.0)
Doch das klappt bisher nicht, da das DLL die VB "Form" als Fenster nicht kennt und daher keine DC definieren kann.
Übergabe eines Zeigers auf die Form von VB an DLL ist auch keine Lösung; denn davon ausgehend lässt sich keine DC definieren (s.u.).
kann mir jemand helfen?
TulganBeispiel:
extern "C" BOOL PASCAL EXPORT Ellipse (int * F, void * p)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CClientDC dc (( CWnd * ) p); // Meldung: "Debug Assertion failed"
dc.Ellipse(F[0], F[1], F[2], F[3]);
return TRUE;
}
-
Müsstest Du nicht einfach me.hwnd aus VB an die Funktion übergeben. Dann kannst Du auch einen CCLientDC erzeugen.
-
Vielen Dank! - Tulgan
-
Leider funktioniert es immer noch nicht-
Auf der C++ Seite:
extern "C" int PASCAL EXPORT Kreis (int* F, int n, void* p)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HDC hDC = GetWindowDC((HWND)p);
Ellipse(hDC, F[0], F[1], F[2], F[3]);
return n;
}Auf der VB-Seite:
Private Declare Function Kreis _
Lib "MFC.dll" _
(ByRef F0 As Integer, ByVal n As Long, ByRef p) As IntegerPrivate Sub Form_Click()
Dim F(3) As Integer
F(0) = 500
F(1) = 500
F(2) = 1000
F(3) = 1000
n = 4
MsgBox (Kreis(F(0), n, Me.hWnd))
End SubErgebnis: Keine Fehlermeldung... MsgBox meldet tatsächlich 4. (also läuft die Function auch "fehlerfrei")...
Doch der Kreis wird nicht gezeichnet!Das DC, das über GetWindowDC gefunden wird, hat offenbar keine Wirkung auf die Malfläche der VB-Form??? Wie kann man doch noch auf VB-Form malen? Oder ist es etwa überhaupt unmöglich?
-
Du musst nach HWND casten, nicht nach HWND*.
Schätze ich mal.
-
[quote="hustbaer"]Du musst nach HWND casten, nicht nach HWND*. Schätze ich mal.[/quote]
vielen dank hustbear... doch eigentlich muesste es ohne all diesen umweg gehen (und geht trotzdem nicht
)- das objekt "form" besitzt schon in VB die (windowsspezifische) eigenschaft hDC, die als long weitergegeben werden kann.
- C++ empfängt das, akzeptiert als DC, zeichnet (angeblich) die Ellipse und meldet zurueck die ellipse sei fehlerlos gezeichnet...
- und es erscheint doch nichts auf der VB-form:
--------------------------------------------------------
C++ seitig:extern "C" int PASCAL EXPORT MyEllipse (int* F, HDC hDC) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(Ellipse(hDC, F[0], F[1], F[2], F[3])!=0) return -1; // falls fehlerlos, dann -1 zurueckgeben, else return GetLastError(); // falls fehler, fehlercode zurueckgeben (> 0). }--------------------------------------------------------
VB-seitig:Private Declare Function MyEllipse _
Lib "MFC.dll" _
(ByRef F0 As Integer, ByVal hDC As Long) As IntegerPrivate Sub Form_Load()
Dim F(3) As Integer
F(0) = 500
F(1) = 500
F(2) = 1000
F(3) = 1000
n = MyEllipse(F(0), pcBild.hDC)
MsgBox (n) ' meldet -1, dh. "ellipse mit erfolg gezeichnet!"
End Sub--------------------------------------------------------
hoffnungsloser fall???
tulgan