亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tabbedmdi.h

?? 一款最完整的工業組態軟源代碼
?? H
?? 第 1 頁 / 共 5 頁
字號:
public:
	void SetTabOwnerParent(HWND hWndTabOwnerParent)
	{
		m_hWndTabOwnerParent = hWndTabOwnerParent;
	}

	HWND GetTabOwnerParent(void) const
	{
		return m_hWndTabOwnerParent;
	}

	TTabOwner& GetTabOwner(void)
	{
		return m_MdiTabOwner;
	}

	void UseMDIChildIcon(BOOL bUseMDIChildIcon = TRUE)
	{
		m_bUseMDIChildIcon = bUseMDIChildIcon;
	}

	void HideMDITabsWhenMDIChildNotMaximized(BOOL bHideMDITabsWhenMDIChildNotMaximized = TRUE)
	{
		m_bHideMDITabsWhenMDIChildNotMaximized = bHideMDITabsWhenMDIChildNotMaximized;
	}

	void SetDrawFlat(bool bDrawFlat = true)
	{
		if(m_bDrawFlat!=bDrawFlat)
		{
			//ATLASSERT((m_hWnd==NULL) && "Please call SetDrawFlat before CreateWindow or SubclassWindow");
			m_bDrawFlat = bDrawFlat;
			if(m_bDrawFlat)
			{
				m_MdiTabOwner.ModifyTabStyles(0,CTCS_FLATEDGE);
			}
			else
			{
				m_MdiTabOwner.ModifyTabStyles(CTCS_FLATEDGE,0);
			}
		}
	}

	bool GetDrawFlat(void) const
	{
		return m_bDrawFlat;
	}

#ifdef __TabbedMDISave_h__

	bool SaveAllModified(bool canPrompt, bool canCancel) const
	{
		if(canPrompt)
		{
			// Prompt using our "Save modified" dialog
			CComPtr<ITabbedMDIChildModifiedList> modifiedItems;
			this->FindModified(&modifiedItems);
			if(modifiedItems)
			{
				long modifiedCount = 0;
				modifiedItems->get_Count(&modifiedCount);
				if(modifiedCount > 0)
				{
					CSaveModifiedItemsDialog dialog(modifiedItems, canCancel);

					INT_PTR response = dialog.DoModal();
					if(response == IDYES)
					{
						// The dialog will update the list and remove
						// any items that the user unchecked

						this->SaveModified(modifiedItems);
					}
					else if(response == IDCANCEL)
					{
						// Not safe to close
						return false;
					}
				}
			}
		}
		else
		{
			// Save all files, but don't ask permission.

			HWND hWndChild = ::GetTopWindow(m_hWnd);
			while(hWndChild != NULL)
			{
				::SendMessage(hWndChild, UWM_MDICHILDSAVEMODIFIED, 0, 0);
				hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT);
			}
		}

		// Safe to terminate the application if desired
		return true;
	}

	HRESULT FindModified(ITabbedMDIChildModifiedList** modifiedItemsOut) const
	{
		CWaitCursor	waitCursor;

		if(modifiedItemsOut == NULL)
		{
			return E_POINTER;
		}
		*modifiedItemsOut = NULL;

		long modifiedCount = 0;

		HRESULT hr = S_OK;

		// Build up a list of all the modified documents
		CComPtr<ITabbedMDIChildModifiedList> modifiedItems;
		::CreateTabbedMDIChildModifiedList(&modifiedItems);

		if(modifiedItems)
		{
			HWND hWndChild = ::GetTopWindow(m_hWnd);
			while(hWndChild != NULL)
			{
				CString windowText;
				int cchWindowText = ::GetWindowTextLength(hWndChild);
				LPTSTR pszText = windowText.GetBuffer(cchWindowText+1);
				cchWindowText = ::GetWindowText(hWndChild, pszText, cchWindowText+1);
				windowText.ReleaseBuffer(cchWindowText);

				CComBSTR defaultName(windowText);

				CComPtr<ITabbedMDIChildModifiedItem> modifiedItem;
				::CreateTabbedMDIChildModifiedItem(hWndChild,
					defaultName, defaultName, defaultName, 0, NULL, &modifiedItem);

				BOOL bIsModified = (BOOL)::SendMessage(hWndChild, UWM_MDICHILDISMODIFIED, 0, (LPARAM)modifiedItem.p);
				if(bIsModified)
				{
					++modifiedCount;

					modifiedItems->Insert(-1, modifiedItem);
				}

				hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT);
			}

			if(modifiedCount > 0)
			{
				modifiedItems.CopyTo(modifiedItemsOut);
			}
		}

		return hr;
	}

	HRESULT SaveModified(ITabbedMDIChildModifiedList* modifiedItems) const
	{
		if(modifiedItems == NULL)
		{
			return E_INVALIDARG;
		}

		CWaitCursor waitCursor;

		HRESULT hr = S_OK;

		long count = 0;
		modifiedItems->get_Count(&count);
		for(long i=0; i<count; ++i)
		{
			CComPtr<ITabbedMDIChildModifiedItem> modifiedItem;
			modifiedItems->get_Item(i, &modifiedItem);
			if(modifiedItem)
			{
				HWND hWnd = NULL;
				modifiedItem->get_Window(&hWnd);
				if(hWnd && ::IsWindow(hWnd))
				{
					::SendMessage(hWnd, UWM_MDICHILDSAVEMODIFIED, 0, (LPARAM)modifiedItem.p);
				}

				// Important!  If an item has sub-items, the "top-level"
				//  item is responsible for ensuring that modifications
				//  are saved.
			}
		}

		return hr;
	}
	
