⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcgpwindowsmanagerdlg.cpp

📁 远程网络监视程序的源码
💻 CPP
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions 
// of the accompanying license agreement.
//*******************************************************************************
//
// This code is based on Ivan Zhakov (vanya@mail.axon.ru)'s
// MDI Windows Manager dialog 
// http://codeguru.developer.com/doc_view/WindowsManager.shtml
//

// BCGPWindowsManagerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "BCGCBPro.h"
#include "BCGPMDIFrameWnd.h"
#include "BCGPMDIChildWnd.h"
#include "BCGPWindowsManagerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBCGPWindowsManagerDlg dialog
UINT WM_BCGWINDOW_HELP		= ::RegisterWindowMessage(_T("WINDOW_HELP"));//WDW

CBCGPWindowsManagerDlg::CBCGPWindowsManagerDlg(CBCGPMDIFrameWnd* pMDIFrame, BOOL bHelpButton)
	: CDialog(CBCGPWindowsManagerDlg::IDD, pMDIFrame),
	m_pMDIFrame (pMDIFrame),
	m_bHelpButton (bHelpButton)
{
	//{{AFX_DATA_INIT(CBCGPWindowsManagerDlg)
	//}}AFX_DATA_INIT
	ASSERT_VALID (m_pMDIFrame);

	m_bMDIActions = TRUE;
}


void CBCGPWindowsManagerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBCGPWindowsManagerDlg)
	DDX_Control(pDX, IDC_BCGBARRES_LIST, m_wndList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CBCGPWindowsManagerDlg, CDialog)
	//{{AFX_MSG_MAP(CBCGPWindowsManagerDlg)
	ON_BN_CLICKED(IDC_BCGBARRES_ACTIVATE, OnActivate)
	ON_BN_CLICKED(IDC_BCGBARRES_SAVE, OnSave)
	ON_BN_CLICKED(IDC_BCGBARRES_CLOSE, OnClose)
	ON_BN_CLICKED(IDC_BCGBARRES_CASCADE, OnCascade)
	ON_BN_CLICKED(IDC_BCGBARRES_TILEHORZ, OnTilehorz)
	ON_BN_CLICKED(IDC_BCGBARRES_TILEVERT, OnTilevert)
	ON_BN_CLICKED(IDC_BCGBARRES_MINIMIZE, OnMinimize)
	ON_LBN_SELCHANGE(IDC_BCGBARRES_LIST, OnSelchangeBcgbarresList)
	ON_WM_DRAWITEM()
	ON_LBN_DBLCLK(IDC_BCGBARRES_LIST, OnActivate)
	ON_BN_CLICKED(ID_HELP, OnBcgbarresWindowHelp)
	ON_WM_HELPINFO()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPWindowsManagerDlg message handlers

