Ejemplo n.º 1
0
LRESULT CALLBACK Viewer::WndProcViewer(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    WORD id;
    POINTS pts;
    Viewer *v;

    if(!g_viewer) goto exit1;
    v=g_viewer;

    switch(msg) {
    case WM_ERASEBKGND:
        return 1;
    case WM_PAINT:
    {
        PAINTSTRUCT paintStruct;
        HDC hdc;
        HBRUSH hbr1;
        int rv;

        hdc = BeginPaint(hwnd, &paintStruct);

        if(v->m_dib) {

            v->GoodScrollPos();

            // paint the image
            SetStretchBltMode(hdc,COLORONCOLOR);
            rv=StretchDIBits(hdc,
                             v->m_imgpos_x,v->m_imgpos_y,v->m_stretchedwidth,v->m_stretchedheight,
                             0,0,v->m_dib->biWidth,v->m_dib->biHeight,
                             v->m_bits,(LPBITMAPINFO)v->m_dib,
                             DIB_RGB_COLORS,SRCCOPY);
            if(rv==GDI_ERROR || rv<1) {
                RECT r1;
                // Failure probably means we've exceeded the video system's
                // stretching limits. Draw a black rectangle instead.
                r1.left=v->m_imgpos_x;
                r1.top=v->m_imgpos_y;
                r1.right=v->m_imgpos_x+v->m_stretchedwidth;
                r1.bottom=v->m_imgpos_y+v->m_stretchedheight;
                FillRect(hdc,&r1,(HBRUSH)GetStockObject(BLACK_BRUSH));
            }

            // paint the background
            ExcludeClipRect(hdc,
                            v->m_imgpos_x, v->m_imgpos_y,
                            v->m_imgpos_x+v->m_stretchedwidth, v->m_imgpos_y+v->m_stretchedheight);

            if(globals.window_bgcolor==TWPNG_WBG_SYSDEFAULT) {
                FillRect(hdc,&v->m_clientrect,GetSysColorBrush(COLOR_WINDOW));
            }
            else {

                if(globals.window_bgcolor==TWPNG_WBG_SAMEASIMAGE && v->m_imghasbgcolor)
                    hbr1 = CreateSolidBrush(v->m_imgbgcolor);
                else
                    hbr1 = CreateSolidBrush(globals.custombgcolor);
                FillRect(hdc,&v->m_clientrect,hbr1);
                DeleteObject(hbr1);
            }
        }
        else {
            FillRect(hdc,&v->m_clientrect,GetSysColorBrush(COLOR_WINDOW));

            if(v->m_errorflag) {
                SetTextColor(hdc,RGB(128,0,0));
                SetBkColor(hdc,RGB(255,255,255));
                SetBkMode(hdc,OPAQUE);
                SelectObject(hdc,GetStockObject(ANSI_VAR_FONT));
                DrawText(hdc,v->m_errormsg,-1,&v->m_clientrect,
                         DT_NOPREFIX|DT_WORDBREAK);
            }
        }

        EndPaint(hwnd, &paintStruct);
        return 0;
    }

    case WM_INITMENU:
    {
        HMENU m;
        m=(HMENU)wParam;
        EnableMenuItem(m,ID_COPYIMAGE,MF_BYCOMMAND|(v->m_dib?MF_ENABLED:MF_GRAYED));
        CheckMenuItem(m,ID_GAMMACORRECT,MF_BYCOMMAND|
                      (globals.use_gamma?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_CORRECTNONSQUARE,MF_BYCOMMAND|
                      (globals.viewer_correct_nonsquare?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_BG_CUSTOM,MF_BYCOMMAND|
                      (globals.use_custombg==1 && globals.use_imagebg==0 ? MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_BG_IMAGEORCUSTOM,MF_BYCOMMAND|
                      (globals.use_custombg && globals.use_imagebg ? MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_BG_STRIPALPHA,MF_BYCOMMAND|
                      (globals.use_custombg==0 && globals.use_imagebg==0 ? MF_CHECKED:MF_UNCHECKED));

        CheckMenuItem(m,ID_WBG_SAMEASIMAGE,MF_BYCOMMAND|
                      (globals.window_bgcolor==TWPNG_WBG_SAMEASIMAGE?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_WBG_SYSDEFAULT,MF_BYCOMMAND|
                      (globals.window_bgcolor==TWPNG_WBG_SYSDEFAULT?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_WBG_CUSTOM,MF_BYCOMMAND|
                      (globals.window_bgcolor==TWPNG_WBG_CUSTOM?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_FIT,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_FIT?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_1_8,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_1_8?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_1_4,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_1_4?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_1_2,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_1_2?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_1,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_1?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_2,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_2?MF_CHECKED:MF_UNCHECKED));
        CheckMenuItem(m,ID_ZOOM_4,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_4?MF_CHECKED:MF_UNCHECKED));
        //CheckMenuItem(m,ID_ZOOM_8,MF_BYCOMMAND|(globals.vsize==TWPNG_VS_8?MF_CHECKED:MF_UNCHECKED));
        return 0;
    }

    case WM_DESTROY:
        twpng_StoreWindowPos(hwnd,&globals.window_prefs.viewer);
        delete g_viewer;
        g_viewer=NULL;
        SetFocus(globals.hwndMain);
        return 0;

    case WM_SIZE:
        GetClientRect(hwnd,&v->m_clientrect);
        if(globals.vsize==TWPNG_VS_FIT) v->CalcStretchedSize();
        return 0;

    case WM_DROPFILES:
        if(globals.dlgs_open<1)
            DroppedFiles((HDROP)wParam);
        return 0;

    case WM_LBUTTONDBLCLK:
        if(globals.vsize==TWPNG_VS_1 || globals.vsize==TWPNG_VS_FIT) {
            if(globals.vsize==TWPNG_VS_1)
                globals.vsize=TWPNG_VS_FIT;
            else
                globals.vsize=TWPNG_VS_1;
            v->CalcStretchedSize();
            InvalidateRect(hwnd,NULL,0);
        }
        return 0;

    case WM_LBUTTONDOWN:
        if(v->m_dragging) return 0;
        if(!v->m_dib) return 0;
        SetCapture(hwnd);
        SetCursor(globals.hcurDrag2);
        pts = MAKEPOINTS(lParam);
        v->m_dragstart_x = v->m_imgpos_x - pts.x;
        v->m_dragstart_y = v->m_imgpos_y - pts.y;
        v->m_dragging = 1;
        return 0;

    case WM_LBUTTONUP:
        SetCapture(NULL);
        v->m_dragging=0;
        return 0;


    case WM_MOUSEMOVE:
        if(v->m_dragging) {
            pts = MAKEPOINTS(lParam);
            v->m_imgpos_x = v->m_dragstart_x + pts.x;
            v->m_imgpos_y = v->m_dragstart_y + pts.y;
            InvalidateRect(hwnd,NULL,TRUE);
        }
        return 0;

    case WM_KEYDOWN:
        if(v->HandleKeyDown(hwnd,wParam,lParam)) {
            return 0;
        }
        break;

    case WM_CLOSE: // The user clicked the [x] for the window.
        globals.autoopen_viewer=0;
        break;  // DefWindowProc will send a WM_DESTROY message

    case WM_COMMAND:
        id=LOWORD(wParam);
        switch(id) {
        case ID_CLOSE:
            globals.autoopen_viewer=0;
            DestroyWindow(hwnd);
            return 0;
        case ID_COPYIMAGE:
            v->CopyImage();
            return 0;
        case ID_GAMMACORRECT:
            globals.use_gamma = !globals.use_gamma;
            v->UpdateViewerWindowTitle();
            update_viewer();
            return 0;
        case ID_CORRECTNONSQUARE:
            globals.viewer_correct_nonsquare = !globals.viewer_correct_nonsquare;
            update_viewer();
            return 0;
        case ID_BG_CUSTOM:
            globals.use_imagebg = 0;
            globals.use_custombg = 1;
            v->UpdateViewerWindowTitle();
            update_viewer();
            return 0;
        case ID_BG_IMAGEORCUSTOM:
            globals.use_imagebg = 1;
            globals.use_custombg = 1;
            v->UpdateViewerWindowTitle();
            update_viewer();
            return 0;
        case ID_BG_STRIPALPHA:
            globals.use_imagebg = 0;
            globals.use_custombg = 0;
            v->UpdateViewerWindowTitle();
            update_viewer();
            return 0;
        case ID_WBG_SAMEASIMAGE:
            globals.window_bgcolor = TWPNG_WBG_SAMEASIMAGE;
            InvalidateRect(hwnd,NULL,0);
            break;
        case ID_WBG_SYSDEFAULT:
            globals.window_bgcolor = TWPNG_WBG_SYSDEFAULT;
            InvalidateRect(hwnd,NULL,0);
            break;
        case ID_WBG_CUSTOM:
            globals.window_bgcolor = TWPNG_WBG_CUSTOM;
            InvalidateRect(hwnd,NULL,0);
            break;

        case ID_SETBG:
        {
            unsigned char tmpr,tmpg,tmpb;
            tmpr=GetRValue(globals.custombgcolor);
            tmpg=GetGValue(globals.custombgcolor);
            tmpb=GetBValue(globals.custombgcolor);
            if(choose_color_dialog(hwnd,&tmpr,&tmpg,&tmpb)) {
                globals.custombgcolor = RGB(tmpr,tmpg,tmpb);
                update_viewer();
            }
            return 0;
        }

        case ID_ZOOM_FIT:
            globals.vsize=TWPNG_VS_FIT;
            goto rezoom;
        case ID_ZOOM_1_8:
            globals.vsize=TWPNG_VS_1_8;
            goto rezoom;
        case ID_ZOOM_1_4:
            globals.vsize=TWPNG_VS_1_4;
            goto rezoom;
        case ID_ZOOM_1_2:
            globals.vsize=TWPNG_VS_1_2;
            goto rezoom;
        case ID_ZOOM_2:
            globals.vsize=TWPNG_VS_2;
            goto rezoom;
        case ID_ZOOM_4:
            globals.vsize=TWPNG_VS_4;
            goto rezoom;
        //case ID_ZOOM_8: globals.vsize=TWPNG_VS_8; goto rezoom;
        case ID_ZOOM_1:
            globals.vsize=TWPNG_VS_1;
rezoom:
            v->CalcStretchedSize();
            InvalidateRect(hwnd,NULL,0);
            break;

        }
    }

exit1:
    return DefWindowProc(hwnd, msg, wParam, lParam);

}