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

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

?? atldock.h

?? 一款最完整的工業組態軟源代碼
?? H
?? 第 1 頁 / 共 4 頁
字號:
#ifndef __ATL_DOCK_H__
#define __ATL_DOCK_H__

/////////////////////////////////////////////////////////////////////////////
// atldock.h - Docking framework for the WTL library
//
// Written by Bjarke Viksoe (bjarke@viksoe.dk)
// Thanks to Mike Simon for adding the ability to close a view.
// Copyright (c) 2000-2002 Bjarke Viksoe.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed 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. 
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever. It's free, so don't hassle me about it.
//
// Beware of bugs.
//

#pragma once

#ifndef __cplusplus
   #error ATL requires C++ compilation (use a .cpp suffix)
#endif

#ifndef __ATLAPP_H__
   #error atldock.h requires atlapp.h to be included first
#endif


// Dock positions
#define DOCK_LEFT      0
#define DOCK_TOP       1
#define DOCK_RIGHT     2
#define DOCK_BOTTOM    3
#define DOCK_FLOAT     4
#define DOCK_HIDDEN    5
#define DOCK_LASTKNOWN 6

// Extended dock styles
#define DCK_EX_DESTROYONCLOSE 0x00000001
#define DCK_EX_REMEMBERSIZE   0x00000002

// Control style flags
#define DCK_NOLEFT      1<<DOCK_LEFT
#define DCK_NOTOP       1<<DOCK_TOP
#define DCK_NORIGHT     1<<DOCK_RIGHT
#define DCK_NOBOTTOM    1<<DOCK_BOTTOM
#define DCK_NOSPLITTER  0x00000100L
#define DCK_NOFLOAT     0x00000200L
#define DCK_NOHIDE      0x00000400L

#define ATL_SIMPLE_DOCKVIEW_STYLE \
   (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS)

// Docked child command chaining macro
#define CHAIN_DOCK_CHILD_COMMANDS(hwnd) \
   if(uMsg == WM_COMMAND) \
   { \
      if(::IsWindowVisible(hwnd)) \
         ::SendMessage(hwnd, uMsg, wParam, lParam); \
   }

// Docking position helpers
inline bool IsDockedVertically(short Side) { return (Side == DOCK_LEFT) || (Side == DOCK_RIGHT); };
inline bool IsDocked(short Side) { return (Side == DOCK_TOP) || (Side == DOCK_BOTTOM) || (Side == DOCK_LEFT) || (Side == DOCK_RIGHT); };


#define DOCK_INFO_CHILD 0x1000

// Minimum size of docking pane
#define MIN_DOCKPANE_SIZE 28
// Default width/height of docking pane
#define DEFAULT_DOCKPANE_SIZE 170
// Default size of floating window rectangle
#define DEFAULT_FLOAT_SIZE 120
// The splitter size in pixels
#define DEFAULT_SPLITTER_SIZE 6

#define WM_DOCK_QUERYRECT         WM_USER+840
#define WM_DOCK_QUERYTRACK        WM_USER+841
#define WM_DOCK_UNDOCK            WM_USER+842
#define WM_DOCK_UNFLOAT           WM_USER+843
#define WM_DOCK_DOCK              WM_USER+844
#define WM_DOCK_FLOAT             WM_USER+845
#define WM_DOCK_UPDATELAYOUT      WM_USER+846
#define WM_DOCK_REPOSITIONWINDOW  WM_USER+847
#define WM_DOCK_SETSPLITTER       WM_USER+848
#define WM_DOCK_CLIENT_CLOSE      WM_USER+849

class CDockingPaneChildWindow;
class CFloatingWindow;

struct DOCKCONTEXT 
{
   HWND hwndDocked;   // The docked pane
   HWND hwndFloated;  // The floating pane
   HWND hwndChild;    // The view window
   HWND hwndOrigPrnt; // The original parent window
   short Side;        // Dock state
   short LastSide;    // Last dock state
   RECT rcWindow;     // Preferred window size
   SIZE sizeFloat;    // Last window size (floating)
   HWND hwndRoot;     // Main dock window
   //
   DWORD dwFlags;     // Extra flags
   bool bKeepSize;    // Recommend using current size and avoid rescale
};

typedef CSimpleValArray<DOCKCONTEXT*> CDockMap;

struct TRACKINFO 
{
   HWND hWnd;
   DOCKCONTEXT* pCtx;
   POINT ptPos;
   POINT ptStart;
   RECT rc;
   short Side;
};


///////////////////////////////////////////////////////
// CSplitterBar

