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); }