498 lines
13 KiB
C++
498 lines
13 KiB
C++
// 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; nIndex<nNumTopics; nIndex++)
|
|
VERIFY(m_shb.InsertLCItem(hGroup, nIndex,
|
|
shbszItems[nIndex], nIndex)==nIndex);
|
|
//////////////////////
|
|
|
|
m_shb.SetGroupHeaderHeight(hGroup,0);
|
|
// expand Statements group
|
|
m_shb.ExpandGroup(hGroup);
|
|
|
|
|
|
DWORD dwBarStyle=m_shb.GetBarStyle();
|
|
dwBarStyle|=SHBS_DISABLEDRAGDROPHEADER|SHBS_DISABLEDRAGDROPITEM|
|
|
SHBS_BOLDEXPANDEDGROUP|SHBS_UNDERLINEHOTITEM|
|
|
SHBS_SHOWACTIVEALWAYS|SHBS_INFOTIP;
|
|
dwBarStyle&=~(SHBS_DRAWITEMDRAGIMAGE|SHBS_DRAWHEADERDRAGIMAGE|
|
|
SHBS_AUTOEXPAND|SHBS_ANIMATEEXPAND|SHBS_EDITITEMS|SHBS_EDITHEADERS);
|
|
m_shb.SetBarStyle(dwBarStyle);
|
|
|
|
// layout manager
|
|
//
|
|
m_LayoutManager.Attach(this);
|
|
|
|
// shortcut bar control
|
|
m_LayoutManager.TieChild(IDC_SHB_TOPICS,
|
|
OX_LMS_TOP|OX_LMS_BOTTOM,OX_LMT_SAME);
|
|
|
|
// topic disclaimer
|
|
m_LayoutManager.TieChild(IDC_TOPIC,
|
|
OX_LMS_TOP|OX_LMS_RIGHT|OX_LMS_LEFT,OX_LMT_SAME);
|
|
|
|
// "Refresh" button
|
|
m_LayoutManager.TieChild(IDC_BUTTON_REFRESH,
|
|
OX_LMS_TOP|OX_LMS_RIGHT,OX_LMT_SAME);
|
|
|
|
// bottom separator
|
|
m_LayoutManager.TieChild(IDC_BOTTOMSEPARATOR,
|
|
OX_LMS_BOTTOM|OX_LMS_RIGHT|OX_LMS_LEFT,OX_LMT_SAME);
|
|
|
|
//////////////////////////////////////
|
|
|
|
// initialize pages
|
|
|
|
// system info
|
|
CSysInfoDialog* pSysInfoDialog=new CSysInfoDialog();
|
|
ASSERT(pSysInfoDialog!=NULL);
|
|
PAGEDIALOG pageDialog(pSysInfoDialog,CSysInfoDialog::IDD);
|
|
m_arrPages.Add(pageDialog);
|
|
//////////////
|
|
|
|
// network resources
|
|
CNetworkResourcesDialog* pNetworkResourcesDialog=
|
|
new CNetworkResourcesDialog();
|
|
ASSERT(pNetworkResourcesDialog!=NULL);
|
|
pageDialog.pPageDialog=pNetworkResourcesDialog;
|
|
pageDialog.nTemplateID=CNetworkResourcesDialog::IDD;
|
|
m_arrPages.Add(pageDialog);
|
|
//////////////
|
|
|
|
// applications
|
|
CApplicationsDialog* pApplicationsDialog=
|
|
new CApplicationsDialog();
|
|
ASSERT(pApplicationsDialog!=NULL);
|
|
pageDialog.pPageDialog=pApplicationsDialog;
|
|
pageDialog.nTemplateID=CApplicationsDialog::IDD;
|
|
m_arrPages.Add(pageDialog);
|
|
//////////////
|
|
|
|
// applications
|
|
CProcessesDialog* pProcessesDialog=
|
|
new CProcessesDialog();
|
|
ASSERT(pProcessesDialog!=NULL);
|
|
pageDialog.pPageDialog=pProcessesDialog;
|
|
pageDialog.nTemplateID=CProcessesDialog::IDD;
|
|
m_arrPages.Add(pageDialog);
|
|
//////////////
|
|
|
|
// services
|
|
if(bIsNTRunning)
|
|
{
|
|
CServicesDialog* pServicesDialog=new CServicesDialog();
|
|
ASSERT(pServicesDialog!=NULL);
|
|
pageDialog.pPageDialog=pServicesDialog;
|
|
pageDialog.nTemplateID=CServicesDialog::IDD;
|
|
m_arrPages.Add(pageDialog);
|
|
}
|
|
//////////////
|
|
|
|
pageDialog.pPageDialog=NULL;
|
|
//////////////////////////////////////
|
|
|
|
m_bInitialized=TRUE;
|
|
|
|
COXSHBListCtrl* pListCtrl=m_shb.GetGroupListCtrl(hGroup);
|
|
ASSERT(pListCtrl!=NULL);
|
|
pListCtrl->ActivateItem(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->nItem<m_arrPages.GetSize())
|
|
{
|
|
CPageDialog* pPageDialog=NULL;
|
|
if(m_nActivePage!=-1)
|
|
{
|
|
pPageDialog=m_arrPages[m_nActivePage].pPageDialog;
|
|
ASSERT(pPageDialog!=NULL);
|
|
ASSERT(::IsWindow(pPageDialog->GetSafeHwnd()));
|
|
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_nActivePage<m_arrPages.GetSize());
|
|
m_arrPages[m_nActivePage].pPageDialog->Refresh();
|
|
}
|
|
|
|
BOOL CSSIDialog::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
ASSERT_VALID(this);
|
|
|
|
if (pMsg->message == WM_KEYDOWN)
|
|
{
|
|
if(m_nActivePage!=-1)
|
|
{
|
|
ASSERT(m_nActivePage>=0 && m_nActivePage<m_arrPages.GetSize());
|
|
if(m_arrPages[m_nActivePage].pPageDialog->
|
|
PreTranslateInput(pMsg))
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
// handle rest with IsDialogMessage
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|