#pragma warning(disable : 4100)

template< class T >
class CSplitterBar
{
public:
   LONG m_cxySplitter;
   bool m_bTracking;
   bool m_bDragging;
   static HCURSOR s_hVertCursor;
   static HCURSOR s_hHorizCursor;

   CDCHandle m_dc;
   POINT m_ptStartDragPoint;
   POINT m_ptEndDragPoint;
   POINT m_ptDeltaDragPoint;
   RECT  m_rcTracker;
   SIZE  m_sizeTracker;
   RECT  m_rcTrackerBounds;   

   CSplitterBar() :
      m_bTracking(false), m_bDragging(false)
   {
      if( s_hVertCursor == NULL ) {
         ::EnterCriticalSection(&_Module.m_csStaticDataInit);
         s_hVertCursor = ::LoadCursor(NULL, IDC_SIZENS);
         s_hHorizCursor = ::LoadCursor(NULL, IDC_SIZEWE);
         ::LeaveCriticalSection(&_Module.m_csStaticDataInit);
      }
      m_sizeTracker.cx = ::GetSystemMetrics(SM_CXFRAME);
      m_sizeTracker.cy = ::GetSystemMetrics(SM_CYFRAME);
      m_cxySplitter = DEFAULT_SPLITTER_SIZE;
   }

   LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
   {
      T* pT = static_cast<T*>(this);
      DWORD dwPos = ::GetMessagePos();
      POINT ptPos = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) };
      pT->ScreenToClient(&ptPos);
      if( ::PtInRect(&pT->m_rcSplitter, ptPos) ) return 1;
      bHandled = FALSE;
      return 0;
   }

   void DrawGhostBar()
   {
      ATLASSERT(!m_dc.IsNull());
      RECT rect = m_rcTracker;
      if( !::IsRectEmpty(&rect) ) {
         // Invert the brush pattern (looks just like frame window sizing)
         CBrush brush = CDCHandle::GetHalftoneBrush();
         if( brush.m_hBrush != NULL ) {
            ATLASSERT(!m_dc.IsNull());
            CBrushHandle brushOld = m_dc.SelectBrush(brush);
            m_dc.PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);
            m_dc.SelectBrush(brushOld);
         }
      }
   }

   void DrawDragBar()
   {
      ATLASSERT(!m_dc.IsNull());
      RECT rect = m_rcTracker;
      if( !::IsRectEmpty(&rect) ) {
         // Invert the brush pattern (looks just like frame window sizing)
         CBrush brush = CDCHandle::GetHalftoneBrush();
         if( brush.m_hBrush != NULL ) {
            ATLASSERT(!m_dc.IsNull());
            CBrushHandle brushOld = m_dc.SelectBrush(brush);
            m_dc.PatBlt(rect.left + m_sizeTracker.cx, rect.top, rect.right - rect.left - (m_sizeTracker.cx * 2), m_sizeTracker.cy, PATINVERT);
            m_dc.PatBlt(rect.left, rect.bottom - m_sizeTracker.cy, rect.right - rect.left, m_sizeTracker.cy, PATINVERT);
            m_dc.PatBlt(rect.left, rect.top, m_sizeTracker.cx, rect.bottom - rect.top - m_sizeTracker.cy, PATINVERT);
            m_dc.PatBlt(rect.right - m_sizeTracker.cx, rect.top, m_sizeTracker.cx, rect.bottom - rect.top - m_sizeTracker.cy, PATINVERT);
            m_dc.SelectBrush(brushOld);
         }
      }
   }

   void DrawSplitterBar(CDCHandle dc, bool bVertical, RECT& rect)
   {      
      if( ::IsRectEmpty(&rect) ) return;
      dc.FillRect(&rect, ::GetSysColorBrush(COLOR_3DFACE));
      dc.DrawEdge(&rect, EDGE_RAISED, (bVertical ? (BF_TOP|BF_BOTTOM) : (BF_LEFT|BF_RIGHT)));
   }

   bool PtInSplitter(POINT& pt, short Side, DWORD dwFlags, RECT& rcSplitter)
   {
      if( !IsDocked(Side) ) return false;
      if( m_bTracking ) return false;
      if( (dwFlags & DCK_NOSPLITTER) != 0 ) return false;
      if( !::PtInRect(&rcSplitter, pt) ) return false;
      return true;
   }

   // Track loop

   bool Track(bool bDragging)
   {
      T* pT = static_cast<T*>(this);
      StartTracking(bDragging);
      // Get messages until capture lost or cancelled/accepted
      while( ::GetCapture() == pT->m_hWnd ) {
         MSG msg;
         if( !::GetMessage(&msg, NULL, 0, 0) ) {
            ::PostQuitMessage(msg.wParam);
            break;
         }
         switch( msg.message ) {
         case WM_LBUTTONUP:
            if( m_bDragging ) pT->OnEndDrag(); else pT->OnEndResize();
            CancelTracking();
            return true;
         case WM_MOUSEMOVE:
            if( m_bDragging ) pT->OnMove(msg.pt); else pT->OnStretch(msg.pt);
            break;
         case WM_KEYUP:
            if( m_bDragging ) pT->OnKey((int) msg.wParam, false) ;
            break;
         case WM_KEYDOWN:
            if( m_bDragging ) pT->OnKey((int) msg.wParam, true);
            if( msg.wParam == VK_ESCAPE ) {
               CancelTracking();
               return false;
            }
            break;
         case WM_SYSKEYDOWN:
         case WM_LBUTTONDOWN:
         case WM_RBUTTONDOWN:
            CancelTracking();
            return false;      
         default:
            // Just dispatch rest of the messages
            ::DispatchMessage(&msg);
            break;
         }
      }

      CancelTracking();
      return false;
   }

   void StartTracking(bool bDragging)
   {
      ATLASSERT(!m_bTracking);
      T* pT = static_cast<T*>(this);
      // Capture window
      m_bTracking = true;
      pT->SetCapture();
      // Make sure no updates are pending
      pT->RedrawWindow(NULL, NULL, RDW_ALLCHILDREN|RDW_UPDATENOW);
      // Lock Window update while dragging over desktop
      ATLASSERT(m_dc.IsNull());
      HWND hWnd = ::GetDesktopWindow();
      m_dc = ::GetDCEx(hWnd, NULL, ::LockWindowUpdate(hWnd) ? DCX_WINDOW|DCX_CACHE|DCX_LOCKWINDOWUPDATE : DCX_WINDOW|DCX_CACHE);
      ATLASSERT(!m_dc.IsNull());
      // Draw the initial focus rect
      m_bDragging = bDragging;
      if( m_bDragging ) DrawDragBar(); else DrawGhostBar();
      return;
   }

   void CancelTracking()
   {
      ATLASSERT(m_bTracking);
      if( !m_bTracking ) return;
      // Erase the focus rect
      if( m_bDragging ) DrawDragBar(); else DrawGhostBar();
      // Let window updates free
      ::LockWindowUpdate(NULL);
      HWND hWnd = ::GetDesktopWindow();
      if( !m_dc.IsNull() ) ::ReleaseDC(hWnd, m_dc.Detach());
      // Release the capture
      ::ReleaseCapture();
      m_bTracking = false;
   }

   // Overridables

   void OnEndDrag() { };
   void OnEndResize() { };
   void OnKey(int nCode, bool bDown) { };
   void OnMove(POINT& pt) { };
   void OnStretch(POINT& pt) { };
};