#endif // __TabbedMDISave_h__

	void CloseAll(bool bPreferNoPrompt = false) const
	{
		HWND hWndChild = ::GetTopWindow(m_hWnd);
		while(hWndChild != NULL)
		{
			HWND hWndClose = hWndChild;
			hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT);

			if(bPreferNoPrompt)
			{
				::SendMessage(hWndClose, UWM_MDICHILDCLOSEWITHNOPROMPT, 0, 0L);
			}

			if(::IsWindow(hWndClose))
			{
				// The window doesn't support UWM_MDICHILDCLOSEWITHNOPROMPT
				// or the caller didn't want to close with no prompt,
				// so we'll send a close message it should understand.
				::SendMessage(hWndClose, WM_SYSCOMMAND, SC_CLOSE, 0L);
			}
		}
	}

	BOOL SubclassWindow(HWND hWnd)
	{
		BOOL bSuccess = baseClass::SubclassWindow(hWnd);

		m_bSubclassed = true;

		this->InitTabs();

		m_MdiTabOwner.CalcTabAreaHeight();

		return bSuccess;
	}

	HWND UnsubclassWindow(BOOL bForce = FALSE)
	{
		m_bSubclassed = false;

		return baseClass::UnsubclassWindow(bForce);
	}

protected:
	void InitTabs()
	{
		if( !m_MdiTabOwner.IsWindow() )
		{
			if(m_hWndTabOwnerParent == NULL)
			{
				// If the tab owner's parent is not specified,
				// have the tabs as a sibling
				m_hWndTabOwnerParent = this->GetParent();
			}

			m_MdiTabOwner.Create(
				m_hWndTabOwnerParent, 
				rcDefault, NULL,
				WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN // start out not visible
				);

			m_MdiTabOwner.SetMDIClient(m_hWnd);
		}
	}

