void CViewContainer::SwitchView(EMainView a_view) { if(a_view >= _MAIN_VIEW_MAX || m_curViewType == a_view) { return; } m_curViewType = a_view; SendMessage(WM_SETREDRAW, 0); switch(a_view) { case MAIN_VIEW_RENDERED: m_curViewCtrl = m_renderControl; break; case MAIN_VIEW_CLASSIC: m_curViewCtrl = m_classicControl; break; case MAIN_VIEW_TEXTONLY: m_curViewCtrl = m_textOnlyControl; break; } if(!m_curViewCtrl->ControlCreated()) { RECT l_viewArea = GetClientRect(); m_curViewCtrl->CreateControl(0, 0, l_viewArea.right - l_viewArea.left, l_viewArea.bottom - l_viewArea.top); m_curViewCtrl->SetContextMenu(m_contextMenuHandle, GetParent()); } if(m_nfoData && !m_curViewCtrl->HasNfoData()) { ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); CurAssignNfo(); ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); } if(m_resized) { OnAfterResize(true); } m_renderControl->Show(a_view == MAIN_VIEW_RENDERED); m_classicControl->Show(a_view == MAIN_VIEW_CLASSIC); m_textOnlyControl->Show(a_view == MAIN_VIEW_TEXTONLY); #if 0 // we have three controls so we can't reset this here, or // 1. load NFO // 2. switch to 3rd view // 3. switch to 2nd view // 4. switch to first view // 5. resize window // 6. switch to 2nd view // 7. switch to 3rd view // would cause a wrong control size of the 3rd view control. m_resized = false; #endif SendMessage(WM_SETREDRAW, 1); ::RedrawWindow(GetHwnd(), NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN); }
//--------------------------------------------------------------------------- void __fastcall TFormMachine::FormResize(TObject *Sender) { ImageBuffer->Picture->Bitmap->Width = ClientWidth; ImageBuffer->Picture->Bitmap->Height = ClientHeight; OnAfterResize(); }
LRESULT CViewContainer::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_SIZE: OnAfterResize(false); m_resized = true; break; case WM_ERASEBKGND: // intercept message to avoid flicker during resize return 1; case WM_PAINT: if(m_showInfoBar) { // we need to paint the splitter manually because // we intercept WM_ERASEBKGND. RECT l_viewArea = GetClientRect(); int l_nfoAreaHeight = l_viewArea.bottom - l_viewArea.top - m_infoBarHeight; PAINTSTRUCT l_ps; HDC l_dc = ::BeginPaint(GetHwnd(), &l_ps); RECT l_rect = { 0, l_nfoAreaHeight - ::GetSystemMetrics(SM_CYSIZEFRAME), l_viewArea.right - l_viewArea.left, l_nfoAreaHeight }; ::FillRect(l_dc, &l_rect, ::GetSysColorBrush(COLOR_BTNFACE)); ::EndPaint(GetHwnd(), &l_ps); return 0; } else break; case WM_LBUTTONDOWN: if(IsYOnSplitter(GET_Y_LPARAM(lParam))) { m_infoBarResizing = true; ::SetCursor(::LoadCursor(NULL, IDC_SIZENS)); SetCapture(); } break; case WM_LBUTTONUP: if(IsYOnSplitter(GET_Y_LPARAM(lParam))) { m_infoBarResizing = false; ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); ReleaseCapture(); } break; case WM_MOUSEMOVE: if(m_infoBarResizing) { RECT l_client = GetClientRect(); int l_infoBarHeight = (l_client.bottom - l_client.top - ::GetSystemMetrics(SM_CYSIZEFRAME) / 2) - GET_Y_LPARAM(lParam); if(l_infoBarHeight > INFOBAR_MINIMUM_HEIGHT && l_infoBarHeight < l_client.bottom - l_client.top - INFOBAR_MINIMUM_HEIGHT) { m_infoBarHeight = l_infoBarHeight; OnAfterResize(false); } } else if(IsYOnSplitter(GET_Y_LPARAM(lParam))) { m_cursor = IDC_SIZENS; } else { m_cursor = IDC_ARROW; } break; case WM_CAPTURECHANGED: m_infoBarResizing = false; break; case WM_SETCURSOR: return CUtilWin32GUI::GenericOnSetCursor(m_cursor, lParam); } return WndProcDefault(uMsg, wParam, lParam); }