// SSIDialog.cpp : implementation file // #include "stdafx.h" #include "resource.h" #include "SystemStateInfo.h" #include "SSIDialog.h" #include "SysInfoDialog.h" #include "NetworkResourcesDialog.h" #include "ApplicationsDialog.h" #include "ProcessesDialog.h" #include "ServicesDialog.h" #include "OXSysInfo.h" #include "OXSplashWnd.h" #include "UTSampleAbout.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define NUMTOPICS 5 ///////////////////////////////////////////////////////////////////////////// // CSSIDialog dialog CSSIDialog::CSSIDialog(CWnd* pParent /*=NULL*/) : CDialog(CSSIDialog::IDD, pParent) { //{{AFX_DATA_INIT(CSSIDialog) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 Initialize(); } void CSSIDialog::Initialize() { m_bInitialized=FALSE; m_nActivePage=-1; // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // initialize Taskbar Icon IniTaskbarIcon(); } void CSSIDialog::IniTaskbarIcon() { m_TaskbarIcon.Create(); // When there is only one taskbar icon, you don't need to specify an ID. // The ID is useful only when implementing two (or more) taskbar icons, AND you want // to handle mouse messages from both icons within one message handler (therefore, you // need that ID to tell which icon posted the msg). However, it might be a good idea to // assign an ID, and check the ID in the message handler, especially when you may need // to derive your classes (somebody else may add another taskbar icon). // Note: you don't need to detroy a taskbar icon. It's done in its own destructor. m_TaskbarIcon.m_pPopupOwner = this; // let this dialog handle popup menu's message // Note: m_pPopupOwner is NOT a member of COXTaskbarIcon. m_TaskbarIcon.SetIcon(IDR_MAINFRAME); m_TaskbarIcon.SetTooltipText(IDR_MAINFRAME); m_TaskbarIcon.Show(); } void CSSIDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSSIDialog) DDX_Control(pDX, IDC_BOTTOMSEPARATOR, m_ctlBottomSeparator); DDX_Control(pDX, IDC_BUTTON_REFRESH, m_btnRefresh); DDX_Control(pDX, IDC_TOPIC, m_ctlTopic); DDX_Control(pDX, IDC_SHB_TOPICS, m_shb); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSSIDialog, CDialog) //{{AFX_MSG_MAP(CSSIDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_SIZE() ON_WM_GETMINMAXINFO() ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh) //}}AFX_MSG_MAP ON_COMMAND(IDM_CLOSE, OnClose) ON_COMMAND(IDM_ABOUTBOX, OnAbout) ON_COMMAND(IDM_RESTORE, OnRestore) ON_NOTIFY(SHBN_ACTIVATEITEM,IDC_SHB_TOPICS,OnActivateItem) ON_NOTIFY(SHBN_CONTEXTMENU, IDC_SHB_TOPICS, OnSHBContextMenu) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSSIDialog message handlers BOOL CSSIDialog::OnInitDialog() { CDialog::OnInitDialog(); COXSplashWnd wndSplash; // the fourth parameter is level of tolerance which // indicates how much the color can be different from CLR_DEFAULT (which is white) // before it is actaully accepted as a different color // for bitmap that we use in this application value of 150 is the best wndSplash.LoadBitmap(IDB_LOGO,CLR_NONE,NULL,0); wndSplash.SetUserCancel(FALSE); wndSplash.Show(SPLASH_NOTIMER,NULL); CMenu* pSysMenu = GetSystemMenu(FALSE); // Remove standard Restore, Maximize & Minimize items out of system menu. // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here COXSysInfo m_SysInfo; BOOL bIsNTRunning=FALSE; m_SysInfo.IsNT(&bIsNTRunning); // set text color and font for separator static CFont font; VERIFY(font.CreatePointFont(140,_T("Times New Roman"))); m_ctlTopic.SetFont(&font); m_ctlTopic.SetTextColor(RGB(128,0,0)); // setup bitmap button VERIFY(m_btnRefresh.LoadBitmap(IDB_BITMAP_REFRESH,FALSE,RGB(255,0,255))); m_btnRefresh.SetToolTip(TRUE); m_btnRefresh.SetTrackLook(TRUE); m_btnRefresh.SetImageOffset(CPoint(0,0)); m_btnRefresh.SetInnerFocusOffset(CPoint(2,2)); // create image lists for shortcut bar VERIFY(m_ilLarge.Create(IDB_SHB_LARGE,32,11,RGB(255,0,255))); VERIFY(m_ilSmall.Create(IDB_SHB_SMALL,16,11,RGB(255,0,255))); // populate shortcut bar SHB_GROUPINFO shbGroup; HSHBGROUP hGroup=m_shb.InsertGroup(_T("Topics")); ASSERT(hGroup!=NULL); m_shb.SetLCImageList(hGroup,&m_ilLarge,LVSIL_NORMAL); m_shb.SetLCImageList(hGroup,&m_ilSmall,LVSIL_SMALL); // insert statements // fill standard list controls const int nNumTopics=NUMTOPICS-(bIsNTRunning ? 0 : 1); TCHAR shbszItems[][20]={_T("System Info"),_T("Network Resources"), _T("Applications"), _T("Processes"),_T("Services")/*,_T("DLLs"), _T("Device Drivers"),_T("Perfomance")*/}; for(int nIndex=0; nIndexActivateItem(0); wndSplash.Hide(); PostMessage(WM_NCACTIVATE,TRUE); return FALSE; } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CSSIDialog::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CSSIDialog::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CSSIDialog::OnSysCommand(UINT nID, LPARAM lParam) { if((nID & 0xFFF0) == IDM_ABOUTBOX) OnAbout(); else CDialog::OnSysCommand(nID, lParam); } void CSSIDialog::OnClose() { OnCancel(); } // handling popup menu commands sent by the taskbar icon object void CSSIDialog::OnRestore() { SetForegroundWindow(); PostMessage(WM_SYSCOMMAND,SC_RESTORE); ShowWindow(SW_SHOW); } void CSSIDialog::OnAbout() { CUTSampleAboutDlg dlgAbout(IDR_MAINFRAME,ID_DESCRIPTION_FILE); dlgAbout.DoModal(); } void CSSIDialog::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if(nType==SIZE_MINIMIZED) { m_TaskbarIcon.SetOwner(NULL); // let taskbar icon do it // This is only one way to hide the dialog window. In real situation, you may // want to try DestroyWindow() to conserve system resource if possible (in this // demo, this dialog is the main window). ShowWindow(SW_HIDE); } // TODO: Add your message handler code here if(m_bInitialized) { m_LayoutManager.OnSize(cx,cy); if(m_nActivePage!=-1) { CPageDialog* pPageDialog=NULL; pPageDialog=m_arrPages[m_nActivePage].pPageDialog; ASSERT(pPageDialog!=NULL); ASSERT(::IsWindow(pPageDialog->GetSafeHwnd())); pPageDialog->MoveWindow(GetPageRect()); } } } void CSSIDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Add your message handler code here and/or call default CDialog::OnGetMinMaxInfo(lpMMI); lpMMI->ptMinTrackSize.x=400; lpMMI->ptMinTrackSize.y=300; } void CSSIDialog::OnCancel() { m_arrPages.RemoveAll(); CDialog::OnCancel(); } void CSSIDialog::OnActivateItem(NMHDR* pNotifyStruct, LRESULT* result) { LPNMSHORTCUTBAR pNMSHB=(LPNMSHORTCUTBAR)pNotifyStruct; ASSERT(pNMSHB!=NULL); if(pNMSHB->nItem!=m_nActivePage && pNMSHB->nItem>=0 && pNMSHB->nItemGetSafeHwnd())); pPageDialog->ShowWindow(SW_HIDE); } CRect rectFrame=GetPageRect(); pPageDialog=m_arrPages[pNMSHB->nItem].pPageDialog; ASSERT(pPageDialog!=NULL); if(::IsWindow(pPageDialog->GetSafeHwnd())) { pPageDialog->ShowWindow(SW_SHOW); pPageDialog->MoveWindow(rectFrame); } else { VERIFY(pPageDialog-> Create(MAKEINTRESOURCE(m_arrPages[pNMSHB->nItem].nTemplateID), this,rectFrame,pNMSHB->nItem)); ASSERT(::IsWindow(pPageDialog->GetSafeHwnd())); } pPageDialog->SetFocus(); m_btnRefresh.EnableWindow(pPageDialog->IsRefreshAvailable()); m_nActivePage=pNMSHB->nItem; } ASSERT(m_shb.GetGroupListCtrl(pNMSHB->hGroup)!=NULL); CString sTopic=m_shb.GetGroupListCtrl(pNMSHB->hGroup)-> GetItemText(pNMSHB->nItem,0); m_ctlTopic.SetWindowText(sTopic); Invalidate(); *result=0; } void CSSIDialog::OnSHBContextMenu(NMHDR* pNotifyStruct, LRESULT* pResult) { UNREFERENCED_PARAMETER(pNotifyStruct); *pResult=1; } CRect CSSIDialog::GetPageRect() { CRect rectTopic; m_ctlTopic.GetWindowRect(rectTopic); ScreenToClient(rectTopic); CRect rectRefreshButton; m_btnRefresh.GetWindowRect(rectRefreshButton); ScreenToClient(rectRefreshButton); CRect rectBottomSeparator; m_ctlBottomSeparator.GetWindowRect(rectBottomSeparator); ScreenToClient(rectBottomSeparator); CRect rectPage(rectTopic.left, __max(rectTopic.bottom,rectRefreshButton.bottom)+5, rectRefreshButton.right,rectBottomSeparator.top); return rectPage; } void CSSIDialog::OnButtonRefresh() { // TODO: Add your control notification handler code here ASSERT(m_nActivePage>=0 && m_nActivePageRefresh(); } BOOL CSSIDialog::PreTranslateMessage(MSG* pMsg) { ASSERT_VALID(this); if (pMsg->message == WM_KEYDOWN) { if(m_nActivePage!=-1) { ASSERT(m_nActivePage>=0 && m_nActivePage PreTranslateInput(pMsg)) return TRUE; } } // handle rest with IsDialogMessage return CDialog::PreTranslateMessage(pMsg); }