Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Win32 c++] disegni che si cancellano..

    Ciao a tutti,
    Sono alle prese con la progettazione di un programma di disegno. Programmo in win32, adoperando ovviamente il c++.
    Il compilatore da me in uso è Dev-C++, ma ora passiamo al codice e vi illustro il problema:
    Dalla procedura di un dialogo (hWndDlg) parte il disegno su una STATIC (hwndLavagna) figlia della finestra principale (hWndMainFrame):
    codice:
    //...
    case IDOK:                                      
    	hDC = GetDC(hwndLavagna);
    	Ellipse(hDC, 20, 20, 100, 100);
    	ReleaseDC(hwndLavagna, hDC);
            EndDialog(hWndDlg, 0);
            return TRUE;
    //...
    Fin qui tutto bene e funziona alla perfezione, ma quando ridisegno la finesra principale, cioè la metto a riposo a icona, la ingrandisco o la ridimensiono, il l'ellisse sparisce.
    Magari SaveDC() e RestoreDC() possono aiutarmi? ho provato a fare una ricerca su Google ma non ho capito come utilizzare le due funzioni.
    Qualcuno potrebbe aiutarmi? Ringrazio comunque in anticipo.

  2. #2
    L'area della finestra viene ridisegnata quando la finestra viene ridimensionata/spostata/parti della finestra che erano coperte da altro diventano visibili/eccetera.
    Il modo corretto per gestire la questione è disegnare nel WM_PAINT, ovvero quando Windows ti dice "OK, ora bisogna ridisegnare lo sfondo della finestra, tieni questo DC e lavora". Per forzare un WM_PAINT puoi usare la InvalidateRect, oppure puoi usare un approccio ibrido e disegnare quando ti serve, ma salvarti quello che hai disegnato (o in termini di "ho disegnato un ellisse fatto così, una linea fatta cosà, ..." o in una bitmap) e ridisegnarlo nel WM_PAINT.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Mi scuso se non ho risposto ma sono stato via parecchi giorni.
    Intanto ringrazio MItaly per la risposta.
    Se provassi a tenermi in un array le informazioni per il disegno, dentro la WM_PAINT potrei scandirmi questo array e disegnare il tutto ogni volta alla chiamata di InvalidateRect. Invece quando parlavi dell'approccio ibrido come potrei fare? Per esempio se volessi disegnare su una bitmap?
    Scusatemi ma sto cercando di imparare :-)

  4. #4
    Originariamente inviato da maxcorelli
    Invece quando parlavi dell'approccio ibrido come potrei fare?
    L'approccio ibrido che intendevo è disegnare come fai adesso quando ti pare, ma aggiungere anche in tale circostanza l'oggetto da disegnare alla "lista delle cose da disegnare" che viene letta nel WM_PAINT.
    Per esempio se volessi disegnare su una bitmap?
    Devi usare un "memory DC" e selezionarci dentro una bitmap. Qui ci sono un po' di informazioni su come gestire le bitmap.
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.