Usercontrol & Subclassing

20/11/2007 - 21:06 von Frank Landen | Report spam
Hallo zusammen :)

Irgendwie sehe ich den Wald vor lauter Bàumen nciht und benörige einen
dezenden Wink mit einem Zaunpfahl (ggfs. auch mit einem ganzen
Jàgerzaun).

Zum Problem:
Ich habe mir ein Treeview-Usercontrol gebaut. Um nun in einer Zeile
Eintràge mehrfarbig darzustellen benötige ich Subclassing.
Soweit funktioniert auch alles - aber irgendwo habe ich einen
Denkfehler, der die IDE spinnen, bzw. gelegentlich abstürzen làsst.

Wenn ich nun das Formular, welches das Usercontrol enthàlt anzeigen
lasse in der IDE und danach auf das Usercontrol anzeigen lasse, so
"spinnt" die IDE und die Titelzeile von VB wechselt wild zwischen
(aktiv und entwerfen hin und her)

Liege ich richtig der Annahme, dass Usercontrol_initialize in der IDE
ausgeführt wird und somit auch das Subclassing gestartet wird?
Wenn ja, wie kann ich das verhindern?

Gekürzte Codeauszüge folgen unten.

Grüße

Frank Landen


Einige Codeauszüge:

'###CODE IN USERCONTROL

Private mWndProcOrg As Long
Private mHWndSubClassed As Long

' von usercontrol_initialize aufgerufen
Private Sub SubClass()
If mWndProcOrg Then Exit Sub
mWndProcOrg = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)
mHWndSubClassed = hWnd
Call SetWindowLong(hWnd, GWL_USERDATA, ObjPtr(Me))
End Sub

'von usercontrol_terminate aufgerufen
Private Sub UnSubClass()
If mWndProcOrg = 0 Then Exit Sub
SetWindowLong mHWndSubClassed, GWL_WNDPROC, mWndProcOrg
mWndProcOrg = 0
End Sub

Friend Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long,
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim RetVal As Long
Dim tHDR As NMHDR
Select Case iMsg
Case WM_NOTIFY
'Code überflüssig
End Select
If RetVal Then
WindowProc = RetVal
Else
WindowProc = CallWindowProc(mWndProcOrg, hWnd, iMsg, wParam,
lParam)
End If
End Function


'###CODE IN MODUL
Public Function SubWndProc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim ctlShadowControl As TreeviewEx
Dim ptrObject As Long
ptrObject = GetWindowLong(hWnd, GWL_USERDATA)
CopyMemory ctlShadowControl, ptrObject, 4
SubWndProc = ctlShadowControl.WindowProc(hWnd, Msg, wParam, lParam)
CopyMemory ctlShadowControl, 0&, 4
Set ctlShadowControl = Nothing
End Function
 

Lesen sie die antworten

#1 Gert Wietzorek
20/11/2007 - 21:41 | Warnen spam
Frank Landen schrieb:
Hallo zusammen :)

Irgendwie sehe ich den Wald vor lauter Bàumen nciht und benörige einen
dezenden Wink mit einem Zaunpfahl (ggfs. auch mit einem ganzen Jàgerzaun).

Zum Problem:
Ich habe mir ein Treeview-Usercontrol gebaut. Um nun in einer Zeile
Eintràge mehrfarbig darzustellen benötige ich Subclassing.
Soweit funktioniert auch alles - aber irgendwo habe ich einen
Denkfehler, der die IDE spinnen, bzw. gelegentlich abstürzen làsst.


Liege ich richtig der Annahme, dass Usercontrol_initialize in der IDE
ausgeführt wird und somit auch das Subclassing gestartet wird?
Wenn ja, wie kann ich das verhindern?




Prüfe auf ambient.usermode und subclasse nur wenn true. Hatte mal ein
àhnliches Problem und auch nur so beseitigt bekommen.


Gruß
Gert








| Antworten nur in die Newsgroup, |
| die E-Mail Adressen existieren nicht! |
| |
| answers and questions only to the newsgroup,|
| the email adresses are not valid |
| |
| http://www.gwsoftware.de |

Ähnliche fragen