// ChildView.cpp : implementation of the CChildView class // #include "../Common.win32/stdafx.h" #include "ChildView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CChildView CChildView::CChildView() { pEmulatorCtrl = NULL; parent = NULL; //pConfig = NULL; } CChildView::~CChildView() { } BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_WM_PAINT() ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SETFOCUS() ON_WM_SETTINGCHANGE() #ifndef UNDER_CE ON_WM_MOUSEACTIVATE() #endif ON_WM_SIZE() // ON_WM_ERASEBACKGND() END_MESSAGE_MAP() // CChildView message handlers BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { OutputDebugString("PreCreateWindow"); if (!CWnd::PreCreateWindow(cs)) return FALSE; /* cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; */ cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(NULL, IDC_SIZEALL /*IDC_ARROW*/), NULL /*reinterpret_cast(COLOR_WINDOW+1)*/, NULL); return TRUE; } int CChildView::CreateEmulatorWindow(CWnd* _w) { /* strMyClass = AfxRegisterWndClass( CS_VREDRAW | CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH), ::LoadIcon(NULL, IDI_APPLICATION)); */ outputInfo("CreateEmulatorWindow w:%X this:%X pEmulator:%X theEmulator:%X\n",_w,this,pEmulatorCtrl,CEmulator::theEmulator); CRect rect; parent = _w; _w->GetClientRect(&rect); outputInfo("Rect width:%d, height:%d\n",rect.Width(),rect.Height()); BOOL (__thiscall CWnd::* p )(LPCTSTR,LPCTSTR,DWORD,const RECT &,CWnd *,UINT,CCreateContext *) = &CChildView::Create; outputInfo("p=%X",p); int r = Create(NULL, _T("activegs"), WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN/*AFX_WS_DEFAULT_VIEW*/, rect,_w // CRect(rect0, 0, 704, 460), // CRect(0, 0, 1000, 600), , AFX_IDW_PANE_FIRST, NULL); SetFocus(); return r; } extern int g_window_width; extern int g_window_height; void CChildView::resize() { extern void window_needs_full_refresh(); if (!parent) return ; RECT rcClient, rcWindow; RECT localClient, localWindow; POINT ptDiff; parent->GetClientRect( &rcClient); parent->GetWindowRect( &rcWindow); GetClientRect( &localClient); GetWindowRect( &localWindow); #ifdef VIDEO_SINGLEVLINE localClient.bottom *=2; #endif ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right; ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom; int nWidth = rcClient.right - rcClient.left; int nHeight = rcClient.bottom - rcClient.top; MoveWindow(0/*rcWindow.left*/, 0/*rcWindow.top*/, nWidth + ptDiff.x, nHeight + ptDiff.y, TRUE); window_needs_full_refresh(); } int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { outputInfo("OnCreate CChildView:%X CurrentEmulator:%X\n",this,CEmulator::theEmulator); if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; #ifdef UNDER_CE DEVMODE mode; memset(&mode,0,sizeof(DEVMODE)); mode.dmSize = sizeof(DEVMODE); mode.dmFields=DM_DISPLAYORIENTATION; mode.dmDisplayOrientation = DMDO_90; LONG Err= ChangeDisplaySettingsEx(NULL,&mode,NULL,0,NULL); if (Err!=DISP_CHANGE_SUCCESSFUL) outputInfo("failed to change display\n"); #endif if (CEmulator::theEmulator) { outputInfo("Emulator was running: kill it (%X)\n",CEmulator::theEmulator); CEmulator::theEmulator->terminateEmulator(); delete CEmulator::theEmulator; } resize(); pEmulatorCtrl = new CEmulatorWin32((CEmulator**)&this->pEmulatorCtrl); //id = pEmulatorCtrl->id; //outputInfo("new emulator (%X)(%X)(%d)\n",this,pEmulatorCtrl,CEmulator::theEmulator->id); hInst = lpCreateStruct->hInstance; CEmulatorConfig* pConfig = &config; // g_download.initPersistentPath(); pEmulatorCtrl->initWindow(m_hWnd,hInst); pEmulatorCtrl->setConfig(pConfig); pEmulatorCtrl->launchEmulator(); return 0; } void CChildView::OnPaint() { if ( pEmulatorCtrl && pEmulatorCtrl == CEmulator::theEmulator ) { CWnd::OnPaint(); } else { PAINTSTRUCT ps; CDC* cdc = BeginPaint(&ps); RECT r; GetClientRect(&r); CBrush brush; brush.CreateSolidBrush(RGB(36,34,244)); cdc->FillRect(&r,&brush); #ifdef UNDER_CE cdc->DrawText( _T("PAUSED"), -1, &r, DT_CENTER|DT_SINGLELINE|DT_VCENTER); #else cdc->SetTextColor(RGB(255,255,255)); cdc->SetBkColor(RGB(36,34,244)); int l = (r.bottom - r.top)/2 - 20; const char* line1="The emulator has been closed as another instance is running."; cdc->TextOut(100 ,l, line1,strlen(line1)); const char line2[]="Refresh this window to re-activate the emulator."; cdc->TextOut(100 ,l+20, line2,strlen(line2)); #endif EndPaint(&ps); } } void CChildView::OnDestroy() { outputInfo("OnDestroy CChildView:%X theEmulator:%X\n",this,pEmulatorCtrl); if (pEmulatorCtrl) { // ASSERT(CEmulator::theEmulator == pEmulatorCtrl); if (CEmulator::theEmulator == pEmulatorCtrl) { pEmulatorCtrl->terminateEmulator(); delete pEmulatorCtrl; pEmulatorCtrl = NULL; } else outputInfo("ERR:OnDestroy but pEMulatorCtrl not owned by us ... CChildView:%X theEmulator:%X\n",this,pEmulatorCtrl); } } LRESULT CChildView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { #if 0 switch(message) { case WM_KEYUP: outputInfo("DefWindowProc: WM_KEYUP: %X\n",wParam); break; case WM_KEYDOWN: outputInfo("DefWindowProc: WM_KEYDOWN: %X\n",wParam); break; default: break; } #endif if (CEmulator::theEmulator && pEmulatorCtrl == CEmulator::theEmulator) return pEmulatorCtrl->windowProc(message,wParam,lParam); else return CWnd::DefWindowProc(message, wParam, lParam); } BOOL CChildView::PreTranslateMessage(MSG* pMsg) { switch(pMsg->message) { case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: case WM_SYSKEYDOWN: if (pEmulatorCtrl && pEmulatorCtrl == CEmulator::theEmulator) pEmulatorCtrl->windowProc(pMsg->message,pMsg->wParam,pMsg->lParam); return 1; /* case WM_LBUTTONDOWN: outputInfo("WM_LBUTTONDOWN\n"); break; case WM_LBUTTONUP: outputInfo("WM_LBUTTONUP\n"); break; */ default: break; } return 0; // to dispatch messag } void CChildView::OnSetFocus(CWnd* pOldWnd ) { // outputInfo("OnSetFocus\n"); CWnd::OnSetFocus(pOldWnd); } CWnd* CChildView::SetFocus() { // outputInfo("SetFocus\n"); CWnd* w = CWnd::SetFocus(); return w; } #ifndef UNDER_CE int CChildView::OnMouseActivate(CWnd* pDesktopWnd,UINT nHitTest,UINT message ) { // outputInfo("child OnMouseActivate\n"); // Was used in the .OCX version // OnActivateInPlace(TRUE, NULL); // OnActivateInPlace() is an undocumented function return CWnd::OnMouseActivate(pDesktopWnd,nHitTest, message); // return MA_ACTIVATEANDEAT ; } #endif BOOL CChildView::OnEraseBkgnd(CDC* pDC) { return 1; } void CChildView::OnSettingChange(UINT uFlags,LPCTSTR lpszSection) { outputInfo("OnSettingChange"); }