// mainfrm.cpp : implementation of the CMainFrame class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "docktool.h" #include "tooldlg.h" #include "mainfrm.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_TOOLS_TOOLBAR, OnToolsToolbar) ON_COMMAND(ID_BROWSE_CLASSGRAPH, OnMenuSelection) ON_WM_CLOSE() ON_COMMAND(ID_BROWSE_FILEOUTLINE, OnMenuSelection) ON_COMMAND(ID_BROWSE_GOTODEFINITION, OnMenuSelection) ON_COMMAND(ID_BROWSE_GOTOREFERENCE, OnMenuSelection) ON_COMMAND(ID_BROWSE_REVERSECLASSGRAPH, OnMenuSelection) ON_COMMAND(ID_DEBUG_CALLSTACK, OnMenuSelection) ON_COMMAND(ID_DEBUG_DISASSEMBLY, OnMenuSelection) ON_COMMAND(ID_DEBUG_LOCALS, OnMenuSelection) ON_COMMAND(ID_DEBUG_MEMORY, OnMenuSelection) ON_COMMAND(ID_DEBUG_QUICKWATCH, OnMenuSelection) ON_COMMAND(ID_DEBUG_REGISTERS, OnMenuSelection) ON_COMMAND(ID_DEBUG_RESTART, OnMenuSelection) ON_COMMAND(ID_DEBUG_RUNTOCURSOR, OnMenuSelection) ON_COMMAND(ID_DEBUG_STEPINTO, OnMenuSelection) ON_COMMAND(ID_DEBUG_STEPOUT, OnMenuSelection) ON_COMMAND(ID_DEBUG_STEPOVER, OnMenuSelection) ON_COMMAND(ID_DEBUG_STOPDEBUGGING, OnMenuSelection) ON_COMMAND(ID_DEBUG_WATCH, OnMenuSelection) ON_COMMAND(ID_EDIT_BM_CLEARALL, OnMenuSelection) ON_COMMAND(ID_EDIT_BM_NEXT, OnMenuSelection) ON_COMMAND(ID_EDIT_BM_PREV, OnMenuSelection) ON_COMMAND(ID_EDIT_BM_TOGGLE, OnMenuSelection) ON_COMMAND(ID_EDIT_COPY, OnMenuSelection) ON_COMMAND(ID_EDIT_CUT, OnMenuSelection) ON_COMMAND(ID_EDIT_FINDINFILES, OnMenuSelection) ON_COMMAND(ID_EDIT_INDENT, OnMenuSelection) ON_COMMAND(ID_EDIT_PASTE, OnMenuSelection) ON_COMMAND(ID_EDIT_UNDO, OnMenuSelection) ON_COMMAND(ID_EDIT_UNINDENT, OnMenuSelection) ON_COMMAND(ID_PALETTE_AIRBRUSH, OnMenuSelection) ON_COMMAND(ID_PALETTE_BRUSH, OnMenuSelection) ON_COMMAND(ID_PALETTE_ERASE, OnMenuSelection) ON_COMMAND(ID_PALETTE_EYEDROP, OnMenuSelection) ON_COMMAND(ID_PALETTE_FILL, OnMenuSelection) ON_COMMAND(ID_PALETTE_FRAME, OnMenuSelection) ON_COMMAND(ID_PALETTE_LINE, OnMenuSelection) ON_COMMAND(ID_PALETTE_OVAL, OnMenuSelection) ON_COMMAND(ID_PALETTE_PEN, OnMenuSelection) ON_COMMAND(ID_PALETTE_RECTANGLE, OnMenuSelection) ON_COMMAND(ID_PALETTE_SELECT, OnMenuSelection) ON_COMMAND(ID_PALETTE_ZOOM, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWACCELERATORTABLE, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWBITMAP, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWCURSOR, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWICON, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWMENU, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWSTRINGTABLE, OnMenuSelection) ON_COMMAND(ID_RESOURCE_NEWVERSION, OnMenuSelection) ON_COMMAND(ID_EDIT_FIND, OnMenuSelection) //}}AFX_MSG_MAP // By making the Menu IDs that same as the ToolBar IDs // we can leverage off of code that is already provided // in MFCs implementation of CFrameWnd to check, uncheck // show and hide toolbars. ON_UPDATE_COMMAND_UI(IDW_BROWSE_BAR, OnUpdateControlBarMenu) ON_COMMAND_EX(IDW_BROWSE_BAR, OnBarCheck) ON_UPDATE_COMMAND_UI(IDW_DEBUG_BAR, OnUpdateControlBarMenu) ON_COMMAND_EX(IDW_DEBUG_BAR, OnBarCheck) ON_UPDATE_COMMAND_UI(IDW_EDIT_BAR, OnUpdateControlBarMenu) ON_COMMAND_EX(IDW_EDIT_BAR, OnBarCheck) ON_UPDATE_COMMAND_UI(IDW_PALETTE_BAR, OnUpdateControlBarMenu) ON_COMMAND_EX(IDW_PALETTE_BAR, OnBarCheck) ON_UPDATE_COMMAND_UI(IDW_RESOURCE_BAR, OnUpdateControlBarMenu) ON_COMMAND_EX(IDW_RESOURCE_BAR, OnBarCheck) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // arrays of IDs used to initialize control bars // toolbar buttons - IDs are command buttons static UINT BASED_CODE MainButtons[] = { // same order as in the bitmap 'toolbar.bmp' ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVE, ID_SEPARATOR, ID_EDIT_CUT, ID_EDIT_COPY, ID_EDIT_PASTE, }; static UINT BASED_CODE ResourceButtons[] = { // same order as in the bitmap 'toolbar.bmp' ID_RESOURCE_NEWMENU, ID_RESOURCE_NEWCURSOR, ID_RESOURCE_NEWICON, ID_RESOURCE_NEWBITMAP, ID_RESOURCE_NEWSTRINGTABLE, ID_RESOURCE_NEWACCELERATORTABLE, ID_RESOURCE_NEWVERSION, }; static UINT BASED_CODE DebugButtons[] = { // same order as in the bitmap 'toolbar.bmp' ID_DEBUG_RESTART, ID_DEBUG_STOPDEBUGGING, ID_DEBUG_STEPINTO, ID_DEBUG_STEPOUT, ID_DEBUG_STEPOVER, ID_DEBUG_RUNTOCURSOR, ID_DEBUG_QUICKWATCH, ID_DEBUG_WATCH, ID_DEBUG_LOCALS, ID_DEBUG_REGISTERS, ID_DEBUG_MEMORY, ID_DEBUG_CALLSTACK, ID_DEBUG_DISASSEMBLY, }; static UINT BASED_CODE BrowseButtons[] = { // same order as in the bitmap 'toolbar.bmp' ID_BROWSE_GOTODEFINITION, ID_BROWSE_GOTOREFERENCE, ID_BROWSE_FILEOUTLINE, ID_BROWSE_CLASSGRAPH, ID_BROWSE_REVERSECLASSGRAPH, }; static UINT BASED_CODE PaletteButtons[] = { // same order as in the bitmap 'toolbar.bmp' ID_PALETTE_ERASE, ID_PALETTE_PEN, ID_PALETTE_SELECT, ID_PALETTE_BRUSH, ID_PALETTE_AIRBRUSH, ID_PALETTE_FILL, ID_PALETTE_LINE, ID_PALETTE_EYEDROP, ID_PALETTE_ZOOM, ID_PALETTE_RECTANGLE, ID_PALETTE_FRAME, ID_PALETTE_OVAL, }; static UINT BASED_CODE indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // Helpers for saving/restoring window state static TCHAR BASED_CODE szSection[] = _T("Settings"); static TCHAR BASED_CODE szWindowPos[] = _T("WindowPos"); static TCHAR szFormat[] = _T("%u,%u,%d,%d,%d,%d,%d,%d,%d,%d"); static BOOL PASCAL NEAR ReadWindowPlacement(LPWINDOWPLACEMENT pwp) { CString strBuffer = AfxGetApp()->GetProfileString(szSection, szWindowPos); if (strBuffer.IsEmpty()) return FALSE; WINDOWPLACEMENT wp; int nRead = _stscanf(strBuffer, szFormat, &wp.flags, &wp.showCmd, &wp.ptMinPosition.x, &wp.ptMinPosition.y, &wp.ptMaxPosition.x, &wp.ptMaxPosition.y, &wp.rcNormalPosition.left, &wp.rcNormalPosition.top, &wp.rcNormalPosition.right, &wp.rcNormalPosition.bottom); if (nRead != 10) return FALSE; wp.length = sizeof wp; *pwp = wp; return TRUE; } static void PASCAL NEAR WriteWindowPlacement(LPWINDOWPLACEMENT pwp) // write a window placement to settings section of app's ini file { TCHAR szBuffer[sizeof("-32767")*8 + sizeof("65535")*2]; wsprintf(szBuffer, szFormat, pwp->flags, pwp->showCmd, pwp->ptMinPosition.x, pwp->ptMinPosition.y, pwp->ptMaxPosition.x, pwp->ptMaxPosition.y, pwp->rcNormalPosition.left, pwp->rcNormalPosition.top, pwp->rcNormalPosition.right, pwp->rcNormalPosition.bottom); AfxGetApp()->WriteProfileString(szSection, szWindowPos, szBuffer); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; WINDOWPLACEMENT wp; if (ReadWindowPlacement(&wp)) SetWindowPlacement(&wp); m_bColor = (AfxGetApp()->GetProfileInt(_T("General"),_T("Color"),1)!=0); m_bToolTips = (AfxGetApp()->GetProfileInt(_T("General"),_T("ToolTips"),1)!=0); if (!m_wndMainBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_MAIN_BAR) || !m_wndMainBar.LoadBitmap( (m_bColor)?IDR_COLOR_MAINBAR:IDR_MONO_MAINBAR) || !m_wndMainBar.SetButtons(MainButtons, sizeof(MainButtons)/sizeof(UINT))) { TRACE0("Failed to create mainbar\n"); return -1; // fail to create } if (!m_wndResourceBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_RESOURCE_BAR) || !m_wndResourceBar.LoadBitmap( (m_bColor)?IDR_COLOR_RESOURCEBAR:IDR_MONO_RESOURCEBAR) || !m_wndResourceBar.SetButtons(ResourceButtons, sizeof(ResourceButtons)/sizeof(UINT))) { TRACE0("Failed to create resourcebar\n"); return -1; // fail to create } if (!m_wndDebugBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_DEBUG_BAR) || !m_wndDebugBar.LoadBitmap( (m_bColor)?IDR_COLOR_DEBUGBAR:IDR_MONO_DEBUGBAR) || !m_wndDebugBar.SetButtons(DebugButtons, sizeof(DebugButtons)/sizeof(UINT))) { TRACE0("Failed to create debugbar\n"); return -1; // fail to create } if (!m_wndEditBar.Init(this,m_bColor,m_bToolTips)) { TRACE0("Failed to create editbar\n"); return -1; // fail to create } if (!m_wndBrowseBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_BROWSE_BAR) || !m_wndBrowseBar.LoadBitmap( (m_bColor)?IDR_COLOR_BROWSEBAR:IDR_MONO_BROWSEBAR) || !m_wndBrowseBar.SetButtons(BrowseButtons, sizeof(BrowseButtons)/sizeof(UINT))) { TRACE0("Failed to create browsebar\n"); return -1; // fail to create } if (!m_wndPaletteBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_SIZE_FIXED | CBRS_TOP | ((m_bToolTips)?(CBRS_TOOLTIPS | CBRS_FLYBY):0), IDW_PALETTE_BAR) || !m_wndPaletteBar.LoadBitmap( (m_bColor)?IDR_COLOR_PALETTEBAR:IDR_MONO_PALETTEBAR) || !m_wndPaletteBar.SetButtons(PaletteButtons, sizeof(PaletteButtons)/sizeof(UINT))) { TRACE0("Failed to create palettebar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndMainBar.SetWindowText(_T("Standard")); m_wndMainBar.EnableDocking(CBRS_ALIGN_ANY); m_wndResourceBar.SetWindowText(_T("Resource")); m_wndResourceBar.EnableDocking(CBRS_ALIGN_ANY); m_wndDebugBar.SetWindowText(_T("Debug")); m_wndDebugBar.EnableDocking(CBRS_ALIGN_ANY); m_wndEditBar.SetWindowText(_T("Edit")); m_wndEditBar.EnableDocking(CBRS_ALIGN_ANY); m_wndBrowseBar.SetWindowText(_T("Browse")); m_wndBrowseBar.EnableDocking(CBRS_ALIGN_ANY); m_wndPaletteBar.SetWindowText(_T("Palette")); m_wndPaletteBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndMainBar,AFX_IDW_DOCKBAR_TOP); DockControlBarLeftOf(&m_wndEditBar,&m_wndMainBar); DockControlBarLeftOf(&m_wndBrowseBar,&m_wndEditBar); DockControlBar(&m_wndResourceBar,AFX_IDW_DOCKBAR_BOTTOM); DockControlBarLeftOf(&m_wndDebugBar,&m_wndResourceBar); DockControlBar(&m_wndPaletteBar,AFX_IDW_DOCKBAR_RIGHT); // LoadBarState loads everything but the number of Columns in the Palette // we need to do that ourseleves. m_wndPaletteBar.SetColumns(AfxGetApp()->GetProfileInt(_T("General"),_T("Columns"),3)); LoadBarState(_T("General")); return 0; } void CMainFrame::DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf) { CRect rect; DWORD dw; UINT n; // get MFC to adjust the dimensions of all docked ToolBars // so that GetWindowRect will be accurate RecalcLayout(); LeftOf->GetWindowRect(&rect); rect.OffsetRect(1,0); dw=LeftOf->GetBarStyle(); n = 0; n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n; n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n; n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n; n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n; // When we take the default parameters on rect, DockControlBar will dock // each Toolbar on a seperate line. By calculating a rectangle, we in effect // are simulating a Toolbar being dragged to that location and docked. DockControlBar(Bar,n,&rect); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnToolsToolbar() { CToolDlg ToolDlg; UINT nColumns = m_wndPaletteBar.GetColumns(); nColumns = (nColumns < 4) ? nColumns - 2: 3; // If the style says the ToolBar is visible then it is visible. ToolDlg.m_bMain = ((m_wndMainBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_bResource = ((m_wndResourceBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_bDebug = ((m_wndDebugBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_bEdit = ((m_wndEditBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_bBrowse = ((m_wndBrowseBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_bPalette = ((m_wndPaletteBar.GetStyle() & WS_VISIBLE) != 0); ToolDlg.m_nColumns = nColumns; ToolDlg.m_nColor = (m_bColor) ? 0 : 1; ToolDlg.m_nToolTips = (m_bToolTips) ? 0 : 1; if (IDOK == ToolDlg.DoModal()) { ShowControlBar(&m_wndMainBar, ToolDlg.m_bMain, FALSE); ShowControlBar(&m_wndResourceBar, ToolDlg.m_bResource, FALSE); ShowControlBar(&m_wndDebugBar, ToolDlg.m_bDebug, FALSE); ShowControlBar(&m_wndEditBar, ToolDlg.m_bEdit, FALSE); ShowControlBar(&m_wndBrowseBar, ToolDlg.m_bBrowse, FALSE); ShowControlBar(&m_wndPaletteBar, ToolDlg.m_bPalette, FALSE); m_bToolTips = (ToolDlg.m_nToolTips==0); if (m_bToolTips) { m_wndMainBar.SetBarStyle(m_wndMainBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndResourceBar.SetBarStyle(m_wndResourceBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndDebugBar.SetBarStyle(m_wndDebugBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndEditBar.SetBarStyle(m_wndEditBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndBrowseBar.SetBarStyle(m_wndBrowseBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); m_wndPaletteBar.SetBarStyle(m_wndPaletteBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); } else { m_wndMainBar.SetBarStyle(m_wndMainBar.GetBarStyle() & ~(CBRS_TOOLTIPS | CBRS_FLYBY)); m_wndResourceBar.SetBarStyle(m_wndResourceBar.GetBarStyle() & ~( CBRS_TOOLTIPS | CBRS_FLYBY)); m_wndDebugBar.SetBarStyle(m_wndDebugBar.GetBarStyle() & ~( CBRS_TOOLTIPS | CBRS_FLYBY)); m_wndEditBar.SetBarStyle(m_wndEditBar.GetBarStyle() & ~( CBRS_TOOLTIPS | CBRS_FLYBY)); m_wndBrowseBar.SetBarStyle(m_wndBrowseBar.GetBarStyle() & ~( CBRS_TOOLTIPS | CBRS_FLYBY)); m_wndPaletteBar.SetBarStyle(m_wndPaletteBar.GetBarStyle() & ~( CBRS_TOOLTIPS | CBRS_FLYBY)); } nColumns = (ToolDlg.m_nColumns < 3) ? ToolDlg.m_nColumns + 2 : 6; m_wndPaletteBar.SetColumns(nColumns); m_bColor = (ToolDlg.m_nColor==0); if (m_bColor) { m_wndMainBar.LoadBitmap(IDR_COLOR_MAINBAR); m_wndResourceBar.LoadBitmap(IDR_COLOR_RESOURCEBAR); m_wndDebugBar.LoadBitmap(IDR_COLOR_DEBUGBAR); m_wndBrowseBar.LoadBitmap(IDR_COLOR_BROWSEBAR); m_wndPaletteBar.LoadBitmap(IDR_COLOR_PALETTEBAR); } else { m_wndMainBar.LoadBitmap(IDR_MONO_MAINBAR); m_wndResourceBar.LoadBitmap(IDR_MONO_RESOURCEBAR); m_wndDebugBar.LoadBitmap(IDR_MONO_DEBUGBAR); m_wndBrowseBar.LoadBitmap(IDR_MONO_BROWSEBAR); m_wndPaletteBar.LoadBitmap(IDR_MONO_PALETTEBAR); } m_wndEditBar.SetColor(m_bColor); m_wndMainBar.Invalidate(); m_wndResourceBar.Invalidate(); m_wndDebugBar.Invalidate(); m_wndBrowseBar.Invalidate(); m_wndPaletteBar.Invalidate(); m_wndEditBar.Invalidate(); } } void CMainFrame::OnMenuSelection() { // This sample doesn't do anything with button presses but a command handler // needs to be present for MFC to enable the buttons } void CMainFrame::OnClose() { // SaveBarState saves everything but the number of Columns in the Palette // we need to do that ourseleves. SaveBarState(_T("General")); AfxGetApp()->WriteProfileInt( _T("General"),_T("Columns"),m_wndPaletteBar.GetColumns()); AfxGetApp()->WriteProfileInt( _T("General"),_T("Color"),(m_bColor!=0)); AfxGetApp()->WriteProfileInt( _T("General"),_T("ToolTips"),(m_bToolTips!=0)); WINDOWPLACEMENT wp; wp.length = sizeof wp; if (GetWindowPlacement(&wp)) { wp.flags = 0; if (IsZoomed()) wp.flags |= WPF_RESTORETOMAXIMIZED; // and write it to the .INI file WriteWindowPlacement(&wp); } CFrameWnd::OnClose(); } BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_RBUTTONDOWN) { CWnd* pWnd = CWnd::FromHandlePermanent(pMsg->hwnd); CControlBar* pBar = DYNAMIC_DOWNCAST(CControlBar, pWnd); if (pBar != NULL) { CMenu Menu; CPoint pt; pt.x = LOWORD(pMsg->lParam); pt.y = HIWORD(pMsg->lParam); pBar->ClientToScreen(&pt); if (Menu.LoadMenu(IDR_TOOLBAR)) { CMenu* pSubMenu = Menu.GetSubMenu(0); if (pSubMenu!=NULL) { pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this); } } } } return CFrameWnd::PreTranslateMessage(pMsg); }