// ========================================================================== // Class Implementation: COXCustomizeInstanceManagerPage // ========================================================================== // Version: 9.3 // This software along with its related components, documentation and files ("The Libraries") // is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is // governed by a software license agreement ("Agreement"). Copies of the Agreement are // available at The Code Project (www.codeproject.com), as part of the package you downloaded // to obtain this file, or directly from our office. For a copy of the license governing // this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900. // ////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "OXCustomizeInstanceManagerPage.h" #include "UTB64Bit.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif const UINT IDT_OXCUSTOMIZEINSTANCEMANAGER_CHECK_INTANCES=278; const UINT ID_OXCUSTOMIZEINSTANCEMANAGER_CHECK_INTANCES_DELAY=1000; ///////////////////////////////////////////////////////////////////////////// // COXCustomizeInstanceManagerPage dialog IMPLEMENT_DYNCREATE(COXCustomizeInstanceManagerPage, COXCustomizePage) COXCustomizeInstanceManagerPage::COXCustomizeInstanceManagerPage() : m_instanceManager(GetCurrentInstanceName()) { //{{AFX_DATA_INIT(COXCustomizeInstanceManagerPage) m_nInstanceLimitType = 0; m_nMaxAllowedInstanceNumber = 2; //}}AFX_DATA_INIT m_nDialogID=IDD; m_sProfileName.Empty(); m_nTimerCheckInstancesID=0; } COXCustomizeInstanceManagerPage::~COXCustomizeInstanceManagerPage() { } BOOL COXCustomizeInstanceManagerPage:: InitializeInstanceManager(int nMaxAllowedInstances/*=OX_MAX_NUM_INSTANCES_IN_LIST*/, LPCTSTR lpszProfileName/*=_T("CustomizeInstanceManager")*/) { ASSERT(nMaxAllowedInstances>0 && nMaxAllowedInstances<=OX_MAX_NUM_INSTANCES_IN_LIST); if(nMaxAllowedInstances<1 || nMaxAllowedInstances>OX_MAX_NUM_INSTANCES_IN_LIST) { TRACE(_T("COXCustomizeInstanceManagerPage::InitializeInstanceManager: the maximum allowed number of instances=%d is out of range: %d...%d\n"),nMaxAllowedInstances,1,OX_MAX_NUM_INSTANCES_IN_LIST); return FALSE; } m_nMaxAllowedInstanceNumber=nMaxAllowedInstances; CWinApp* pApp=AfxGetApp(); ASSERT(pApp!=NULL); if(lpszProfileName!=NULL) { m_sProfileName=lpszProfileName; m_nMaxAllowedInstanceNumber=pApp->GetProfileInt(m_sProfileName, _T("MaxAllowedInstanceNumber"),m_nMaxAllowedInstanceNumber); } ASSERT(m_nMaxAllowedInstanceNumber>0 && m_nMaxAllowedInstanceNumber<=OX_MAX_NUM_INSTANCES_IN_LIST); m_instanceManager.SetMaxAllowedInstances(m_nMaxAllowedInstanceNumber); m_nInstanceLimitType= (m_nMaxAllowedInstanceNumber==OX_MAX_NUM_INSTANCES_IN_LIST ? 0 : (m_nMaxAllowedInstanceNumber==1 ? 1 : 2)); return TRUE; } BOOL COXCustomizeInstanceManagerPage::OnCloseManager(BOOL bIsOk) { CWinApp* pApp=AfxGetApp(); ASSERT(pApp!=NULL); if(bIsOk) { if(!ApplyChanges()) return FALSE; if(!m_sProfileName.IsEmpty()) { pApp->WriteProfileInt(m_sProfileName, _T("MaxAllowedInstanceNumber"),m_nMaxAllowedInstanceNumber); } } else { if(!m_sProfileName.IsEmpty()) { m_nMaxAllowedInstanceNumber=pApp->GetProfileInt(m_sProfileName, _T("MaxAllowedInstanceNumber"),m_nMaxAllowedInstanceNumber); m_instanceManager.SetMaxAllowedInstances(m_nMaxAllowedInstanceNumber); } } return TRUE; } void COXCustomizeInstanceManagerPage::DoDataExchange(CDataExchange* pDX) { COXCustomizePage::DoDataExchange(pDX); //{{AFX_DATA_MAP(COXCustomizeInstanceManagerPage) DDX_Control(pDX, IDC_OX_SPIN_LIMIT_NUMBER, m_spinMaxAllowedInstances); DDX_Control(pDX, IDC_OX_LIST_INSTANCES, m_listInstances); DDX_Control(pDX, IDC_OX_STATIC_INSTANCE_COUNT, m_staticInstanceCount); DDX_Control(pDX, IDC_OX_SEPARATOR_OPTIONS, m_sepOptions); DDX_Control(pDX, IDC_OX_SEPARATOR_OPERATIONS, m_sepOperations); DDX_Control(pDX, IDC_OX_SEPARATOR_INSTANCES, m_sepInstances); DDX_Radio(pDX, IDC_OX_RADIO_MAXNUMBER_INSTANCE_NOLIMIT, m_nInstanceLimitType); DDX_Text(pDX, IDC_OX_EDIT_LIMIT_NUMBER, m_nMaxAllowedInstanceNumber); DDV_MinMaxUInt(pDX, m_nMaxAllowedInstanceNumber, 1, OX_MAX_NUM_INSTANCES_IN_LIST); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(COXCustomizeInstanceManagerPage, COXCustomizePage) //{{AFX_MSG_MAP(COXCustomizeInstanceManagerPage) ON_BN_CLICKED(IDC_OX_RADIO_MAXNUMBER_INSTANCE_LIMITTO, OnRadioMaxnumberInstanceLimitto) ON_BN_CLICKED(IDC_OX_RADIO_MAXNUMBER_INSTANCE_NOLIMIT, OnRadioMaxnumberInstanceNolimit) ON_BN_CLICKED(IDC_OX_RADIO_MAXNUMBER_INSTANCE_ONLYONE, OnRadioMaxnumberInstanceOnlyone) ON_EN_CHANGE(IDC_OX_EDIT_LIMIT_NUMBER, OnChangeEditLimitNumber) ON_NOTIFY(LVN_ITEMCHANGED, IDC_OX_LIST_INSTANCES, OnItemchangedListInstances) ON_WM_TIMER() ON_WM_DESTROY() ON_BN_CLICKED(IDC_OX_BUTTON_BRING_TO_FRONT, OnButtonBringToFront) ON_BN_CLICKED(IDC_OX_BUTTON_CLOSE, OnButtonClose) ON_BN_CLICKED(IDC_OX_BUTTON_MAXIMIZE, OnButtonMaximize) ON_BN_CLICKED(IDC_OX_BUTTON_MINIMIZE, OnButtonMinimize) ON_BN_CLICKED(IDC_OX_BUTTON_RESTORE, OnButtonRestore) ON_BN_CLICKED(IDC_OX_BUTTON_SWITCH_TO, OnButtonSwitchTo) //}}AFX_MSG_MAP END_MESSAGE_MAP() CString COXCustomizeInstanceManagerPage::GetCurrentInstanceName() { CString sFileName(_T("")); ::GetModuleFileName(NULL,sFileName.GetBuffer(MAX_PATH),MAX_PATH); sFileName.ReleaseBuffer(); #if _MFC_VER>0x0421 sFileName.Remove(_T('\\')); #else int nPos=sFileName.Find(_T('\\')); while(nPos!=-1) { sFileName=sFileName.Left(nPos)+sFileName.Mid(nPos+1); nPos=sFileName.Find(_T('\\')); } #endif // _MFC_VER>0x0421 return sFileName; } ///////////////////////////////////////////////////////////////////////////// // COXCustomizeInstanceManagerPage message handlers BOOL COXCustomizeInstanceManagerPage::Load(const COXCustomizeManager* pCustomizeManager) { // Call default implementation. It will load this demo dialog as the first // page and will create About and CodeSample pages if specified. if(!COXCustomizePage::Load(pCustomizeManager)) return FALSE; return TRUE; } void COXCustomizeInstanceManagerPage::Unload() { // add here code for cleaning up all objects created by demo // // ////////////////////////////////////////////////////////////////////////// COXCustomizePage::Unload(); } void COXCustomizeInstanceManagerPage::OnInitDialog() { // must call default implementation COXCustomizePage::OnInitDialog(); // add here initialization code for your demo dialog. Treat it as a // normal COXCustomizePage::OnInitDialog function m_nTimerCheckInstancesID=SetTimer(IDT_OXCUSTOMIZEINSTANCEMANAGER_CHECK_INTANCES, ID_OXCUSTOMIZEINSTANCEMANAGER_CHECK_INTANCES_DELAY,NULL); ASSERT(m_nTimerCheckInstancesID!=0); m_spinMaxAllowedInstances.SetRange(1,OX_MAX_NUM_INSTANCES_IN_LIST); CString sItem; VERIFY(sItem.LoadString(IDS_OX_CSTMZEINSTANCEINSTANCE)); m_listInstances.InsertColumn(0,sItem,LVCFMT_LEFT,100);//"Instance" VERIFY(sItem.LoadString(IDS_OX_CSTMZEINSTANCEPID)); m_listInstances.InsertColumn(1,sItem,LVCFMT_CENTER,40);//"PID" VERIFY(sItem.LoadString(IDS_OX_CSTMZEINSTANCESTATUS)); m_listInstances.InsertColumn(2,sItem,LVCFMT_CENTER,50);//"Status" PopulateInstancesList(); m_staticInstanceCount.SetTextColor(RGB(0,0,128)); CFont font; VERIFY(font.CreatePointFont(140,_T("Times New Roman"))); m_staticInstanceCount.SetTextFont(&font); // layout // m_LayoutManager.TieChild(&m_sepOptions,OX_LMS_LEFT|OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(&m_sepInstances,OX_LMS_LEFT|OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(&m_listInstances,OX_LMS_ANY,OX_LMT_SAME); m_LayoutManager.TieChild(&m_sepOperations,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_CLOSE,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_SWITCH_TO,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_BRING_TO_FRONT,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_MAXIMIZE,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_MINIMIZE,OX_LMS_RIGHT,OX_LMT_SAME); m_LayoutManager.TieChild(IDC_OX_BUTTON_RESTORE,OX_LMS_RIGHT,OX_LMT_SAME); // /////////////////////////////////////// m_bInitialized=TRUE; UpdateData(FALSE); ShowVars(); } BOOL COXCustomizeInstanceManagerPage::ApplyChanges() { if(!UpdateData(TRUE)) return FALSE; switch(m_nInstanceLimitType) { case 0: m_nMaxAllowedInstanceNumber=OX_MAX_NUM_INSTANCES_IN_LIST; break; case 1: m_nMaxAllowedInstanceNumber=1; break; } m_instanceManager.SetMaxAllowedInstances(m_nMaxAllowedInstanceNumber); return TRUE; } void COXCustomizeInstanceManagerPage::OnRadioMaxnumberInstanceLimitto() { // TODO: Add your control notification handler code here ShowVars(); } void COXCustomizeInstanceManagerPage::OnRadioMaxnumberInstanceNolimit() { // TODO: Add your control notification handler code here ShowVars(); } void COXCustomizeInstanceManagerPage::OnRadioMaxnumberInstanceOnlyone() { // TODO: Add your control notification handler code here ShowVars(); } void COXCustomizeInstanceManagerPage::PopulateInstancesList() { int nInstanceRunningCount=m_instanceManager.GetNumberOfInstances(); CString sInstanceRunningCount; sInstanceRunningCount.Format(_T("%d"),nInstanceRunningCount); m_staticInstanceCount.SetWindowText(sInstanceRunningCount); int nSelectedItem=-1; #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif if(pos!=NULL) { #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); } m_listInstances.DeleteAllItems(); // populate list of all running instances CDWordArray arrInstances; VERIFY(m_instanceManager.GetInstanceCollection(arrInstances)); ASSERT(arrInstances.GetSize()==nInstanceRunningCount); DWORD dwCurrentPID=m_instanceManager.GetCurrentInstanceID(); for(int nIndex=0; nIndex=0 && nSelectedItemEnableWindow(m_nInstanceLimitType==2); GetDlgItem(IDC_OX_SPIN_LIMIT_NUMBER)->EnableWindow(m_nInstanceLimitType==2); #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif if(pos!=NULL) { #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); BOOL bCurrentInstance=(dwPID==m_instanceManager.GetCurrentInstanceID()); GetDlgItem(IDC_OX_BUTTON_CLOSE)->EnableWindow(TRUE); GetDlgItem(IDC_OX_BUTTON_SWITCH_TO)->EnableWindow(!bCurrentInstance); GetDlgItem(IDC_OX_BUTTON_BRING_TO_FRONT)->EnableWindow(!bCurrentInstance); DWORD dwStyle= ::GetWindowLongPtr(m_instanceManager.GetMainWindow(dwPID),GWL_STYLE); BOOL bSysMenu=(dwStyle&WS_SYSMENU)!=0; BOOL bMaximizeBtn=bSysMenu & ((dwStyle&WS_MAXIMIZEBOX)!=0); BOOL bCanMaximize=bMaximizeBtn & ((dwStyle&WS_MAXIMIZE)==0); BOOL bMinimizeBtn=bSysMenu & ((dwStyle&WS_MINIMIZEBOX)!=0); BOOL bCanMinimize=bMinimizeBtn & ((dwStyle&WS_MINIMIZE)==0); GetDlgItem(IDC_OX_BUTTON_MAXIMIZE)->EnableWindow(bCanMaximize); GetDlgItem(IDC_OX_BUTTON_MINIMIZE)->EnableWindow(bCanMinimize); GetDlgItem(IDC_OX_BUTTON_RESTORE)-> EnableWindow(!((bCanMaximize && bCanMinimize) || (!bMaximizeBtn && bCanMinimize) || !bSysMenu)); } else { GetDlgItem(IDC_OX_BUTTON_CLOSE)->EnableWindow(FALSE); GetDlgItem(IDC_OX_BUTTON_SWITCH_TO)->EnableWindow(FALSE); GetDlgItem(IDC_OX_BUTTON_BRING_TO_FRONT)->EnableWindow(FALSE); GetDlgItem(IDC_OX_BUTTON_MAXIMIZE)->EnableWindow(FALSE); GetDlgItem(IDC_OX_BUTTON_MINIMIZE)->EnableWindow(FALSE); GetDlgItem(IDC_OX_BUTTON_RESTORE)->EnableWindow(FALSE); } } void COXCustomizeInstanceManagerPage::OnChangeEditLimitNumber() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the COXCustomizePage::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here if(!m_bInitialized) return; if(!UpdateData(TRUE)) return; } void COXCustomizeInstanceManagerPage::OnItemchangedListInstances(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR; UNREFERENCED_PARAMETER(pNMListView); // TODO: Add your control notification handler code here ShowVars(); *pResult = 0; } void COXCustomizeInstanceManagerPage::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==m_nTimerCheckInstancesID) { int nNewInstanceCount=m_instanceManager.GetNumberOfInstances(); if(nNewInstanceCount!=m_listInstances.GetItemCount()) { PopulateInstancesList(); } return; } COXCustomizePage::OnTimer(nIDEvent); } void COXCustomizeInstanceManagerPage::OnDestroy() { COXCustomizePage::OnDestroy(); // TODO: Add your message handler code here if(m_nTimerCheckInstancesID!=0) { KillTimer(m_nTimerCheckInstancesID); m_nTimerCheckInstancesID=0; } } void COXCustomizeInstanceManagerPage::OnButtonBringToFront() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); BOOL bCurrentInstance=(dwPID==m_instanceManager.GetCurrentInstanceID()); ASSERT(!bCurrentInstance); HWND hWnd= (HWND)(DWORD_PTR)m_instanceManager.GetMainWindow(dwPID); if(::GetWindowLongPtr(hWnd,GWL_STYLE)&WS_MINIMIZE) { OnButtonRestore(); AfxGetMainWnd()->SetForegroundWindow(); } else { ::SetWindowPos(hWnd,AfxGetMainWnd()->GetSafeHwnd(),0,0,0,0, SWP_SHOWWINDOW|SWP_ASYNCWINDOWPOS|SWP_NOACTIVATE| SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW); } ShowVars(); } void COXCustomizeInstanceManagerPage::OnButtonClose() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); VERIFY(m_instanceManager.CloseInstance(dwPID)); ShowVars(); } void COXCustomizeInstanceManagerPage::OnButtonMaximize() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); HWND hWnd=m_instanceManager.GetMainWindow(dwPID); if(::GetWindowLongPtr(hWnd,GWL_STYLE)&WS_MINIMIZE) { ::SendMessage(hWnd,WM_SYSCOMMAND,SC_MAXIMIZE,(LPARAM)hWnd); AfxGetMainWnd()->SetForegroundWindow(); } else { ::SendMessage(hWnd,WM_SYSCOMMAND,SC_MAXIMIZE,(LPARAM)hWnd); } ShowVars(); } void COXCustomizeInstanceManagerPage::OnButtonMinimize() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); HWND hWnd=m_instanceManager.GetMainWindow(dwPID); ::SendMessage(hWnd,WM_SYSCOMMAND,SC_MINIMIZE,(LPARAM)hWnd); ShowVars(); } void COXCustomizeInstanceManagerPage::OnButtonRestore() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); HWND hWnd=m_instanceManager.GetMainWindow(dwPID); if(::GetWindowLongPtr(hWnd,GWL_STYLE)&WS_MINIMIZE) { ::SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,(LPARAM)hWnd); AfxGetMainWnd()->SetForegroundWindow(); } else { ::SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,(LPARAM)hWnd); } ShowVars(); } void COXCustomizeInstanceManagerPage::OnButtonSwitchTo() { // TODO: Add your control notification handler code here #if _MFC_VER > 0x0421 POSITION pos=m_listInstances.GetFirstSelectedItemPosition(); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); POSITION pos = (POSITION) (1+m_listInstances.GetNextItem(-1, LVIS_SELECTED)); #endif ASSERT(pos!=NULL); #if _MFC_VER > 0x0421 int nSelectedItem=m_listInstances.GetNextSelectedItem(pos); #else ASSERT(::IsWindow(m_listInstances.m_hWnd)); int nSelectedItem = (int)pos-1; POSITION npos = (POSITION) (1+m_listInstances.GetNextItem(nSelectedItem, LVIS_SELECTED)); #endif ASSERT(pos==NULL); ASSERT(nSelectedItem!=-1); DWORD_PTR dwPID=m_listInstances.GetItemData(nSelectedItem); BOOL bCurrentInstance=(dwPID==m_instanceManager.GetCurrentInstanceID()); ASSERT(!bCurrentInstance); HWND hWnd=m_instanceManager.GetMainWindow(dwPID); ::SetForegroundWindow(hWnd); if(::GetWindowLongPtr(hWnd,GWL_STYLE)&WS_MINIMIZE) { ::SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,(LPARAM)hWnd); } ShowVars(); }