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

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

?? wndfrmpkg.h

?? 一款最完整的工業組態軟源代碼
?? H
?? 第 1 頁 / 共 3 頁
字號:
// Copyright (c) 2002
// Sergey Klimov (kidd@ukr.net)
// WTL Docking windows
//
// This code is provided "as is", with absolutely no warranty expressed
// or implied. Any use is at your own risk.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is
// not sold for profit without the authors written consent, and
// providing that this notice and the authors name is included. If
// the source code in  this file is used in any commercial application
// then a simple email woulod be nice.

#ifndef __WTL_DW__WNDFRMPKG_H__
#define __WTL_DW__WNDFRMPKG_H__

#pragma once

#ifndef __ATLMISC_H__
        #error WndFrmPkg.h requires atlmisc.h to be included first
#endif

#include <memory>
#include "ssec.h"
#include "DDTracker.h"
#ifdef USE_BOOST
#include<boost/smart_ptr.hpp>
#endif

namespace dockwins{

class CWndFrame
{
public:
	typedef long position;
	typedef long distance;

	class CCmp
	{
	public:
		CCmp(HWND hWnd)	:m_hWnd(hWnd)
		{
		}
		bool operator ()(const CWndFrame& frame) const
		{
			return (frame.hwnd() == m_hWnd);
		}
	protected:
		HWND m_hWnd;
	};

	CWndFrame(position pos=0,HWND hWnd=NULL)
		:m_hWnd(hWnd),m_pos(pos)
	{
	}

	HWND hwnd() const
	{
		return m_hWnd;
	}

	operator position() const
	{
		return (position)m_pos;
	}

	CWndFrame& operator += (position val)
	{
		m_pos+=val;
		return *this;
	}
	CWndFrame& operator -= (position val)
	{
		m_pos-=val;
		return *this;
	}

	CWndFrame& operator = (position pos)
	{
		m_pos=pos;
		return *this;
	}

	CWndFrame& operator = (double pos)
	{
		m_pos=pos;
		return *this;
	}

	double get_real()
	{
		return m_pos;
	}

	HDWP DeferFramePos(HDWP hdwp,long x1,long y1,long x2,long y2) const
	{
		return ::DeferWindowPos(hdwp,hwnd(),
								NULL,
								x1,y1,
								x2-x1,y2-y1,
								SWP_NOZORDER | SWP_NOACTIVATE);
	}
	void GetMinMaxInfo(LPMINMAXINFO pMinMaxInfo) const
	{
		::SendMessage(m_hWnd,WM_GETMINMAXINFO,NULL,reinterpret_cast<LPARAM>(pMinMaxInfo));
	}
	distance MinDistance() const
	{
		DFMHDR dockHdr;
		dockHdr.code=DC_GETMINDIST;
		dockHdr.hWnd=m_hWnd;
		dockHdr.hBar=::GetParent(m_hWnd);
		assert(::IsWindow(dockHdr.hBar));
		return static_cast<distance>(::SendMessage(dockHdr.hBar,WMDF_DOCK,NULL,reinterpret_cast<LPARAM>(&dockHdr)));
	}
protected:
	double m_pos;
	mutable HWND m_hWnd;
};

//template<class T,const T::distance TMinDist=0>
//struct CWndFrameTraits : ssec::spraits<T, T::position, T::distance/*,TMinDist*/>
//{
//	typedef ssec::spraits<T,position,position/*,TMinDist*/> baseClass;
//	static distance min_distance(const T& x)
//	{
//		const distance dist=TMinDist;
//		return dist+x.MinDistance();
//	}
//
//};

template< class TFrame = CWndFrame , class TTraits = CDockingFrameTraits>
class CWndFramesPackageBase
{
	typedef typename TFrame CFrame;
	typedef typename TTraits CTraits;
	typedef typename CTraits::CSplitterBar	CSplitterBar;
	typedef CWndFramesPackageBase<CFrame,TTraits> thisClass;
protected:
	enum {splitterSize=CSplitterBar::sbThickness};
	typedef typename CFrame::position	position;

#if _MSC_VER >= 1310
	template<class T,const typename T::distance TMinDist=0>
#else
	template<class T,const T::distance TMinDist=0>
#endif
	struct CWndFrameTraits : ssec::spraits<T, typename T::position, typename T::distance/*,TMinDist*/>
	{
		typedef ssec::spraits<T,position,position/*,TMinDist*/> baseClass;
		static distance min_distance(const T& x)
		{
			const distance dist=TMinDist;
			return dist+x.MinDistance();
		}

	};
	typedef CWndFrameTraits<CFrame,splitterSize> CFrameTraits;
	typedef ssec::ssection<CFrame,CFrameTraits> CFrames;

