Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    29

    strana incoerenza C++ win32

    Ciao ragazzi,

    Mi succede una cosa assurda.
    In essenza ho 2 finestre secondarie ciascuna delle quali contiene una bitmap; il codice è analogo per entrambe, ma quando effettuo un resize della finestra dell'applicazione... in una delle finestre secondarie l'immagine rimane e nell'altra sparisce.
    Le finestre secondarie sono create nella window procedure primaria al WM_CREATE e quindi dimensionate al WM_SIZE.
    Questo il codice:

    -----------------------

    // variabili globali per tutto il programma:
    static HBITMAP hBmp1, hBmp2;

    // window procedure 1 (o 2)
    LRESULT CALLBACK WndProcPlayer (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc, hdcMem;
    BITMAP bitmap;
    static int n_ImgW, n_YmgH;
    HINSTANCE hInstance;

    (...)

    case WM_CREATE:

    hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
    hBmp1 = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_1));
    GetObject(hBmp1, sizeof(BITMAP), &bitmap);

    n_ImgW = bitmap.bmWidth;
    n_ImgH = bitmap.bmHeight;

    return 0;


    case WM_PAINT:

    hdc = BeginPaint (hwnd, &ps);

    hdcMem = CreateCompatibleDC(hdc);
    SelectObject(hdcMem, hBmp1); // TODO implementare attraverso scelta utente
    BitBlt(hdc, 0, 0, n_ImgW, n_ImgH, hdcMem, 0, 0, SRCCOPY);

    EndPaint (hwnd, &ps);
    return 0;

    -----------------------

    Qualche consiglio/idea?
    Grazie





  2. #2
    Una cosa che si vede subito è che non deselezioni mai la bitmap da hdcMem e non lo elimini mai, cose che dovresti fare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    29
    Cavolo... ho 40 anni, una volta c'era il basic del commodore 64, oggi è tutto così incasinato.
    Ti ringrazio per le dritte, vado a documentarmi ed apprendere, ciao ciao, alla prossima (spero tra tanto tempo).



  4. #4
    Originariamente inviato da sgnifus
    Cavolo... ho 40 anni, una volta c'era il basic del commodore 64, oggi è tutto così incasinato.
    Se ti consola le specifiche delle API che stai usando sono state scritte con ogni probabilità poco meno di 20 anni fa...
    Ti ringrazio per le dritte, vado a documentarmi ed apprendere, ciao ciao, alla prossima (spero tra tanto tempo).
    Mi raccomando, stai attento a quello che fai con le API di Windows, se non ti prendi un buon libro per studiarle in maniera organica rischi solo di fare pasticci.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    29
    Originariamente inviato da MItaly
    Se ti consola le specifiche delle API che stai usando sono state scritte con ogni probabilità poco meno di 20 anni fa...

    Mi raccomando, stai attento a quello che fai con le API di Windows, se non ti prendi un buon libro per studiarle in maniera organica rischi solo di fare pasticci.
    Avevi ragione, mancava un DeleteDC(hdcMem).
    Ho il Petzold del 2004, molto bello ed esaustivo; alcune porzioni le avrò studiate e ristudiate mille volte ma come vedi sono ancora in alto mare.

  6. #6
    Originariamente inviato da sgnifus
    Avevi ragione, mancava un DeleteDC(hdcMem).
    Non solo, devi anche deselezionare la bitmap dal DC, ripristinando quella contenuta inizialmente nel DC
    codice:
    hdcMem = CreateCompatibleDC(hdc);
    HBITMAP origBmp=(HBITMAP)SelectObject(hdcMem, hBmp1); // TODO implementare attraverso scelta utente
    BitBlt(hdc, 0, 0, n_ImgW, n_ImgH, hdcMem, 0, 0, SRCCOPY);
    SelectObject(hdcMem, origBmp);
    DeleteDC(hdcMem);
    In alternativa potresti anche crearti un DC associato alla bitmap all'inizio del programma ed eliminarlo alla chiusura di esso, evitando tutto questo lavoro ad ogni WM_PAINT.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    29
    Originariamente inviato da MItaly
    Non solo, devi anche deselezionare la bitmap dal DC, ripristinando quella contenuta inizialmente nel DC
    codice:
    hdcMem = CreateCompatibleDC(hdc);
    HBITMAP origBmp=(HBITMAP)SelectObject(hdcMem, hBmp1); // TODO implementare attraverso scelta utente
    BitBlt(hdc, 0, 0, n_ImgW, n_ImgH, hdcMem, 0, 0, SRCCOPY);
    SelectObject(hdcMem, origBmp);
    DeleteDC(hdcMem);
    In alternativa potresti anche crearti un DC associato alla bitmap all'inizio del programma ed eliminarlo alla chiusura di esso, evitando tutto questo lavoro ad ogni WM_PAINT.
    ok, dovrò farti il regalo di natale


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