// Message Handling
public:
	DECLARE_WND_SUPERCLASS(_T("TabbedMDIClient"), _T("MDIClient"))

	BEGIN_MSG_MAP(CTabbedMDIClient)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
		MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging)
		MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)
		//MESSAGE_HANDLER(WM_MDICREATE, OnMDICreate)
		MESSAGE_HANDLER(WM_MDIDESTROY, OnMDIDestroy)
		MESSAGE_HANDLER(UWM_MDICHILDACTIVATIONCHANGE, OnChildActivationChange)
		MESSAGE_HANDLER(UWM_MDICHILDTABTEXTCHANGE, OnChildTabTextChange)
		MESSAGE_HANDLER(UWM_MDICHILDTABTOOLTIPCHANGE, OnChildTabToolTipChange)
		MESSAGE_HANDLER(UWM_MDICHILDMAXIMIZED, OnChildMaximized)
		MESSAGE_HANDLER(UWM_MDICHILDUNMAXIMIZED, OnChildUnMaximized)
	END_MSG_MAP()

	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		// "base::OnCreate()"
		LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
		bHandled = TRUE;
		if(lRet == -1)
		{
			return -1;
		}

		this->InitTabs();

		m_MdiTabOwner.CalcTabAreaHeight();

		return lRet;
	}

	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		// Say that we didn't handle it so that anyone else
		//  interested gets to handle the message
		bHandled = FALSE;
		return 0;
	}

	LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		// Be sure tab gets message before we recalculate the tab area height
		//  so that it can adjust its font metrics first.
		// NOTE: This causes the tab to get the WM_SETTINGCHANGE message twice,
		//  but that's OK.
		m_MdiTabOwner.GetTabCtrl().SendMessage(uMsg, wParam, lParam);

		m_MdiTabOwner.CalcTabAreaHeight();

		bHandled = FALSE;
		return 0;
	}

	LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
	{
		LPWINDOWPOS pWinPos = reinterpret_cast<LPWINDOWPOS>(lParam);
		if(pWinPos)
		{
			if( m_MdiTabOwner.IsWindow() )
			{
				//ATLTRACE(_T("Resizing MDI tab and MDI client\n"));
				int nTabAreaHeight = (m_MdiTabOwner.IsWindowVisible()) ? m_MdiTabOwner.GetTabAreaHeight() : 0;

				TTabCtrl& TabCtrl = m_MdiTabOwner.GetTabCtrl();
				DWORD dwStyle = TabCtrl.GetStyle();
				if(CTCS_BOTTOM == (dwStyle & CTCS_BOTTOM))
				{
					m_MdiTabOwner.SetWindowPos(
						NULL,
						pWinPos->x, pWinPos->y + (pWinPos->cy - nTabAreaHeight),
						pWinPos->cx, nTabAreaHeight,
						(pWinPos->flags & SWP_NOMOVE) | (pWinPos->flags & SWP_NOSIZE) | SWP_NOZORDER | SWP_NOACTIVATE);

					if((pWinPos->flags & SWP_NOSIZE) == 0)
					{
						pWinPos->cy -= nTabAreaHeight;
					}
				}
				else
				{
					m_MdiTabOwner.SetWindowPos(
						NULL,
						pWinPos->x, pWinPos->y,
						pWinPos->cx, nTabAreaHeight,
						(pWinPos->flags & SWP_NOMOVE) | (pWinPos->flags & SWP_NOSIZE) | SWP_NOZORDER | SWP_NOACTIVATE);

					if((pWinPos->flags & SWP_NOMOVE) == 0)
					{
						pWinPos->y += nTabAreaHeight;
					}
					if((pWinPos->flags & SWP_NOSIZE) == 0)
					{
						pWinPos->cy -= nTabAreaHeight;
					}
				}
			}
		}

		// "base::OnWindowPosChanging()"
		LRESULT lRet = this->DefWindowProc(uMsg, wParam, lParam);
		bHandled = TRUE;

		return lRet;
	}

	LRESULT OnNcPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{

		if(m_bDrawFlat &&
			WS_EX_CLIENTEDGE == (this->GetExStyle() & WS_EX_CLIENTEDGE))
		{
			// When we have WS_EX_CLIENTEDGE and drawing "flat",
			// we'll paint the non-client edges ourself with a more flat look.
			// NOTE: If WS_EX_CLIENTEDGE ever takes up more than 2 pixels
			// on each edge, update the drawing code.

			CDC dc(this->GetWindowDC());
			if(dc)
			{
				RECT rcWindow;
				this->GetWindowRect(&rcWindow);
				::OffsetRect(&rcWindow, -rcWindow.left, -rcWindow.top);
				dc.DrawEdge(&rcWindow, EDGE_ETCHED, BF_FLAT|BF_RECT);
			}

			/*
			// Note: The documentation says the flags should be
			// DCX_WINDOW|DCX_INTERSECTRGN
			// but that wasn't working.
			// On http://freespace.virgin.net/james.brown7/tutorials/tips.htm
			// they mention you also need to OR in the flag "0x10000".
			CDC dc(this->GetDCEx((HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN | 0x10000));
			if(dc)
			{
				RECT rcWindow;
				this->GetWindowRect(&rcWindow);
				::OffsetRect(&rcWindow, -rcWindow.left, -rcWindow.top);
				dc.DrawEdge(&rcWindow, EDGE_ETCHED, BF_FLAT|BF_RECT);
			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一线二线三线视频| 在线观看一区二区视频| 99久久99久久精品国产片果冻 | 国产免费观看久久| 一区二区三区免费看视频| 久久激情五月婷婷| 91成人看片片| 国产精品情趣视频| 国模冰冰炮一区二区| 欧美日韩一级视频| 综合网在线视频| 国产一区二区三区在线观看精品| 欧美午夜影院一区| 中文一区二区在线观看| 蜜桃视频免费观看一区| 91极品视觉盛宴| 亚洲色图视频网| 成人高清免费在线播放| 久久你懂得1024| 日本aⅴ免费视频一区二区三区| 一本一道久久a久久精品| 亚洲国产激情av| 国产乱子轮精品视频| 日韩午夜激情免费电影| 亚洲www啪成人一区二区麻豆| 99国产精品99久久久久久| 久久久久青草大香线综合精品| 免费av成人在线| 欧美私模裸体表演在线观看| 亚洲免费视频成人| 色综合久久久久综合体| 中文字幕一区二| 波多野洁衣一区| 国产精品伦理在线| 成人免费视频播放| 国产精品福利电影一区二区三区四区| 国产自产高清不卡| 久久综合久久99| 国内精品伊人久久久久影院对白| 欧美成人激情免费网| 麻豆极品一区二区三区| 精品国产一区二区三区久久久蜜月| 日韩在线a电影| 51久久夜色精品国产麻豆| 日本不卡一区二区三区| 日韩一区二区视频| 国产精品系列在线播放| 欧美极品少妇xxxxⅹ高跟鞋| 不卡一区在线观看| 亚洲三级在线免费| 精品视频一区二区不卡| 天天综合天天综合色| 日韩欧美一级二级三级久久久| 久久狠狠亚洲综合| 欧美国产精品劲爆| 日本高清成人免费播放| 午夜欧美大尺度福利影院在线看| 日韩一区二区在线看片| 国产精品影视天天线| 久久久影视传媒| 99re在线精品| 婷婷六月综合网| 久久久激情视频| 在线欧美小视频| 蜜桃久久av一区| 中文字幕在线一区| 欧美日韩在线三区| 国产成人精品一区二| 亚洲在线一区二区三区| 久久―日本道色综合久久| 91在线视频播放地址| 奇米色一区二区| 国产亚洲婷婷免费| 欧美日韩你懂得| av网站免费线看精品| 欧美丝袜第三区| 日韩一二三区不卡| 亚洲一区二区三区中文字幕| 国产麻豆成人传媒免费观看| 欧美日韩在线播放三区四区| 国产精品丝袜一区| 久久99久久99| 久久久国产午夜精品| 日本女优在线视频一区二区| 老司机精品视频线观看86| 久久男人中文字幕资源站| 91免费在线播放| 久久精品国产亚洲一区二区三区| 国产精品进线69影院| 日韩一区二区精品| 成人高清视频在线| 国产精品小仙女| 蜜芽一区二区三区| 亚洲成人7777| 亚洲欧洲av色图| 国产欧美视频一区二区| 欧美一区二区成人6969| 欧美在线免费视屏| 99视频精品全部免费在线| 国产一区免费电影| 午夜av电影一区| 一区二区三区免费观看| 亚洲视频图片小说| 国产精品视频九色porn| 久久奇米777| 欧美精品一区二区在线播放| 91精品欧美久久久久久动漫| 欧美性极品少妇| 欧美优质美女网站| 色婷婷狠狠综合| 一本大道av一区二区在线播放| 成人综合激情网| 九色porny丨国产精品| 丝袜诱惑亚洲看片| 天天操天天色综合| 午夜伊人狠狠久久| 五月天亚洲精品| 五月天丁香久久| 日本午夜一区二区| 麻豆精品国产91久久久久久| 奇米888四色在线精品| 喷白浆一区二区| 精彩视频一区二区| 国产精品一区免费在线观看| 国内精品久久久久影院色| 韩国av一区二区| 福利一区二区在线| 成人免费福利片| 99精品国产99久久久久久白柏 | 国产精品―色哟哟| 国产精品久久一卡二卡| 国产精品久线在线观看| 中文字幕在线一区免费| 亚洲在线免费播放| 日韩精品亚洲一区二区三区免费| 麻豆成人在线观看| 国产高清不卡一区| 色欧美日韩亚洲| 91精品国产综合久久久久久久久久| 日韩一区二区电影网| 久久女同性恋中文字幕| 亚洲少妇最新在线视频| 五月婷婷激情综合网| 黄色日韩三级电影| 99视频在线观看一区三区| 欧美网站大全在线观看| 欧美大胆人体bbbb| 国产精品国产自产拍高清av王其| 亚洲国产一二三| 九色|91porny| 色综合久久88色综合天天免费| 7777精品久久久大香线蕉| 久久婷婷综合激情| 一区二区三区欧美| 国产精品自拍三区| 在线观看中文字幕不卡| 精品福利视频一区二区三区| 自拍偷拍亚洲综合| 久88久久88久久久| 色偷偷成人一区二区三区91| 日韩精品一区二区三区在线| 国产精品毛片无遮挡高清| 日韩不卡手机在线v区| 99在线视频精品| 7777女厕盗摄久久久| 国产精品乱码妇女bbbb| 日韩av中文字幕一区二区| 99久久国产综合色|国产精品| 欧美一级在线观看| 亚洲综合精品久久| 懂色av一区二区三区蜜臀| 777午夜精品免费视频| 亚洲日本韩国一区| 国产91精品久久久久久久网曝门| 欧美久久久久久久久久| 综合久久给合久久狠狠狠97色 | 午夜精品久久久久久久| 成人国产精品免费观看动漫| 欧美一级xxx| 亚洲一区二区视频在线观看| 东方aⅴ免费观看久久av| 日韩欧美高清一区| 婷婷国产在线综合| 欧洲在线/亚洲| 1024国产精品| 成人一道本在线| 久久精品免费在线观看| 麻豆一区二区在线| 欧美一区二区三区系列电影| 综合久久给合久久狠狠狠97色| 国产白丝网站精品污在线入口| 日韩一区二区免费高清| 香蕉av福利精品导航| 日本高清不卡视频| 一区二区三区在线看| 97se亚洲国产综合自在线观| 日本一区二区免费在线观看视频| 国产综合成人久久大片91| 精品国产乱码久久久久久免费| 性做久久久久久免费观看|