Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [VB6]Problema creazione finestra

    Dunque:ciao a tutti.Posto anzitutto il codice


    codice:
    Const WS_EX_STATICEDGE = &H20000
    Const WS_EX_TRANSPARENT = &H20&
    Const WS_CHILD = &H40000000
    Const WS_EX_DLGMODALFRAME = &H1&
    Const CW_USEDEFAULT = &H80000000
    Const SW_NORMAL = 1
    Const RDW_INTERNALPAINT = &H2
    Const WM_PAINT = &HF&
    
    Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
    Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
    'Private Declare Function RedrawWindow Lib "user32" (ByVal hwnd As Long, lprcUpdate As RECT, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long
    '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
    
    
    Private Sub Form_Load()
    Dim desktop As RECT
    Call GetWindowRect(GetDesktopWindow(), desktop)
    larghezzaschermo = desktop.Right - desktop.Left
    altezzaschermo = desktop.Bottom - desktop.Top
    'MsgBox larghezzaschermo & "x" & altezzaschermo
    posizionex = (larghezzaschermo - 200) \ 2
    posizioney = (altezzaschermo - 200) \ 2
    MsgBox posizionex & "x" & posizioney
    mWnd = CreateWindowEx(WS_EX_STATICEDGE Or WS_EX_TRANSPARENT, "MESSAGE", "Hello World !", WS_EX_DLGMODALFRAME, 0, 0, 200, 200, 0, 0, GetActiveWindow, ByVal 0)
    Call MoveWindow(mWnd, posizionex, posizioney, 200, 200, bRepaint:=True)
    ShowWindow mWnd, SW_NORMAL
    End Sub
    
    Private Sub Form_Unload(Cancel As Integer)
    DestroyWindow mWnd
    End Sub


    Per motivi che non sto qui a dilungarmi nel descrivere,devo fare tutto via api.Quindi la richiesta è e rimane sulle api.
    In pratica il codice precedente crea una piccola finestra e la centra nello schermo.Il mio problema è però che sta finestra rimane invisibile a meno di non cliccarci sopra(ma bisogna trovarla nel desktop!),e anche se la si trascina,se passa nell'area di un'altra finestra assume il suo contenuto.In pratica è un problema di refresh della finestra.Come devo fare(sempre via api) a fare in modo che venga sempre..come dire..painted?
    Grazie mille mille mille facciamo quattromila

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Beh ... mancano alcune parti fondamentali per la gestione della finestra ... prima tra tutte, la gestione dei messaggi. Se Windows invia un messaggio alla finestra appena creata (un WM_PAINT per ridisegnarsi o un WM_DESTROY per chiudersi) la finestra non puo' accorgersene.

    In definitiva nel codice manca

    1) la registrazione della classe della finestra che vuoi usare, usata per indicare l'indirizzo della funzione WindowProc che gestira' i messaggi;

    2) la funzione WindowProc vera e propria con la gestione dei messaggi;

    3) il loop dei messaggi che si occupi della traslazione dei tasti pressati e dell'inoltro dei messaggi verso la WindowProc

    Insomma ... manca un bel pezzo di gestione standard delle finestre di Windows ...

  3. #3
    ah ho capito.in pratica mi devo suicidare.
    cmq grazie.credo di aver afferrato cosa intendi.aaaagh!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' che sia impossibile ... non l'ho detto ... bisogna solamente scrivere il resto del codice ...

  5. #5
    guarda,se vuoi darmi qualche dritta a me non dispiace...
    ma senza fretta eh...
    thanks

  6. #6

    Re: [VB6]Problema creazione finestra

    Originariamente inviato da setedivento
    Per motivi che non sto qui a dilungarmi nel descrivere,devo fare tutto via api.Quindi la richiesta è e rimane sulle api.
    Puoi dilungarti a descriverli? Magari c'è una soluzione alternativa...
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7

    Re: Re: [VB6]Problema creazione finestra

    Originariamente inviato da MItaly
    Puoi dilungarti a descriverli? Magari c'è una soluzione alternativa...


    in pratica devo creare una finestrella di tipo toolwindow solo col caption ma senza bottone di chiusura(la chiusura me la gestisco io).devo farlo in vba,non fosse che il vba ha solo gli userform e non sono personalizzabili,o solo limitatamente.quindi sono costretto a ricorrere alle api.diciamo che un'alternativa sempre tramite api sarebbe ridefinire lo stile finestra (windowstyle) di uno userform.so che si può,ma non ho idea di dove partire.

  8. #8
    Credo che la strada più facile sia usare un normale userform e poi personalizzarlo con le API... dunque, tu come caption intendi barra del titolo? Quindi, con barra del titolo e senza pulsante di chiusura?
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    sì,esattamente quello

    grazie

  10. #10
    codice:
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    
    Private Sub UserForm_Initialize()
        SetWindowLong GetHandle(Me.Caption), GWL_STYLE, Not ((Not GetWindowLong(GetHandle(Me.Caption), GWL_STYLE)) Or WS_SYSMENU)
    End Sub
    
    Function GetHandle(Name As String) As Long
    'Daniel Klann, mpep
    Dim strFormClassName As String
    
      If Val(Application.Version) < 9 Then 'Pre Excel 2000
        strFormClassName = "ThunderXFrame"
      Else
        strFormClassName = "ThunderDFrame" 'Excel 2000/2002
      End If
    
      GetHandle = FindWindow(strFormClassName, Name)
    End Function
    Amaro C++, il gusto pieno dell'undefined behavior.

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.