template<class T> HCURSOR CSplitterBar<T>::s_hVertCursor = NULL;
template<class T> HCURSOR CSplitterBar<T>::s_hHorizCursor = NULL;

#pragma warning(default : 4100)


///////////////////////////////////////////////////////
// CFloatingWindow

typedef CWinTraits<WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME|WS_SYSMENU, WS_EX_TOOLWINDOW|WS_EX_WINDOWEDGE> CFloatWinTraits;

template< class T, class TBase = CWindow, class TWinTraits = CFloatWinTraits >
class ATL_NO_VTABLE CFloatingWindowImpl : 
   public CWindowImpl< T, TBase, TWinTraits >,
   public CSplitterBar<CFloatingWindowImpl>
{
public:
   DECLARE_WND_CLASS_EX(NULL, CS_DBLCLKS, NULL)

   typedef CFloatingWindowImpl< T , TBase, TWinTraits > thisClass;
   
   BEGIN_MSG_MAP(CFloatingWindowImpl)
      MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
      MESSAGE_HANDLER(WM_SIZE, OnSize)
      MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand)
      MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
      MESSAGE_HANDLER(WM_GETMINMAXINFO, OnMsgForward)
      MESSAGE_HANDLER(WM_DOCK_UPDATELAYOUT, OnSize)
      MESSAGE_HANDLER(WM_NCACTIVATE, OnNcActivate)
      MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnLeftButtonDown)
      MESSAGE_HANDLER(WM_NCRBUTTONDOWN, OnRightButtonDown)
      MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnButtonDblClick)
   END_MSG_MAP()

   DOCKCONTEXT* m_pCtx;

   CFloatingWindowImpl(DOCKCONTEXT* pCtx) :
      m_pCtx(pCtx)
   { 
   }

   HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
         DWORD dwStyle = 0, DWORD dwExStyle = 0,
         UINT nID = 0, LPVOID lpCreateParam = NULL)
   {
      ATLASSERT(m_pCtx);
      if( m_pCtx->dwFlags & DCK_NOHIDE ) dwStyle = T::GetWndStyle(dwStyle) & ~WS_SYSMENU;
      return CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
   }

   virtual void OnFinalMessage(HWND /*hWnd*/)
   {
      delete (T*) this;
   }

   // Message handlers

   LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
   {
      return 1; // handled, no background painting needed
   }

   LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
   {
      T* pT = static_cast<T*>(this);
      pT->UpdateLayout();
      return 0;
   }

   LRESULT OnNcActivate(UINT uMsg, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
   {
      return DefWindowProc(uMsg, IsWindowEnabled(), lParam);
   }

   LRESULT OnLeftButtonDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
   {
      SetFocus();
      if( wParam == HTCAPTION ) {
         // Get cursor point and start a tracking look
         POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
         m_ptStartDragPoint = m_ptEndDragPoint = pt;
         GetWindowRect(&m_rcTracker);
         // Enter tracking loop
         bool res = Track(true);
         if( res ) {
            // Determine if we landed over a docking pane or just moved around...
            TRACKINFO ti = { m_hWnd, m_pCtx, m_ptEndDragPoint.x, m_ptEndDragPoint.y, m_ptStartDragPoint.x, m_ptStartDragPoint.y };
            ::SendMessage(m_pCtx->hwndRoot, WM_DOCK_QUERYTRACK, 0, (LPARAM) &ti);
            if( ti.Side == DOCK_FLOAT ) {
               MoveWindow(&ti.rc, TRUE);
            }
            else {
               ::SendMessage(m_pCtx->hwndRoot, WM_DOCK_UNFLOAT, 0, (LPARAM) m_pCtx);
               ::SendMessage(m_pCtx->hwndRoot, WM_DOCK_DOCK, ti.Side, (LPARAM) m_pCtx);
            }
            return 0;
         }
         return 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区在线| 成人高清免费在线播放| 色综合视频在线观看| 国产日韩精品一区二区三区在线| 亚洲 欧美综合在线网络| 91天堂素人约啪| 国产精品免费视频网站| 国产成人av一区二区三区在线| 色www精品视频在线观看| 亚洲男人的天堂在线观看| 波多野结衣中文字幕一区二区三区| 久久精品视频在线免费观看| 久久超碰97中文字幕| 久久婷婷成人综合色| 国产一区二区三区久久久| 国产色综合一区| k8久久久一区二区三区| 国产精品萝li| 高清国产一区二区| 亚洲一区在线观看视频| 欧洲色大大久久| 九九**精品视频免费播放| 久久久精品黄色| 精品1区2区3区| 福利视频网站一区二区三区| 香蕉av福利精品导航| 欧美韩日一区二区三区四区| 日本丶国产丶欧美色综合| 美女久久久精品| 亚洲色图视频网| 日韩精品最新网址| 91在线视频观看| 国产综合成人久久大片91| 亚洲精品伦理在线| 国产丝袜欧美中文另类| 欧美日韩精品综合在线| 懂色中文一区二区在线播放| 亚洲制服欧美中文字幕中文字幕| 日韩你懂的电影在线观看| 99久精品国产| 韩国视频一区二区| 日本欧美大码aⅴ在线播放| 中文字幕在线不卡视频| 精品久久久久香蕉网| 欧美日韩黄视频| 欧美午夜精品一区二区三区| 91啪在线观看| aaa欧美色吧激情视频| 丰满亚洲少妇av| 国产麻豆欧美日韩一区| 国产精品羞羞答答xxdd| 久久99精品国产.久久久久久| 日本欧美一区二区三区乱码| 亚洲视频一区二区在线| 国产精品久久久久久亚洲伦| 久久毛片高清国产| 久久这里只精品最新地址| 久久综合九色欧美综合狠狠 | 国产乱码一区二区三区| 美日韩一区二区三区| 视频一区欧美日韩| 蜜桃一区二区三区在线观看| 美女网站一区二区| 国产在线精品不卡| 成人丝袜高跟foot| 99re66热这里只有精品3直播| 在线观看免费亚洲| 日韩一区二区三区视频在线| 亚洲精品一区二区在线观看| 亚洲国产精品成人综合| 亚洲免费在线观看视频| 婷婷丁香久久五月婷婷| 国内精品视频666| 色综合久久99| 亚洲人精品午夜| 国产精品自拍三区| 狠狠色综合色综合网络| 美女视频黄 久久| 性感美女久久精品| 亚洲日本在线观看| 视频在线观看91| 久久午夜国产精品| 日韩美女视频一区| 青青草一区二区三区| av一区二区三区在线| 日韩一区二区在线观看视频| 中文字幕一区二区在线观看 | 理论电影国产精品| 国产一二精品视频| 欧美日产在线观看| 亚洲男人的天堂网| 国产成人av福利| 欧美成人精品高清在线播放 | 一本色道a无线码一区v| 久久香蕉国产线看观看99| 日本aⅴ精品一区二区三区 | 337p粉嫩大胆噜噜噜噜噜91av| 亚洲自拍另类综合| 欧美亚洲高清一区二区三区不卡| 久久精品亚洲乱码伦伦中文| 韩国精品一区二区| 欧美精品一区二区三区蜜桃视频| 久久综合综合久久综合| 久久精品一区二区三区不卡| 九色综合狠狠综合久久| 久久男人中文字幕资源站| 久久成人18免费观看| 久久精品一区二区三区不卡| 国产成人av电影在线播放| 日本一区二区三区dvd视频在线| 久久黄色级2电影| 精品国产露脸精彩对白| 蜜臀久久久99精品久久久久久| 欧美日韩视频在线第一区 | 国产午夜精品一区二区三区嫩草 | 久久99国产精品尤物| 国产三级三级三级精品8ⅰ区| 国产成a人亚洲| 亚洲精品乱码久久久久久久久| 91精品久久久久久蜜臀| 麻豆精品一区二区| 国产精品久久久久三级| 欧美日韩免费高清一区色橹橹| 日韩和欧美一区二区三区| 久久婷婷一区二区三区| 色香蕉久久蜜桃| 久久精品国内一区二区三区| 日本一区二区不卡视频| 欧美日韩国产高清一区| 国产伦精品一区二区三区免费 | 久久影院午夜片一区| 在线观看欧美精品| 国产麻豆精品theporn| 午夜久久久久久久久| 国产日本一区二区| 欧美肥大bbwbbw高潮| 欧美性xxxxx极品少妇| 国产一区二区精品久久99| 视频一区二区国产| 亚洲激情综合网| 中文字幕av在线一区二区三区| 欧美亚洲综合另类| 99精品视频中文字幕| 国产美女视频91| 理论电影国产精品| 日本怡春院一区二区| 亚洲一区二区三区在线播放| 亚洲精品欧美专区| 亚洲天堂a在线| 亚洲激情男女视频| 一区二区视频在线看| 亚洲精品久久久久久国产精华液| 国产精品成人免费精品自在线观看| 日本一区二区动态图| 欧美不卡一区二区三区四区| 不卡一区在线观看| 午夜国产精品影院在线观看| 国产日韩精品一区二区三区| 欧美色图在线观看| 成人ar影院免费观看视频| 亚洲专区一二三| 亚洲一区二区三区在线| 亚洲一区二区三区四区在线免费观看 | 欧美高清hd18日本| 欧美精品日韩综合在线| 日韩欧美亚洲另类制服综合在线| 日韩欧美一区二区免费| 国产日产欧美一区二区三区| 国产精品福利av| 樱桃视频在线观看一区| 日韩一区精品字幕| 韩国精品免费视频| 一本大道综合伊人精品热热| 欧美日韩不卡在线| 日韩欧美一区在线观看| 亚洲国产高清不卡| 石原莉奈在线亚洲二区| 国产麻豆视频一区| 欧美精品在线一区二区三区| 久久久久久久久伊人| 亚洲一区在线观看免费 | 青青草国产成人av片免费| 懂色一区二区三区免费观看| 欧美日韩黄视频| 亚洲欧洲成人自拍| 久久国产精品99精品国产| 在线国产电影不卡| 国产精品蜜臀av| 激情五月激情综合网| 欧美日韩性生活| 国产精品丝袜久久久久久app| 麻豆精品在线播放| 欧美精品 国产精品| 一区二区三区四区精品在线视频| 国产精品一区专区| 久久久久国产成人精品亚洲午夜| 丝袜诱惑亚洲看片| 91网站视频在线观看| 国产精品免费av| 99久久er热在这里只有精品66|