La creazione di un Trasparente Bambino finestra in cima non trasparente Genitore Finestra ( win 32 )

Ho un programma che non è scritto da me. Non ho la sua origine e lo sviluppatore di questo programma è di sviluppare in modo indipendente. Lui mi dà la HWND e HINSTANCE maniglie di tale programma.
Ho creato una finestra figlio SULLA sua finestra, utilizzando win32 api.
Per prima cosa ho bisogno di fare di questa finestra figlio trasparenza su alcune aree e opaco su altra area(come un Heads up display(HUD) per un gioco), in modo che l’utente può vedere le cose in entrambe le finestre.

la Seconda cosa di cui ho bisogno è l’ingresso alla finestra padre. Il mio bambino finestra ha bisogno di alcun input.

so che WS_EX_TRANSPARENT solo rende il bambino di disegnare alla fine come in pittori algoritmo.
non posso utilizzare WS_EX_LAYERED perché la sua finestra figlio.

grazie in anticipo 🙂

p.s.
ho guardato ovunque ma non ho trovato alcuna soluzione se non ci sono domande simili in giro per internet.
in realtà questo è un HUD come cosa per quel gioco. non posso disegnare direttamente sulla finestra principale causa della complessità con il multi-thread e in tante altre ragioni.

— EDIT —————————
Ehi ragazzi,
sto ancora lavorando su di esso. cercando diversi modi con che cosa avete suggerito.
C’è un modo per combinare directX e SetWindowRgn() funzione o directx con BitBlt() funzione. penso che farà il trucco.
attualmente sto testando tutte le cose come un bambino finestra e una finestra a più livelli.

  • La sua brutta, ma si potrebbe creare un alto livello di telaio sopra la finestra e traccia il movimento della finestra sotto. Quindi impostare le regioni trasparenti: codeguru.com/cpp/w-d/dislog/non-rectangulardialogs/article.php/…
  • Se si effettua la finestra trasparente che consente di vedere la finestra padre. Stai cercando di fare un buco nella finestra padre?
  • Bene, avete bisogno di almeno WS_EX_TRANSPARENT. Un problema che dovrete affrontare è che l’autore sta per cancellare la sua finestra sul WM_ERASEBKGND messaggio e cancellare i pixel dello sfondo hai lo stile di bandiera. Quindi è necessario sottoclasse sua routine di finestra e di sopprimere o sostituire il messaggio. Se ciò che è disegnato con WM_PAINT ancora funziona bene è una questione aperta, avrete bisogno di trovare per voi stessi. Probabilità sono basse, se contiene del testo o grafica con anti-aliasing sui bordi. Pubblicazione di un commento, data la bassa probabilità di successo.
  • WS_EX_TRANSPARENT è uno dei più confusione degli stili della finestra. Non ha una finestra trasparente, cambia solo l’ordine di rendering.
  • sì ed anche di Hit Test trasparente.. non la visibilità.. hehe
InformationsquelleAutor Deamonpog | 2012-05-09

 