	typedef typename CFrames::iterator				iterator;
	typedef typename CFrames::reverse_iterator		reverse_iterator;
	typedef typename CFrames::const_iterator			const_iterator;
	typedef typename CFrames::const_reverse_iterator	const_reverse_iterator;

	typedef ssec::bounds_type<position> CBounds;
protected:
	struct CEmbeddedSplitterBar : public CSplitterBar
	{
		CEmbeddedSplitterBar(bool bHorizontal,position vertex,const CRect& rcClient)
				:CSplitterBar(bHorizontal)
		{
            if(IsHorizontal())
            {
                    top=vertex;
                    bottom=top+GetThickness();
                    left=rcClient.left;
                    right=rcClient.right;
            }
            else
            {
                    left=vertex;
                    right=left+GetThickness();
                    top=rcClient.top;
                    bottom=rcClient.bottom;
            }

		}
	};
	class CEmbeddedSplitterBarPainter
	{
	public:
		CEmbeddedSplitterBarPainter(CDC& dc,bool bHorizontal,const CRect& rc)
			:m_dc(dc),m_rc(rc),m_bHorizontal(bHorizontal)
		{
		}
		void operator()(const CFrame& ref) const
		{
			CEmbeddedSplitterBar splitter(m_bHorizontal,ref,m_rc);
			splitter.Draw(m_dc);
		}
	protected:
		const	CRect& m_rc;
		bool	m_bHorizontal;
		CDC&	m_dc;
	};

	class CSplitterMoveTrackerBase : public IDDTracker//CDDTrackerBaseT<CSizeTrackerBase>
	{
	protected:
		void SetPosition()
		{
			assert(m_bounds.bind(m_pos)==m_pos);
			m_frames.set_position(m_i,m_pos);
			m_owner.Arrange(m_rc);
			m_wnd.RedrawWindow(&m_rc,NULL,RDW_INVALIDATE | RDW_UPDATENOW);
		}
	public:
		CSplitterMoveTrackerBase(HWND hWnd,thisClass& owner,const CPoint& pt,const CRect& rc)
			:m_wnd(hWnd),m_owner(owner),m_frames(owner.m_frames),m_rc(rc)
		{
			position pos=owner.IsHorizontal() ? pt.x : pt.y;
			m_i=m_frames.locate(pos);
			if(m_i!=m_frames.end())
			{
				m_pos=(*m_i);
				m_offset=pos-m_pos;
				m_frames.get_effective_bounds(m_i,m_bounds);
			}
		}
		operator iterator() const
		{
			return m_i;
		}
        void OnMove(long x, long y)
        {
			position pos = m_owner.IsHorizontal() ? x : y;
			pos=m_bounds.bind(pos-m_offset);
			if(pos!=m_pos)
			{
				m_pos=pos;
				Move();
			}
		}
		virtual void Move()=0;

	protected:
		thisClass&		m_owner;
		CFrames&		m_frames;
		iterator		m_i;
		CBounds			m_bounds;
		position		m_pos;
		position		m_offset;
		const CRect&	m_rc;
		CWindow			m_wnd;
	};

	friend class CSplitterMoveTrackerBase;

	class CSplitterMoveTrackerFull : public CSplitterMoveTrackerBase
	{
	public:
		CSplitterMoveTrackerFull(HWND hWnd,thisClass& owner,const CPoint& pt,const CRect& rc)
			:CSplitterMoveTrackerBase(hWnd,owner,pt,rc)
		{
		}
		void Move()
		{
			SetPosition();
		}
	};

