virtual void draw( HDC hdc ) { LVDrawBuf * drawBuf = getCanvas().get(); drawBuf->DrawTo( hdc, 0, 0, 0, NULL); }
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { case WM_CREATE: { LVDocImageRef img = text_view->getPageImage( 0 ); img->getDrawBuf(); UpdateScrollBar(hWnd); } break; case WM_ERASEBKGND: break; case WM_VSCROLL: { switch (LOWORD(wParam)) { case SB_TOP: DoCommand( hWnd, DCMD_BEGIN ); break; case SB_BOTTOM: DoCommand( hWnd, DCMD_END ); break; case SB_LINEDOWN: DoCommand( hWnd, DCMD_LINEDOWN, 1 ); break; case SB_LINEUP: DoCommand( hWnd, DCMD_LINEUP, 1 ); break; case SB_PAGEDOWN: DoCommand( hWnd, DCMD_PAGEDOWN, 1 ); break; case SB_PAGEUP: DoCommand( hWnd, DCMD_PAGEUP, 1 ); break; case SB_THUMBPOSITION: DoCommand( hWnd, DCMD_GO_POS, text_view->scrollPosToDocPos( HIWORD(wParam) ) ); break; case SB_THUMBTRACK: DoCommand( hWnd, DCMD_GO_POS, text_view->scrollPosToDocPos( HIWORD(wParam) ) ); break; case SB_ENDSCROLL: DoCommand( hWnd, DCMD_GO_POS, text_view->GetPos() ); break; } } break; case WM_SIZE: { if (wParam!=SIZE_MINIMIZED) { text_view->Resize(LOWORD(lParam), HIWORD(lParam)); UpdateScrollBar( hWnd ); } } break; #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #define WHEEL_DELTA 120 /* Value for rolling one detent */ #endif case WM_MOUSEWHEEL: { int delta = ((lInt16)HIWORD(wParam))/WHEEL_DELTA; if (delta<0) DoCommand( hWnd, DCMD_LINEDOWN, 3 ); else if (delta>0) DoCommand( hWnd, DCMD_LINEUP, 3 ); } break; case WM_KEYDOWN: { switch( wParam ) { case VK_F3: { lString8 fn = OpenFileDialog( hWnd ); if ( !fn.empty() ) { text_view->LoadDocument( fn.c_str() ); text_view->Render(); DoCommand( hWnd, DCMD_BEGIN ); } } break; case VK_F2: Export(hWnd, false); break; case VK_F5: Export(hWnd, true); break; case VK_UP: DoCommand( hWnd, DCMD_LINEUP, 1 ); break; case VK_DOWN: DoCommand( hWnd, DCMD_LINEDOWN, 1 ); break; case VK_NEXT: DoCommand( hWnd, DCMD_PAGEDOWN, 1 ); break; case VK_PRIOR: DoCommand( hWnd, DCMD_PAGEUP, 1 ); break; case VK_HOME: DoCommand( hWnd, DCMD_BEGIN ); break; case VK_END: DoCommand( hWnd, DCMD_END ); break; case VK_ADD: case VK_SUBTRACT: { text_view->ZoomFont( wParam==VK_ADD ? 1 : -1 ); UpdateScrollBar( hWnd ); } break; case VK_TAB: { bool shift = (GetKeyState( VK_SHIFT ) & 0x8000)!=0; if ( shift ) text_view->selectPrevPageLink( true ); else text_view->selectNextPageLink( true ); UpdateScrollBar( hWnd ); } //Update(hWnd); break; case VK_RETURN: text_view->goSelectedLink(); UpdateScrollBar( hWnd ); break; case VK_BACK: text_view->goBack(); UpdateScrollBar( hWnd ); break; } } break; case WM_LBUTTONDOWN: { int xPos = lParam & 0xFFFF; int yPos = (lParam >> 16) & 0xFFFF; ldomXPointer ptr = text_view->getNodeByPoint( lvPoint( xPos, yPos ) ); if ( !ptr.isNull() ) { if ( ptr.getNode()->isText() ) { ldomXRange * wordRange = new ldomXRange(); if ( ldomXRange::getWordRange( *wordRange, ptr ) ) { wordRange->setFlags( 0x10000 ); text_view->getDocument()->getSelections().clear(); text_view->getDocument()->getSelections().add( wordRange ); text_view->updateSelections(); UpdateScrollBar( hWnd ); } else { delete wordRange; } } } } break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case ID_ZOOM_IN: case ID_ZOOM_OUT: { text_view->ZoomFont( wParam==ID_ZOOM_IN ? 1 : -1 ); UpdateScrollBar( hWnd ); } break; case IDM_FILE_OPEN: { lString8 fn = OpenFileDialog( hWnd ); if ( !fn.empty() ) { text_view->LoadDocument( fn.c_str() ); text_view->Render(); DoCommand( hWnd, DCMD_BEGIN ); } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); LVDocImageRef img = text_view->getPageImage( 0 ); LVDrawBuf * drawBuf = img->getDrawBuf(); /* ldomXRangeList links; ldomXRangeList & sel = text_view->getDocument()->getSelections(); text_view->getCurrentPageLinks( links ); int linkCount = links.length(); if ( linkCount ) { sel.clear(); sel.add( new ldomXRange(*links[0]) ); for ( int i=0; i<linkCount; i++ ) { lString16 txt = links[i]->getRangeText(); lString8 txt8 = UnicodeToLocal( txt ); const char * s = txt8.c_str(); txt.clear(); } linkCount++; text_view->updateSelections(); } */ drawBuf->DrawTo( hdc, 0, 0, 0, NULL); //COLORREF pal[4]={0xFFFFFF, 0xAAAAAA, 0x555555, 0x000000}; //DrawBuf2DC( hdc, 0, 0, text_view->GetDrawBuf(), pal, 1 ); EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }