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

📄 mdichildusermessenger.h

📁 一个使用wtl写的完整的多窗口浏览器
💻 H
字号:
#pragma once
// IWebBrowserEvents2Impl - Windows' MDI messages are not enough
//
/////////////////////////////////////////////////////////////////////////////

DECLARE_REGISTERED_MESSAGE(Mtl_MDIChild_User)

#define MDICHILD_USER_CREATED		0x00000001
#define MDICHILD_USER_CLOSING		0x00000002
#define MDICHILD_USER_DESTROYED		0x00000004
#define MDICHILD_USER_ACTIVATED		0x00000008
#define MDICHILD_USER_DEACTIVATED	0x00000010
#define MDICHILD_USER_VISUALIZED	0x00000020
#define MDICHILD_USER_TITLECHANGED	0x00000040
#define MDICHILD_USER_ALLCLOSED		0x00000080
#define MDICHILD_USER_FIRSTCREATED	0x00000100

#define MSG_WM_USER_MDICHILD(func) \
	if (uMsg == GET_REGISTERED_MESSAGE(Mtl_MDIChild_User)) \
	{ \
		SetMsgHandled(TRUE); \
		func((HWND)wParam, (UINT)lParam); \
		lResult = 0; \
		if(IsMsgHandled()) \
			return TRUE; \
	}

// MDI child user messenger style flags
#define MDICUMS_ONCREATE			0x00000001
#define MDICUMS_ONSETTEXT			0x00000002
#define MDICUMS_ONMDIACTIVATE		0x00000004
#define MDICUMS_ONCLOSE				0x00000008
#define MDICUMS_ONDESTROY			0x00000010

template <class T>
class CMDIChildUserMessenger
{
public:
// Constructor
	CMDIChildUserMessenger()
		: m_dwMDIChildUserMessengerStyle(MDICUMS_ONMDIACTIVATE)
	{
	}

// Attributes
	DWORD m_dwMDIChildUserMessengerStyle;

	void ModifyMDIChildUserMessengerStyle(DWORD dwRemove, DWORD dwAdd)
	{
		m_dwMDIChildUserMessengerStyle = (m_dwMDIChildUserMessengerStyle & ~dwRemove) | dwAdd;
	}	

// Message map and handlers
	BEGIN_MSG_MAP(CMDIChildUserMessenger)
		MSG_WM_CREATE(OnCreate)
		MSG_WM_SETTEXT(OnSetText)
		MSG_WM_MDIACTIVATE(OnMDIActivate)
		MSG_WM_CLOSE(OnClose)
		MSG_WM_DESTROY(OnDestroy)
	END_MSG_MAP()
	
	LRESULT OnCreate(LPCREATESTRUCT)
	{
		SetMsgHandled(FALSE);
		if (m_dwMDIChildUserMessengerStyle & MDICUMS_ONCREATE) {
			T* pT = static_cast<T*>(this);
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_CREATED);
		}
		return 0;
	}

	LRESULT OnSetText(LPCTSTR lpszText)
	{
		SetMsgHandled(FALSE);
		if (m_dwMDIChildUserMessengerStyle & MDICUMS_ONSETTEXT) {
			T* pT = static_cast<T*>(this);
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_TITLECHANGED);
		}
		return FALSE;
	}

	void OnMDIActivate(HWND hwndChildDeact, HWND hwndChildAct)
	{
		SetMsgHandled(FALSE);
		if (!(m_dwMDIChildUserMessengerStyle & MDICUMS_ONMDIACTIVATE))
			return;

		T* pT = static_cast<T*>(this);

		if (hwndChildAct == NULL) {			// all the child windows closed
			ATLTRACE2( atlTraceUser, 4, _T("CMDIChildUserMessenger(%d, %d, %d)\n"),
				GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				::RegisterWindowMessage(_T("Mtl_MDIChild_User")),
				::RegisterWindowMessage(_T("Mtl_Update_CmdUI_Message")) );
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)NULL, (LPARAM)MDICHILD_USER_ALLCLOSED);
			return;
		}
			
		if (hwndChildDeact == NULL) {		// I'm the first child
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_FIRSTCREATED);
		}

		if (hwndChildAct == pT->m_hWnd) {	// I'm activated
			ATLASSERT(hwndChildAct == pT->MDIGetActive());
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_ACTIVATED);
		}
		
		if (hwndChildDeact == pT->m_hWnd) {	// I'm deactivated
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_DEACTIVATED);
		}
	}

	void OnClose()
	{
		SetMsgHandled(FALSE);
		if (m_dwMDIChildUserMessengerStyle & MDICUMS_ONCLOSE) {
			T* pT = static_cast<T*>(this);
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_CLOSING);
		}
	}

	void OnDestroy()
	{
		SetMsgHandled(FALSE);
		if (m_dwMDIChildUserMessengerStyle & MDICUMS_ONDESTROY) {
			T* pT = static_cast<T*>(this);
			::SendMessage(pT->GetMDIFrame(), GET_REGISTERED_MESSAGE(Mtl_MDIChild_User),
				(WPARAM)pT->m_hWnd, (LPARAM)MDICHILD_USER_DESTROYED);
		}
	}
};

⌨️ 快捷键说明

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