	class CSplitterMoveTrackerGhost : public CSplitterMoveTrackerBase
	{
		typedef CEmbeddedSplitterBar CSplitterBar;
        typedef CSimpleSplitterBarSlider<CSplitterBar> CSlider;
	public:
		CSplitterMoveTrackerGhost(HWND hWnd,thisClass& owner,
									const CPoint& pt,const CRect& rc)
			:CSplitterMoveTrackerBase(hWnd,owner,pt,rc),
			  m_dc(::GetWindowDC(NULL)),m_splitter(!owner.IsHorizontal(),m_pos,rc),m_slider(m_splitter)
		{
			CPoint point(rc.TopLeft ());
			::ClientToScreen(hWnd,&point);
			CSize offset(point.x-rc.left,point.y-rc.top);
			m_splitter+=offset;
			m_ghOffset=owner.IsHorizontal()
									?offset.cx
									:offset.cy;
		}
        void BeginDrag()
        {
            m_splitter.DrawGhostBar(m_dc);
        }
        void EndDrag(bool bCanceled)
        {
            m_splitter.CleanGhostBar(m_dc);
            if(!bCanceled)
                SetPosition();
        }
		void Move()
		{
			m_splitter.CleanGhostBar(m_dc);
			m_slider=m_pos+m_ghOffset;
			m_splitter.DrawGhostBar(m_dc);
		}

	protected:
		position		m_ghOffset;
		CSplitterBar	m_splitter;
		CSlider			m_slider;
		CDC				m_dc;
	};
	template<long add=0>
	class CMinMaxInfoAccumulator
	{
		typedef LPMINMAXINFO (*CFunPtr)(MINMAXINFO& mmInfo,LPMINMAXINFO pMinMaxInfo);
	public:
		CMinMaxInfoAccumulator(bool bHorizontal)
		{
			m_pFun=bHorizontal ? &MinMaxInfoH : &MinMaxInfoV;
		}
		LPMINMAXINFO operator() (LPMINMAXINFO pMinMaxInfo,const CFrame& x) const
		{
			MINMAXINFO mmInfo;
			ZeroMemory(&mmInfo,sizeof(MINMAXINFO));
			x.GetMinMaxInfo(&mmInfo);
			return (*m_pFun)(mmInfo,pMinMaxInfo);
		}
	protected:
		static LPMINMAXINFO MinMaxInfoH(MINMAXINFO& mmInfo,LPMINMAXINFO pMinMaxInfo)
		{
			if(pMinMaxInfo->ptMinTrackSize.y<mmInfo.ptMinTrackSize.y)
				pMinMaxInfo->ptMinTrackSize.y=mmInfo.ptMinTrackSize.y;
			pMinMaxInfo->ptMinTrackSize.x+=mmInfo.ptMinTrackSize.x+add;
			return pMinMaxInfo;
		}
		static LPMINMAXINFO MinMaxInfoV(MINMAXINFO& mmInfo,LPMINMAXINFO pMinMaxInfo)
		{
			if(pMinMaxInfo->ptMinTrackSize.x<mmInfo.ptMinTrackSize.x)
				pMinMaxInfo->ptMinTrackSize.x=mmInfo.ptMinTrackSize.x;
			pMinMaxInfo->ptMinTrackSize.y+=mmInfo.ptMinTrackSize.y+add;
			return pMinMaxInfo;
		}
	protected:
		CFunPtr	m_pFun;
	};
protected:
    bool ArrangeH(const CRect& rc)
    {
        HDWP hdwp=reinterpret_cast<HDWP>(TRUE);
        const_iterator begin=m_frames.begin();
        const_iterator end=m_frames.end();
        if(begin!=end)
        {
            hdwp=BeginDeferWindowPos(m_frames.size());
            const_iterator next=begin;
            while((hdwp!=NULL)&&(++next!=end))
            {
                long x=(*begin)+splitterSize;
                hdwp=begin->DeferFramePos(hdwp,
											x,
											rc.top,
											(*next),
											rc.bottom);
                begin=next;
            }
            if(hdwp!=NULL)
            {
                long x=(*begin)+splitterSize;
                hdwp=begin->DeferFramePos(hdwp,
											x,
											rc.top,
											rc.right,
											rc.bottom);
                if(hdwp)
					hdwp=reinterpret_cast<HDWP>(EndDeferWindowPos(hdwp));
            }
        }
        return hdwp!=NULL;
    }

