Jak správně na Win32 API SetParent (Window)

Jak správně na Win32 API SetParent (Window)
« kdy: 21. 05. 2021, 09:53:48 »
Dobrý den,

v již existující aplikaci, ke které jsem přišel, chybí vazby child a jeho parent. To nedělá dobrotu když chci getnout top window.

Udělal jsem si vb6 projekt (existující aplikace je vb6, nikoliv však MDI..), kde jsem nastavení vazby chtěl odladit.

Šel jsem podle tohoto návodu:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setparent

V okně(Formu) po spuštění mám tlačítko s obsluhou:

Kód: [Vybrat]
Private Sub Command2_Click()

    Dim dlg As Form
   
    Set dlg = New Form2
   
    Dim result As Long
    result = GetWindowLong(hWnd, GWL_STYLE)
    result = result - (result And WS_CLIPCHILDREN)
    SetWindowLong hWnd, GWL_STYLE, result
   
    dlg.SetParentWindow Me.hWnd
   
    dlg.Show vbModal
   
    Set dlg = Nothing

End Sub

SetParentWindow ve Form2 mam potom:

Kód: [Vybrat]
Public Sub SetParentWindow(ByVal hWndParent As Long)

    Dim result As Long
   
    result = GetWindowLong(hWnd, GWL_STYLE)
    result = result - (result And WS_POPUP)
    result = result Or WS_CHILD
    result = SetWindowLong(hWnd, GWL_STYLE, result)
   
    result = SetParent(hWnd, hWndParent)
   
    result = SendMessage(hWndParent, WM_CHANGEUISTATE, (UISF_ACTIVE * 65536) + UIS_SET, 0)
   
End Sub

Bohužel na řádce:

Kód: [Vybrat]
result = SetParent(hWnd, hWndParent)

Form2 zmizí nevím kam.

Prosím poradíte mi někdo, co by mohlo být špatně?

Díky


Re:Jak správně na Win32 API SetParent (Window)
« Odpověď #1 kdy: 21. 05. 2021, 11:10:15 »
Přestože okno (child zmizí), nezasekne se to, pokračuje dál v exekuci a když mám tedy například poté:

Kód: [Vybrat]
MsgBox GetWindowLong(Me.hWnd, GWL_HWNDPARENT)

vypíše to správně nového parenta.

Jen GetParent pak vrací null, krom toho, že child je neviditelný, není to zpropagované do hierarchie.