3 Replies
  1. 3

    OK amici, finalmente ho fatto alcune cose folli per farlo accadere. ma la sua non è molto efficiente come l’utilizzo di direct x direttamente per il disegno.

    quello che ho fatto,

    • Utilizzato (WS_EX_ TRANSPARENT | WS_EX_LAYERED | WS_EX_ TOOLWINDOW) e ()
      su CreateWindowEx
    • Dopo la creazione della finestra, rimosso (WS_EX_DLGMODALFRAME |
      WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)
      dalla finestra stili e anche
      rimosso (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE |
      WS_EX_APPWINDOW)
      dalla finestra estesa stili.

      • Questo mi dà una finestra senza bordi e anche la sua figura ora in
        barra delle applicazioni. anche l’hittest è passato a ciò che è dietro il mio
        finestra.
    • Sottoclasse la procedura di finestra di finestra e ha ottenuto il
      • WM_CLOSE,WM_DESTROY, per inviare il WM_CLOSE o WM_DESTROY rispettivamente alla mia finestra
      • WM_SIZE,WM_MOVE, per ridimensionare e spostare la mia finestra, in accordo con gli altri
        finestra
      • WM_LBUTTONUP,WM_RBUTTONUP,WM_MBUTTONUP, per rendere la mia finestra ha portato al top, e ancora mantenere il focus sull’altra finestra, in modo che la mia finestra non ottenere nascosto dietro la finestra
    • Fatto il dispositivo directx sono due passaggi,
      • Nel primo passaggio attira tutti gli elementi in nero sulla parte superiore di uno sfondo bianco e copiare il backbuffer dati a un’altra superficie.( in modo da dare un’immagine binaria di black & white )
      • Nel secondo passaggio si attira le cose normalmente.
    • Un altro thread è stato creato per continuare a fare la trasparenza della finestra, leggendo che il nero & bianco, superficie, utilizzando SetWindowRgn funzione.

    questo è perfettamente funzionante, l’unica cosa è non è molto a rendere le cose trasparenti.
    e l’altro problema è dare alpha blending di oggetti disegnati.
    ma si può facilmente impostare il toatal alfa(trasparenza) utilizzando la funzione SetLayeredWindowAttributes.

    grazie per tutto l’aiuto che i ragazzi hanno dato, tutte le cose u ragazzi ha detto è stato usato e che mi ha guidato come u può vedere. 🙂
    la cosa triste è che abbiamo deciso di non utilizzare questo metodo a causa di i problemi di efficienza 🙁
    ma ho imparato un sacco di cose ed è stata una bellissima esperienza. e questo è tutto ciò che conta per me 🙂
    grazie 🙂

  2. 2

    È possibile utilizzare WS_EX_LAYERED per bambino di windows da Windows 8.

    Di supporto per le versioni precedenti di windows, basta creare un livello a strati finestra popup (senza cromo), e garantire la sua posizionato sopra la finestra di gioco nella posizione appropriata. La maggior parte degli utenti non spostare le finestre sono al lavoro con tutto il tempo, così, mentre è necessario monitorare la finestra di padre in movimento, e la posizione re HUD, questo non dovrebbe essere un tappo show.

    Non prendere fuoco (in caso di una finestra figlio), attivazione (nel caso di essere un popup) è più interessante, ma ancora non in grado di:- sistema operativo, in realtà, non assegnare automaticamente la messa a fuoco, o l’attivazione di un cliccato finestra di Windows WindowProc ha sempre la messa a fuoco, o di attivazione, chiamando SetFocus, o qualche variante di SetActiveWindow o SetForegroundWindow su se stessa. La cosa importante qui è che se si consumano tutti i mouse e non client messaggi del mouse senza passare per DefWindowProc, l’HUD non potrà mai rubare l’attivazione o il focus della tastiera dalla finestra del Gioco, come risultato di un clic.

    Come una finestra o una finestra su un altro thread, si potrebbe avere di gestirli manualmente tutti i messaggi del mouse la finestra proc fa, e pubblicare la finestra di gioco. In caso contrario, di rispondere a WM_NCHITTEST con HTTRANSPARENT (un effetto simile a quello che WS_EX_TRANSPARENT raggiunge) può ottenere il sistema per mantenere passando il messaggio del mouse verso il basso lo stack fino a quando non trova un bersaglio.

  3. 1

    Si può fare un buco nella finestra genitore utilizzando SetWindowRgn.

    Inoltre, proprio perché non è la vostra finestra non significa che non riesci a fare una finestra a più livelli.

    http://msdn.microsoft.com/en-us/library/ms997507.aspx

    Infine, si può prendere il controllo di un’altra finestra con la creazione di sottoclassi, in sostanza sostituisce il vostro Wndproc in luogo di loro, per gestire i messaggi che si desidera gestire, poi passare il resto della loro originale wndproc.

    • SetWindowRgn() è solo lo schermo per essere disegnata su un certaing la porzione di schermo rito? ho provato e mi può aiutare. grazie. 🙂
    • Ho visto che il link di prima, ho provato anche loro. ma ho paura che se influisce programma(gioco) in qualche altro modo. Così im cercando di non modificare la finestra e che solo ottenere la sua maniglie e altre info e manipolare la mia finestra. grazie per l’idea troppo 🙂

Lascia un commento