    bool ArrangeV(const CRect& rc)
    {
        HDWP hdwp=reinterpret_cast<HDWP>(TRUE);
        const_iterator begin=m_frames.begin();
        const_iterator end=m_frames.end();
        if(begin!=end)
        {
            hdwp=BeginDeferWindowPos(m_frames.size());
            const_iterator next=begin;
            while((hdwp!=NULL)&&(++next!=end))
            {
                long y=(*begin)+splitterSize;
                hdwp=begin->DeferFramePos(hdwp,
											rc.left,
											y,
											rc.right,
											(*next));
                begin=next;
            }
            if(hdwp!=NULL)
            {
                long y=(*begin)+splitterSize;
                hdwp=begin->DeferFramePos(hdwp,
											rc.left,
											y,
											rc.right,
											rc.bottom);
                if(hdwp)
					hdwp=reinterpret_cast<HDWP>(EndDeferWindowPos(hdwp));
            }
        }
        return hdwp!=NULL;
    }
    bool Arrange(const CRect& rcClient)
    {
		bool bRes;
		if(IsHorizontal())
			bRes=ArrangeH(rcClient);
		else
			bRes=ArrangeV(rcClient);
		return bRes;
    }

	CWndFramesPackageBase(bool bHorizontal)
		:m_bHorizontal(bHorizontal),m_frames(0,0)
	{
	}
public:
	bool IsHorizontal() const
	{
		return m_bHorizontal;
	}

	void SetOrientation(bool bHorizontal)
	{
		m_bHorizontal=bHorizontal;
	}

