Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250

    [C++,API Win32]Visualizzare immagini

    Ciao ragazzi..sto realizzando un "progettino" a console a cui serve aprire un'immagine *.bmp da far visualizzare all'utente.Ho letto che il tutto si può fare con le API di Windows.Poi sono incappato in una guida che parlava di controlli Static e SS_BITMAP ma non so se fa al caso mio...
    Altra domanda:è un problema se continuo a lavorare in modalità console o è necessario che crei un'applicazione Win32Gui?

    P.s. Sono su windows 7 ed utilizzo CodeBlocks

  2. #2

    Re: [C++,API Win32]Visualizzare immagini

    Originariamente inviato da Marco1995
    Ciao ragazzi..sto realizzando un "progettino" a console a cui serve aprire un'immagine *.bmp da far visualizzare all'utente.Ho letto che il tutto si può fare con le API di Windows.Poi sono incappato in una guida che parlava di controlli Static e SS_BITMAP ma non so se fa al caso mio...
    SS_BITMAP va bene solo se la bitmap da caricare sta nelle risorse del programma, se no la questione è più complessa.

    Per caricare una BMP da file devi leggere i suoi vari header (specificati qui) e usare CreateDIBitmap per creare un'HBITMAP.
    A questo punto puoi creare un memory DC (con CreateCompatibleDC) e selezionarci dentro l'HBITMAP. A questo punto con BitBlt puoi copiare l'immagine su altri DC.
    Probabilmente vorrai usare un controllo static owner-draw e, al momento di ridisegnarne il contenuto, andrai a copiare via BitBlt (o StretchBlt se vuoi rimpicciolire l'immagine) l'immagine originale dal memory DC al DC del controllo. In alternativa, puoi fare a meno dello static control e disegnare direttamente sulla superficie della finestra nel WM_PAINT.

    In ogni caso, la programmazione Win32 non è "immediatamente ovvia", per cui se ti imbarchi in questo genere di cose ti conviene recuperare un buon libro in proposito, oppure lavorare con toolkit più astratti (ad esempio le Qt).
    Altra domanda:è un problema se continuo a lavorare in modalità console o è necessario che crei un'applicazione Win32Gui?
    In linea di principio le API in questione possono essere usate da un'applicazione console, ma in tal caso non hai un DC della tua finestra su cui disegnare (la finestra delle applicazioni console viene gestita da CSRSS.exe, e non hai alcun controllo su di essa); puoi al massimo disegnare sul DC relativo allo schermo (che però viene ciclicamente cancellato) o di finestre di altre applicazioni.
    Quindi, in pratica, per fare qualunque cosa di utile devi creare una finestra tua (cosa che puoi fare da un'applicazione console, ma tipicamente non ha molto senso).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quoto MItaly:

    In ogni caso, la programmazione Win32 non è "immediatamente ovvia", per cui se ti imbarchi in questo genere di cose ti conviene recuperare un buon libro in proposito, oppure lavorare con toolkit più astratti (ad esempio le Qt)

    Ti consiglio caldamente le QT per creare applicazioni gui. Tra l'altro sono portabili: con lo stesso codice puoi creare applicazioni e per Windows e per Linux.

    Scarica l'ultima versione da qui:

    http://qt-project.org/downloads

    Prendi la versione con minGW: Qt 5.0.1 for Windows 32-bit (MinGW 4.7, 823 MB)

    Come IDE è incluso l'ottimo Qt Creator. Nel sito trovi tutte le guide e i tutorial necessari.


  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    In ogni caso, la programmazione Win32 non è "immediatamente ovvia", per cui se ti imbarchi in questo genere di cose ti conviene recuperare un buon libro in proposito, oppure lavorare con toolkit più astratti (ad esempio le Qt).
    Quoto MItaly:
    Ok seguirò i vostri consigli,mi documenterò sulle qt.

    Però devo ammettere che la questione mi ha affascinato
    SS_BITMAP va bene solo se la bitmap da caricare sta nelle risorse del programma, se no la questione è più complessa.
    Come faccio ad inserirla nelle risorse del programma?La importo semplicemente nel progetto?
    Per caricare una BMP da file devi leggere i suoi vari header (specificati qui)
    Come faccio a leggere i suoi file header?
    e usare CreateDIBitmap per creare un'HBITMAP.
    A questo punto puoi creare un memory DC (con CreateCompatibleDC) e selezionarci dentro l'HBITMAP. A questo punto con BitBlt puoi copiare l'immagine su altri DC.
    Probabilmente vorrai usare un controllo static owner-draw e, al momento di ridisegnarne il contenuto, andrai a copiare via BitBlt (o StretchBlt se vuoi rimpicciolire l'immagine) l'immagine originale dal memory DC al DC del controllo. In alternativa, puoi fare a meno dello static control e disegnare direttamente sulla superficie della finestra nel WM_PAINT.
    Credo di aver grosso modo capito...ma un passo alla volta
    In linea di principio le API in questione possono essere usate da un'applicazione console, ma in tal caso non hai un DC della tua finestra su cui disegnare (la finestra delle applicazioni console viene gestita da CSRSS.exe, e non hai alcun controllo su di essa); puoi al massimo disegnare sul DC relativo allo schermo (che però viene ciclicamente cancellato) o di finestre di altre applicazioni.
    Quindi, in pratica, per fare qualunque cosa di utile devi creare una finestra tua (cosa che puoi fare da un'applicazione console, ma tipicamente non ha molto senso).
    A me interessava interagire con l'utente tramite console...in base alle scelte si doveva aprire un'immagine...quindi devo crearmi una finestra sulla quale visualizzarmi l'immagine?

    Grazie delle risposte

  5. #5
    Originariamente inviato da Marco1995
    Come faccio ad inserirla nelle risorse del programma?La importo semplicemente nel progetto?
    Dipende dall'IDE usato; quello che poi accade è che l'IDE genera un file .RC contenente le descrizioni delle varie risorse da incorporare e un .h contenente i vari ID delle risorse in questione. Il .RC viene elaborato dal resource compiler che genera un .RES, che contiene effettivamente le risorse e viene incorporato nell'eseguibile finale dal linker.
    Come faccio a leggere i suoi file header?
    fread/stream::read/ReadFile/... dal file (aperto in modalità binaria) direttamente sulle struct specificate lì.
    A me interessava interagire con l'utente tramite console...in base alle scelte si doveva aprire un'immagine...quindi devo crearmi una finestra sulla quale visualizzarmi l'immagine?
    Sì. La cosa più semplice se vuoi fare una cosa del genere credo sia usare un dialogbox modale, che puoi "disegnare" con l'editor di risorse e che si occupa da sé di gestirsi il message loop & co. In ogni caso, come detto sopra, se vuoi fare programmazione Win32 un buon libro è abbastanza indispensabile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Sì. La cosa più semplice se vuoi fare una cosa del genere credo sia usare un dialogbox modale, che puoi "disegnare" con l'editor di risorse e che si occupa da sé di gestirsi il message loop & co. In ogni caso, come detto sopra, se vuoi fare programmazione Win32 un buon libro è abbastanza indispensabile.
    Ok grazie 1000 delle informazioni vedo cosa riuscirò a cavarci fuori...comunque hai qualche libro da consigliarmi in merito?

  7. #7
    Un grande classico è il Petzold (penultima edizione, l'ultima parla sostanzialmente di WinRT); in ogni caso, considera se davvero non ti conviene imparare piuttosto un framework/toolkit di più alto livello, almeno per iniziare: le API Win32 vengono spesso utili, ma se l'obiettivo è sviluppare rapidamente un'applicazione grafica in genere non sono la scelta giusta.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Un grande classico è il Petzold (penultima edizione, l'ultima parla sostanzialmente di WinRT); in ogni caso, considera se davvero non ti conviene imparare piuttosto un framework/toolkit di più alto livello, almeno per iniziare: le API Win32 vengono spesso utili, ma se l'obiettivo è sviluppare rapidamente un'applicazione grafica in genere non sono la scelta giusta.
    Sì..il mio obiettivo è sviluppare rapidamente,anche perchè avrei solo la necessità della "visualizzazione di immagini" ...allora mi converrebbe orientarmi verso le QT e solo in secondo luogo (voglia ammettendo) passare alla considerazione delle API?

    Comunque ho trovato questo documento...ti riferivi a questo?

  9. #9
    Dovrebbe essere lui, ma non mi risulta che sia mai stato distribuito gratuitamente, per cui direi che quella copia è abbondantemente pirata... rimuovo il link.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    250
    Scusa..non era mia intenzione "piratare" ...credevo fosse un libro distribuito gratuitamente
    Ad ogni modo grazie dell'aiuto dato

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 © 2026 vBulletin Solutions, Inc. All rights reserved.