void CBCGPWindowsManagerDlg::MDIMessage (UINT uMsg, WPARAM flag)
{
	CWaitCursor wait;
	CBCGPDisableMDIAnimation	no_animation;

	int nItems = m_wndList.GetCount();

	if (nItems != LB_ERR && nItems>0)
	{
		HWND	hMDIClient=m_pMDIFrame->m_hWndMDIClient;
		::LockWindowUpdate(hMDIClient);
		for(int i=nItems-1;i>=0;i--)
		{
			HWND hWnd=(HWND) m_wndList.GetItemData(i);
			if(m_wndList.GetSel(i)>0)	::ShowWindow(hWnd,SW_RESTORE);
			else						::ShowWindow(hWnd,SW_MINIMIZE);
		}
		::SendMessage(hMDIClient,uMsg, flag,0);	
		::LockWindowUpdate(NULL);
	}
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnActivate() 
{
	GetParent ()->SetRedraw (FALSE);

	if(m_wndList.GetSelCount()==1)
	{
		int		index;	
		if(m_wndList.GetSelItems(1,&index)==1)
		{						 
			DWORD dw=m_wndList.GetItemData(index);
			if(dw!=(DWORD) LB_ERR)
			{
				WINDOWPLACEMENT	wndpl;
				wndpl.length = sizeof(WINDOWPLACEMENT);
				::GetWindowPlacement((HWND) dw,&wndpl);

				if(wndpl.showCmd == SW_SHOWMINIMIZED) ::ShowWindow((HWND) dw,SW_RESTORE);
				::SendMessage(m_pMDIFrame->m_hWndMDIClient,WM_MDIACTIVATE,(WPARAM) dw,0);
				EndDialog(IDOK);
			}
		}
	}

	GetParent ()->SetRedraw (TRUE);
	GetParent ()->RedrawWindow (NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnSave() 
{
	int		nItems=m_wndList.GetCount();
	if(nItems!=LB_ERR && nItems>0)
	{
		for(int i=0;i<nItems;i++)
		{
			if(m_wndList.GetSel(i)>0)
			{
				HWND		hWnd=(HWND) m_wndList.GetItemData(i);
				CWnd		*pWnd=CWnd::FromHandle(hWnd);
				CFrameWnd	*pFrame=DYNAMIC_DOWNCAST(CFrameWnd,pWnd);
				if(pFrame != NULL)
				{
					CDocument *pDoc=pFrame->GetActiveDocument();
					if(pDoc != NULL)	pDoc->SaveModified();
				}
			}
		}
	}

	FillWindowList();
	SelActive();
	UpdateButtons();
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnClose() 
{
	int		nItems=m_wndList.GetCount();
	if(nItems!=LB_ERR && nItems>0)
	{
		HWND	hMDIClient=m_pMDIFrame->m_hWndMDIClient;
		
		m_wndList.SetRedraw(FALSE);

		for(int i=nItems-1;i>=0;i--)
		{
			if(m_wndList.GetSel(i)>0)
			{					   
				HWND hWnd=(HWND) m_wndList.GetItemData(i);
				::SendMessage(hWnd,WM_CLOSE,(WPARAM) 0, (LPARAM) 0);
				if(::GetParent(hWnd)==hMDIClient) break;
			}				  
		}
		m_wndList.SetRedraw(TRUE);
	}

	FillWindowList();
	SelActive();
	UpdateButtons();
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnCascade() 
{
	MDIMessage(WM_MDICASCADE,0);
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnTilehorz() 
{
	MDIMessage(WM_MDITILE,MDITILE_HORIZONTAL);	
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnTilevert() 
{
	MDIMessage(WM_MDITILE,MDITILE_VERTICAL);	
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnMinimize() 
{
	CBCGPDisableMDIAnimation	no_animation;

	int		nItems=m_wndList.GetCount();
	if(nItems!=LB_ERR && nItems>0)
	{
		m_wndList.SetRedraw(FALSE);

		for(int i=nItems-1;i>=0;i--)
		{
			if(m_wndList.GetSel(i)>0)
			{
				HWND hWnd=(HWND) m_wndList.GetItemData(i);
				::ShowWindow(hWnd,SW_MINIMIZE);
			}
		}
		m_wndList.SetRedraw(TRUE);
	}

	FillWindowList();
	SelActive();
	UpdateButtons();
}
//**************************************************************************************
BOOL CBCGPWindowsManagerDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	FillWindowList();

	// If no MDI actions are availible, hide all MDI-related buttons:

	if (!m_bMDIActions)
	{
		GetDlgItem(IDC_BCGBARRES_TILEHORZ)->ShowWindow (SW_HIDE);
		GetDlgItem(IDC_BCGBARRES_TILEVERT)->ShowWindow (SW_HIDE);
		GetDlgItem(IDC_BCGBARRES_CASCADE)->ShowWindow (SW_HIDE);
		GetDlgItem(IDC_BCGBARRES_MINIMIZE)->ShowWindow (SW_HIDE);
	}

	SelActive();
	UpdateButtons();

	CWnd* pBtnHelp = GetDlgItem (ID_HELP);
	if (pBtnHelp != NULL)
	{
		pBtnHelp->ShowWindow (m_bHelpButton ? SW_SHOW : SW_HIDE);
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
//**************************************************************************************
void CBCGPWindowsManagerDlg::OnSelchangeBcgbarresList() 
{
	UpdateButtons();
}

// Enables/Disables states of buttons
void CBCGPWindowsManagerDlg::UpdateButtons()
{						   
	int	nSel = m_wndList.GetSelCount ();

	BOOL bClose = nSel > 0;

	for (int i= 0; bClose && i < m_wndList.GetCount (); i++)
	{
		if (m_wndList.GetSel(i) > 0)
		{					   
			HWND hWnd= (HWND) m_wndList.GetItemData (i);
			if (m_lstCloseDisabled.Find (hWnd))
			{
				bClose = FALSE;
			}
		}
	}

	GetDlgItem(IDC_BCGBARRES_CLOSE)->EnableWindow (bClose);

	GetDlgItem(IDC_BCGBARRES_SAVE)->EnableWindow(nSel>0);
	GetDlgItem(IDC_BCGBARRES_TILEHORZ)->EnableWindow(m_bMDIActions && nSel>=2);
	GetDlgItem(IDC_BCGBARRES_TILEVERT)->EnableWindow(m_bMDIActions && nSel>=2);
	GetDlgItem(IDC_BCGBARRES_CASCADE)->EnableWindow(m_bMDIActions && nSel>=2);
	GetDlgItem(IDC_BCGBARRES_MINIMIZE)->EnableWindow(m_bMDIActions && nSel>0);

	GetDlgItem(IDC_BCGBARRES_ACTIVATE)->EnableWindow(nSel==1);
}

// Selects currently active window in listbox
void CBCGPWindowsManagerDlg::SelActive()
{
	int		nItems=m_wndList.GetCount();
	if(nItems != LB_ERR && nItems>0)
	{
	
		m_wndList.SetRedraw(FALSE);
		m_wndList.SelItemRange(FALSE,0,nItems-1);
		
		HWND	hwndActive=(HWND) ::SendMessage(m_pMDIFrame->m_hWndMDIClient,WM_MDIGETACTIVE,0,0);
	
		for(int i=0;i<nItems;i++) {
			if((HWND) m_wndList.GetItemData(i)==hwndActive)  {
				m_wndList.SetSel(i);
				break;
			}
		}
		m_wndList.SetRedraw(TRUE);
	}
}

// Refresh windows list
void CBCGPWindowsManagerDlg::FillWindowList(void)
{
	m_wndList.SetRedraw(FALSE);
	m_wndList.ResetContent();

	m_bMDIActions = TRUE;
	m_lstCloseDisabled.RemoveAll ();

	HWND hwndT = ::GetWindow(m_pMDIFrame->m_hWndMDIClient, GW_CHILD);
	while (hwndT != NULL)
	{
		TCHAR	szWndTitle[256];
		::GetWindowText(hwndT,szWndTitle,sizeof(szWndTitle)/sizeof(szWndTitle[0]));

		int index=m_wndList.AddString(szWndTitle);
		m_wndList.SetItemData(index,(DWORD) hwndT);

		DWORD dwStyle = ::GetWindowLong (hwndT, GWL_STYLE);
		if ((dwStyle & WS_SYSMENU) == 0)
		{
			m_bMDIActions = FALSE;
		}
		else
		{
			HMENU hSysMenu = ::GetSystemMenu (hwndT, FALSE);
			if (hSysMenu == NULL)
			{
				m_bMDIActions = FALSE;
			}
			else
			{
				MENUITEMINFO menuInfo;
				ZeroMemory(&menuInfo,sizeof(MENUITEMINFO));
				menuInfo.cbSize = sizeof(MENUITEMINFO);
				menuInfo.fMask = MIIM_STATE;

				if (!::GetMenuItemInfo(hSysMenu, SC_CLOSE, FALSE, &menuInfo) ||
					(menuInfo.fState & MFS_GRAYED) || 
					(menuInfo.fState & MFS_DISABLED))
				{
					m_lstCloseDisabled.AddTail (hwndT);
				}
			}
		}

		hwndT=::GetWindow(hwndT,GW_HWNDNEXT);
	}

	m_wndList.SetRedraw(TRUE);
}


void CBCGPWindowsManagerDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) 
{
	if(nIDCtl == IDC_BCGBARRES_LIST)
	{
		if (lpDIS->itemID == LB_ERR) return; 
  
		HBRUSH		brBackground;
		RECT		rcTemp = lpDIS->rcItem; 
		HDC			hDC=lpDIS->hDC;

		COLORREF	clText; 

		if (lpDIS->itemState & ODS_SELECTED)  { 
			brBackground = GetSysColorBrush (COLOR_HIGHLIGHT); 
			clText = globalData.clrTextHilite; 
		} else { 
			brBackground = GetSysColorBrush (COLOR_WINDOW); 
			clText = globalData.clrWindowText;
		} 

		if (lpDIS->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) 	FillRect(hDC,&rcTemp, brBackground); 
	
		int			OldBkMode=::SetBkMode(hDC,TRANSPARENT); 
		COLORREF	clOldText=::SetTextColor(hDC,clText); 

		TCHAR		szBuf[1024];
		::SendMessage(lpDIS->hwndItem,LB_GETTEXT,(WPARAM) lpDIS->itemID,(LPARAM) szBuf);		
		
		int h=rcTemp.bottom-rcTemp.top;
		rcTemp.left+=h+4;
		DrawText(hDC,szBuf,-1,&rcTemp,DT_LEFT|DT_VCENTER|	
			DT_NOPREFIX| DT_SINGLELINE);

		HICON	hIcon=(HICON) ::GetClassLong((HWND) lpDIS->itemData,GCL_HICONSM);
		rcTemp.left=lpDIS->rcItem.left;
		::DrawIconEx(hDC,rcTemp.left+2,rcTemp.top,			
			hIcon,h,h,0,0,DI_NORMAL);		
		
		::SetTextColor(hDC,clOldText);
		::SetBkMode(hDC,OldBkMode);
  
		if(lpDIS->itemAction & ODA_FOCUS)   DrawFocusRect(hDC,&lpDIS->rcItem); 
		return;		
	}
	CDialog::OnDrawItem(nIDCtl, lpDIS);
}

void CBCGPWindowsManagerDlg::OnBcgbarresWindowHelp() 
{
	CWnd* pParentFrame = AfxGetMainWnd();
	pParentFrame->SendMessage(WM_BCGWINDOW_HELP, 0, (LPARAM) this);	
}

BOOL CBCGPWindowsManagerDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	pHelpInfo->iCtrlId;
	CWnd* pParentFrame = AfxGetMainWnd();
	pParentFrame->SendMessage(WM_BCGWINDOW_HELP, 0, (LPARAM) this);	
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -