[WTL] Dialog-Redraw Problem



  • hallo,
    ich habe einen simplen dialog mit einem CStatic control und zwei buttons erstellt. in das CStatic control wird zur laufzeit, innerhalb der on_paint-methode, eine jpg-datei geladen. das funktioniert auch wunderbar, nur sobald der dialog minimiert und anschließend wieder in den fokus kommt, sind die beiden buttons verschwunden. erst wenn die das dialogfenster manuel ein stück verschiebe, werden die buttons wieder korrekt neugezeichnet. hier ist der code:

    #include <atlmisc.h>
    #include <atlcrack.h>
    
    class CMainDlg : public CDialogImpl<CMainDlg> {
    public:
        enum { IDD = IDD_MAINDLG };
    
        BEGIN_MSG_MAP(CMainDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        MESSAGE_HANDLER(WM_PAINT, on_paint)
        COMMAND_ID_HANDLER(ID_OK, OnCancel)
        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
        END_MSG_MAP()
    
        LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
            // center the dialog on the screen
            CenterWindow();
    
            // set icons
            HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
            SetIcon(hIcon, TRUE);
            HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
            SetIcon(hIconSmall, FALSE);
    
            return TRUE;
        }
    
        void draw_img() {
            // display image
            HWND hwnd = GetDlgItem(ID_PIC);
            CStatic pic_ctrl(hwnd);
            CImage pic_cam;
            CRect rect;
    
            if (pic_cam.Load(L"c:\\test.bmp") == S_OK) {
                pic_ctrl.GetClientRect(&rect);
                pic_cam.StretchBlt(pic_ctrl.GetDC(), 0, 0, rect.Width(), rect.Height(), SRCCOPY);
            } else
                MessageBox(L"Bild konnte nicht geladen werden.", L"Fehler");
        }
    
        LRESULT on_paint(UINT, WPARAM, LPARAM, BOOL& bHandled) {
            draw_img();
            //bHandled = false;             // !!!
            return 0;
        }
    
        LRESULT OnCancel(WORD, WORD wID, HWND, BOOL&) {
            EndDialog(wID);
            return 0;
        }
    };
    

    wenn ich Zeile 45 nicht auskommentiere, werden zwar die buttons korrekt neugezeichnet, allerdings sieht man dann das bild nur noch ganz kurz aufblinken und dann verschwindet es.
    wo liegt denn da der hund begraben?

    lg


Anmelden zum Antworten