	HCURSOR GetCursor(const CPoint& pt,const CRect& rc) const
	{
		HCURSOR hCursor=NULL;
		position pos=IsHorizontal() ?pt.x :pt.y;
		const_iterator i=m_frames.locate(pos);
		if(i!=m_frames.end())
		{
			CEmbeddedSplitterBar splitter(!IsHorizontal(),(*i),rc);
			hCursor=splitter.GetCursor(pt);
		}
		return hCursor;
	}
/*
	bool StartSliding(HWND hWnd,const CPoint& pt,const CRect& rc,bool bGhostMove)
	{
		std::auto_ptr<CSplitterMoveTrackerBase> pTracker;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
3d成人动漫网站| 水野朝阳av一区二区三区| 欧美久久久久久久久久| 在线亚洲+欧美+日本专区| 99精品久久久久久| 97se亚洲国产综合自在线| 不卡的电影网站| 91精品办公室少妇高潮对白| 91福利在线导航| 亚洲精品国产一区二区三区四区在线 | 亚洲一区二区三区四区在线观看 | 亚洲国产成人91porn| 亚洲视频在线一区观看| 亚洲专区一二三| 调教+趴+乳夹+国产+精品| 免费欧美日韩国产三级电影| 久久国产精品区| 成人国产精品免费观看视频| 国产三级精品三级| 国产精品妹子av| 亚洲成人自拍偷拍| 免费观看在线综合色| 久88久久88久久久| 91丨国产丨九色丨pron| 色偷偷一区二区三区| 日本乱人伦aⅴ精品| 3d动漫精品啪啪1区2区免费| xvideos.蜜桃一区二区| 精品va天堂亚洲国产| 国产精品视频yy9299一区| **网站欧美大片在线观看| 丝袜美腿成人在线| 国产成人免费在线观看| 亚洲日本在线a| 欧美a一区二区| 99re热这里只有精品视频| 日韩欧美国产一区二区在线播放| 中文字幕在线一区免费| 午夜精品久久久久久不卡8050| 亚洲国产视频一区| 成人午夜激情在线| 欧美日韩mp4| 中国色在线观看另类| 亚洲高清免费在线| 国产精品一品视频| 91国偷自产一区二区三区观看| 欧美r级在线观看| 中文一区在线播放| 亚洲sss视频在线视频| 懂色av中文一区二区三区| 欧美一区二区日韩一区二区| 国产精品电影一区二区三区| 蜜桃免费网站一区二区三区 | 一区二区三区欧美视频| 久久国产日韩欧美精品| 欧美精品视频www在线观看 | 成人亚洲一区二区一| 日韩免费一区二区三区在线播放| 亚洲视频免费在线观看| 免费成人av在线| 欧美日韩第一区日日骚| 一区二区高清在线| 色哟哟国产精品| 欧美国产精品久久| 国产一区二区三区国产| 欧美日韩国产小视频在线观看| 337p日本欧洲亚洲大胆精品| 日本aⅴ亚洲精品中文乱码| 在线这里只有精品| 中文字幕永久在线不卡| 成人福利视频网站| 国产欧美精品一区二区色综合 | 久久国产麻豆精品| 欧美视频在线播放| 欧美日韩精品一区二区天天拍小说| 自拍偷自拍亚洲精品播放| 丁香激情综合国产| 国产欧美视频在线观看| 国产白丝精品91爽爽久久| 欧美国产日韩精品免费观看| 国产a精品视频| 国产精品亲子伦对白| kk眼镜猥琐国模调教系列一区二区 | 91亚洲国产成人精品一区二区三 | 亚洲裸体在线观看| 色婷婷综合久色| 亚洲福利视频一区| 欧美日韩一区二区三区高清| 五月天激情综合网| 精品日韩成人av| 国产资源精品在线观看| 国产精品久久网站| 在线视频综合导航| 亚洲超碰97人人做人人爱| 欧美一级免费观看| 国产成人午夜电影网| 亚洲精品日韩一| 欧美精品久久99久久在免费线| 久久国产免费看| 亚洲欧美日韩中文字幕一区二区三区| 91久久人澡人人添人人爽欧美| 日韩av网站免费在线| 国产亚洲欧洲997久久综合| 成人晚上爱看视频| 亚洲综合一二三区| 日韩视频123| 成人激情小说乱人伦| 成人免费在线播放视频| 欧美日韩日本视频| 国产成人午夜精品影院观看视频| 中文字幕高清一区| 欧美日韩综合不卡| 国产91富婆露脸刺激对白| 亚洲国产精品自拍| 正在播放一区二区| 色综合色综合色综合色综合色综合| 美女在线视频一区| 成人免费一区二区三区在线观看| 91精品婷婷国产综合久久| 国产尤物一区二区在线| 亚洲精品免费视频| 精品国产3级a| 欧美性一区二区| 国产大陆精品国产| 免费不卡在线视频| 日日欢夜夜爽一区| 亚洲自拍偷拍网站| 国产精品女上位| 久久久综合九色合综国产精品| 欧美日韩精品一区二区天天拍小说| 国产999精品久久久久久绿帽| 日韩综合在线视频| 亚洲福利视频导航| 亚洲精品伦理在线| 亚洲欧洲无码一区二区三区| 久久九九影视网| 精品99一区二区三区| 欧美一级精品大片| 51精品国自产在线| 欧美日韩国产成人在线免费| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品一区二区无线| 捆绑调教一区二区三区| 日韩精品电影在线| 无吗不卡中文字幕| 色噜噜狠狠色综合中国| 不卡一区二区中文字幕| 国产精品1区2区3区| 国产精品123| 国产成人免费视频一区| 制服丝袜日韩国产| 欧美日韩1234| 欧美一级理论片| 欧美mv日韩mv| 国产亚洲自拍一区| 国产欧美日韩亚州综合| 日本一区二区视频在线观看| 欧美激情中文不卡| 国产精品美女久久久久久久久久久| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品美女久久久久av爽李琼| 国产精品国产a| 中文字幕日韩精品一区| 亚洲免费观看视频| 亚洲国产成人精品视频| 日韩成人伦理电影在线观看| 丝袜美腿亚洲综合| 2014亚洲片线观看视频免费| 久久人人爽爽爽人久久久| 日本一区二区久久| 一区二区激情小说| 久久国产精品色| 成人一区二区三区在线观看| kk眼镜猥琐国模调教系列一区二区 | 午夜视频一区二区| 26uuu国产日韩综合| 国产精品卡一卡二| 一区二区国产盗摄色噜噜| 蜜臀91精品一区二区三区| 国产激情视频一区二区在线观看 | 亚洲六月丁香色婷婷综合久久| 亚洲一区二区成人在线观看| 老司机精品视频在线| 国产亚洲欧美色| 亚洲一区二区在线视频| 精品亚洲porn| 一本一道综合狠狠老| 欧美区一区二区三区| 国产日韩欧美高清在线| 一区二区三区不卡在线观看| 美日韩一区二区| 色综合久久久久久久久久久| 欧美精品日韩一区| 亚洲国产精品传媒在线观看| 欧美三级在线视频| 欧美经典一区二区三区| 欧美精品成人一区二区三区四区| 国产精品丝袜在线| 久久精品久久99精品久久| 91久久精品网|