亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产精品三级av| 狠狠色综合播放一区二区| 久久久99免费| 精品成人一区二区| 精品成人免费观看| 日韩高清电影一区| 亚洲欧美精品午睡沙发| 日韩国产高清影视| 综合分类小说区另类春色亚洲小说欧美| 欧美一区二区日韩| 精品欧美一区二区在线观看 | 精品欧美一区二区三区精品久久 | 懂色av一区二区在线播放| 国产乱码一区二区三区| 国产精品综合久久| 色综合天天综合网国产成人综合天| 91小视频免费观看| 欧美一区二区成人6969| 久久久久久久久久电影| 91精品在线免费| 免费在线观看视频一区| 日韩欧美视频在线| 久久久久久一二三区| 国产精品每日更新在线播放网址| 日韩毛片精品高清免费| 首页亚洲欧美制服丝腿| 国产乱码精品一品二品| 不卡高清视频专区| 欧美一区二区免费视频| 国产女同性恋一区二区| 亚洲精品国产第一综合99久久| 亚洲v精品v日韩v欧美v专区 | 韩日av一区二区| 99久久综合精品| 欧美一区二区三区四区高清| 国产欧美一二三区| 亚洲成人动漫av| 国产999精品久久久久久| 91免费在线看| 亚洲精品一区二区三区蜜桃下载| 亚洲精品国产一区二区三区四区在线 | 午夜在线成人av| 国产成人av一区| 69堂成人精品免费视频| 亚洲日本一区二区| 精彩视频一区二区三区 | 亚洲高清久久久| 成人精品鲁一区一区二区| 777午夜精品免费视频| 国产精品久久久久久妇女6080 | 欧美视频你懂的| 精品国产乱码久久久久久图片| 欧美午夜精品一区二区三区| 精品国产不卡一区二区三区| 亚洲三级视频在线观看| 国产精品综合一区二区| 日韩三级视频在线观看| 视频一区二区三区在线| 96av麻豆蜜桃一区二区| 欧美午夜精品一区二区蜜桃| 国产精品中文字幕日韩精品| 亚洲婷婷综合色高清在线| 精品亚洲免费视频| 综合久久国产九一剧情麻豆| 久久激五月天综合精品| 国内精品伊人久久久久av影院| 69堂亚洲精品首页| 成人网在线免费视频| 亚洲线精品一区二区三区八戒| 日韩精品影音先锋| 99久久精品费精品国产一区二区| 性做久久久久久免费观看欧美| 久久综合av免费| 欧美日韩国产综合久久 | 在线观看av不卡| 精品一区二区三区在线播放视频| 日韩码欧中文字| 欧美成人精品福利| 欧美色倩网站大全免费| 国产成人精品在线看| 亚州成人在线电影| 亚洲三级久久久| 久久久久国产免费免费| 欧美午夜精品一区| jlzzjlzz欧美大全| 国产乱码精品一区二区三区五月婷 | 国产午夜亚洲精品午夜鲁丝片| 日本精品免费观看高清观看| 国产一区二区网址| 免费看欧美美女黄的网站| 亚洲另类在线视频| 日本一区二区电影| 欧美精品一区二区精品网| 欧美无砖砖区免费| 99国产精品视频免费观看| 国产一区二区福利视频| 奇米综合一区二区三区精品视频| 18涩涩午夜精品.www| 中文字幕欧美区| 国产欧美日韩亚州综合| 精品国产青草久久久久福利| 欧美日韩精品是欧美日韩精品| 99久久99久久精品免费观看 | 国产欧美日本一区二区三区| 日韩午夜在线观看| 欧美精品tushy高清| 在线观看欧美精品| 在线观看日韩高清av| 在线免费一区三区| 91女神在线视频| 色偷偷一区二区三区| 91社区在线播放| 91福利社在线观看| 色诱亚洲精品久久久久久| 色欧美乱欧美15图片| 欧亚一区二区三区| 欧美日韩国产另类一区| 777奇米四色成人影色区| 91精品国产91久久综合桃花| 日韩一区二区在线看| 精品国产在天天线2019| 久久这里只精品最新地址| 久久久久综合网| 欧美精品自拍偷拍| 欧美成人精品1314www| 91捆绑美女网站| 欧美高清在线视频| 91精品国产综合久久久久久久久久| 欧美视频在线一区二区三区| 在线国产亚洲欧美| 91麻豆精品久久久久蜜臀| 欧美v日韩v国产v| 久久精品亚洲精品国产欧美 | 美女高潮久久久| 久久疯狂做爰流白浆xx| 国产高清在线观看免费不卡| 成人激情动漫在线观看| 在线免费不卡视频| 欧美大片在线观看一区二区| 久久久久久97三级| 亚洲色图视频网| 日韩在线一区二区| 国产精品自拍毛片| 在线免费视频一区二区| 日韩欧美精品在线视频| 国产精品视频看| 午夜视频在线观看一区二区三区 | 久久这里只有精品视频网| 亚洲欧洲日韩综合一区二区| 亚洲成人动漫一区| 国产成人在线视频播放| 欧美亚洲综合色| 久久精品视频免费观看| 亚洲一区二区三区四区五区中文| 免费亚洲电影在线| 99精品偷自拍| 91福利在线免费观看| 在线不卡的av| 五月综合激情婷婷六月色窝| 一区二区三区在线视频免费| 美女精品自拍一二三四| 色妹子一区二区| 26uuu欧美日本| 一区二区三区成人| 成人午夜电影小说| 日韩欧美www| 亚洲一级二级三级| 国产91精品精华液一区二区三区 | ㊣最新国产の精品bt伙计久久| 日韩av网站免费在线| 91丝袜美女网| 国产色综合一区| 久久99精品久久久久久动态图| 在线观看成人小视频| 国产精品视频一区二区三区不卡| 日韩高清不卡在线| 欧美午夜一区二区三区| 亚洲欧洲精品一区二区精品久久久 | 青青草国产成人99久久| 色婷婷一区二区| 中文字幕中文字幕一区| 韩国精品主播一区二区在线观看| 欧美群妇大交群中文字幕| 亚洲精品免费视频| caoporn国产一区二区| 久久久久久久久久久久久久久99| 天天综合天天做天天综合| 在线观看一区二区精品视频| 亚洲同性gay激情无套| av男人天堂一区| 日韩一区欧美小说| www.亚洲免费av| 国产精品三级视频| caoporm超碰国产精品| 亚洲国产成人一区二区三区| 成人av资源在线观看| 国产精品久久久久毛片软件| 成人午夜av电影| 最新欧美精品一区二区三区| 91无套直看片红桃|