|
|
/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "WMITest.h"
#include "MainFrm.h"
#include "OpView.h"
#include "ObjVw.h"
#include "WMITestDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
static TCHAR szWindowPos[] = _T("WindowPos"); static TCHAR szFormat[] = _T("%u,%u,%d,%d,%d,%d,%d,%d,%d,%d");
BOOL ReadWindowPlacement(LPCTSTR szSection, LPCTSTR szValueName, LPWINDOWPLACEMENT pwp) { CString strBuffer = AfxGetApp()->GetProfileString(szSection, szValueName); 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; }
void WriteWindowPlacement(LPCTSTR szSection, LPCTSTR szValueName, 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, szValueName, szBuffer); }
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE() ON_WM_CLOSE() ON_UPDATE_COMMAND_UI(ID_STATUS_NUM_OBJECTS, OnUpdateStatusNumberObjects) ON_WM_DESTROY() ON_WM_INITMENUPOPUP() //}}AFX_MSG_MAP
//ON_WM_INITMENU()
ON_MESSAGE(WM_ENTERMENULOOP, OnEnterMenuLoop) ON_MESSAGE(WM_EXITMENULOOP, OnExitMenuLoop) END_MESSAGE_MAP()
/*
static UINT indicators[] = { ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; */
static UINT indicatorsMenuActive[] = { ID_SEPARATOR, // status line indicator
};
static UINT indicatorsMenuGone[] = { ID_STATUS_NUM_OBJECTS, ID_STATUS1, };
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame() { // TODO: add member initialization code here
}
CMainFrame::~CMainFrame() { }
#define STATUS_SIZE_NUM_OBJ 200
#define STATUS_SIZE_PROGRESS 100
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // Setup the image list.
m_imageList.Create(16, 16, TRUE, 4, 1); AddImage(IDB_ROOT, RGB(0, 0, 255)); AddImageAndBusyImage(IDB_QUERY, RGB(0, 255, 0)); AddImageAndBusyImage(IDB_EVENT_QUERY, RGB(0, 255, 0)); AddImageAndBusyImage(IDB_ENUM_OBJ, RGB(0, 255, 0)); AddImageAndBusyImage(IDB_ENUM_CLASS, RGB(0, 255, 0)); AddImageAndBusyImage(IDB_CLASS, RGB(0, 255, 0)); AddOverlayedImage(IDB_CLASS, IDB_MODIFIED, RGB(0, 255, 0)); AddImageAndBusyImage(IDB_OBJECT, RGB(0, 255, 0)); AddOverlayedImage(IDB_OBJECT, IDB_MODIFIED, RGB(0, 255, 0));
AddImageAndKeyImage(IDB_OBJECT, RGB(0, 255, 0)); AddImageAndKeyImage(IDB_TEXT, RGB(0, 255, 0)); AddImageAndKeyImage(IDB_BINARY, RGB(0, 255, 0));
// Restore the window placement.
WINDOWPLACEMENT wp; wp.length = sizeof wp; if (ReadWindowPlacement(_T("Settings"), _T("WindowPos"), &wp)) { theApp.m_nCmdShow = wp.showCmd; //wp.showCmd = SW_SHOWNORMAL;
// This makes it look better when it starts.
wp.showCmd = SW_HIDE; SetWindowPlacement(&wp); }
if (!m_wndToolBar.CreateEx(this) || !m_wndToolBar.LoadToolBarEx(MAKEINTRESOURCE(IDR_MAINFRAME))) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create
}
if (!m_wndReBar.Create(this) || !m_wndReBar.AddBar(&m_wndToolBar)) //!m_wndReBar.AddBar(&m_wndDlgBar))
{ TRACE0("Failed to create rebar\n"); return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicatorsMenuGone, sizeof(indicatorsMenuGone)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create
}
// TODO: Remove this if you don't want tool tips
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
//LoadBarState(_T("Settings"));
m_wndStatusBar.SetPaneInfo(0, indicatorsMenuGone[0], SBPS_STRETCH, 0); m_wndStatusBar.SetPaneInfo(1, indicatorsMenuGone[1], SBPS_NORMAL, STATUS_SIZE_PROGRESS);
return 0; }
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { // create splitter window
if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE;
int cxCur = AfxGetApp()->GetProfileInt(_T("Settings"), _T("Pane 0 cxCur"), 100);
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(COpView), CSize(cxCur, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CObjView), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; }
return TRUE; }
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); }
void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); }
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
CObjView* CMainFrame::GetRightPane() { CWnd* pWnd = m_wndSplitter.GetPane(0, 1); CObjView* pView = DYNAMIC_DOWNCAST(CObjView, pWnd); return pView; }
void CMainFrame::OnClose() { //SaveBarState("Settings");
// Main window placement
WINDOWPLACEMENT wp;
wp.length = sizeof wp; if (GetWindowPlacement(&wp)) { wp.flags = 0; if (IsZoomed()) wp.flags |= WPF_RESTORETOMAXIMIZED; // and write it to registry
WriteWindowPlacement(_T("Settings"), _T("WindowPos"), &wp); } int cxCur, cxMin;
m_wndSplitter.GetColumnInfo(0, cxCur, cxMin); AfxGetApp()->WriteProfileInt(_T("Settings"), _T("Pane 0 cxCur"), cxCur);
/*
CWMITestDoc *pDoc = (CWMITestDoc*) GetActiveDocument();
pDoc->Disconnect(); */
CFrameWnd::OnClose(); }
void CMainFrame::AddImage(DWORD dwID, COLORREF cr) { CBitmap bmp;
bmp.LoadBitmap(dwID); m_imageList.Add(&bmp, cr); bmp.DeleteObject(); }
void CMainFrame::AddOverlayedImage(int iImage, int iOverlay, COLORREF cr) { CBitmap bmpImage, bmpOverlay, *pbmpOld; CImageList listTemp; HDC hdcScreen = ::GetDC(NULL); CDC dc, *pdcScreen = CDC::FromHandle(hdcScreen); POINT pt = {0, 0};
// Get our image list ready.
dc.CreateCompatibleDC(NULL); listTemp.Create(16, 16, TRUE, 1, 1);
// Paint the busy image onto the normal image.
bmpOverlay.LoadBitmap(iOverlay); listTemp.Add(&bmpOverlay, RGB(0, 255, 0));
bmpImage.LoadBitmap(iImage); pbmpOld = dc.SelectObject(&bmpImage); listTemp.Draw(&dc, 0, pt, ILD_TRANSPARENT); dc.SelectObject(pbmpOld); m_imageList.Add(&bmpImage, cr);
dc.DeleteDC(); ::ReleaseDC(NULL, hdcScreen);
bmpImage.DeleteObject(); bmpOverlay.DeleteObject(); }
void CMainFrame::AddImageAndBusyImage(int iImage, COLORREF cr) { AddImage(iImage, cr); AddOverlayedImage(iImage, IDB_BUSY, cr); AddOverlayedImage(iImage, IDB_ERROR, cr); }
void CMainFrame::AddImageAndKeyImage(int iImage, COLORREF cr) { AddImage(iImage, cr); AddOverlayedImage(iImage, IDB_KEY, cr); }
void CMainFrame::OnUpdateStatusNumberObjects(CCmdUI* pCmdUI) { pCmdUI->SetText(m_strStatus); }
/*
void CMainFrame::OnInitMenu(CMenu* pMenu) { CFrameWnd::OnInitMenu(pMenu); }
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) { return CFrameWnd::OnCommand(wParam, lParam); } */
LRESULT CMainFrame::OnEnterMenuLoop(WPARAM wParam, LPARAM lParam) { m_wndStatusBar.SetIndicators(indicatorsMenuActive, 1);
return 0; }
LRESULT CMainFrame::OnExitMenuLoop(WPARAM wParam, LPARAM lParam) { m_wndStatusBar.SetIndicators(indicatorsMenuGone, 2); m_wndStatusBar.SetPaneInfo(0, indicatorsMenuGone[0], SBPS_STRETCH, 0); m_wndStatusBar.SetPaneInfo(1, indicatorsMenuGone[1], SBPS_NORMAL, STATUS_SIZE_PROGRESS);
return 0; }
void CMainFrame::SetStatusText(LPCTSTR szText) { m_strStatus = szText; }
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); DWORD dwID = pPopupMenu->GetMenuItemID(0);
if (dwID == ID_NO_METHODS_FOUND || dwID == ID_NO_S_METHODS) { CWMITestDoc *pDoc = (CWMITestDoc*) GetActiveDocument(); CObjInfo *pInfo = pDoc->GetCurrentObj(); if (pInfo) { CPropInfoArray *pProps = pInfo->GetProps(); BOOL bStatic = dwID == ID_NO_S_METHODS;
if (pProps && (bStatic && pProps->GetStaticMethodCount()) || (!bStatic && pProps->GetMethodCount())) { // Get rid of the first item since it's only a placeholder.
pPopupMenu->DeleteMenu(0, MF_BYPOSITION);
POSITION pos = pProps->m_listMethods.GetHeadPosition(); DWORD dwID = IDC_EXECUTE_METHOD_FIRST;
while (pos) { CMethodInfo &info = pProps->m_listMethods.GetNext(pos);
// We only add it if we're not in static mode or if
// the method is static anyway.
if (!bStatic || info.m_bStatic) { pPopupMenu->AppendMenu(MF_STRING, dwID, info.m_strName); }
dwID++; } } } } }
|