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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dockingcont.cpp

?? 一個功能強(qiáng)大的代碼編輯器源代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//this file is part of docking functionality for Notepad++
//Copyright (C)2006 Jens Lorenz <jens.plugin.npp@gmx.de>
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#include "dockingResource.h"
#include "math.h"
#include "Docking.h"
#include "DockingCont.h"
#include "DropData.h"
#include "SplitterContainer.h"
#include "WindowInterface.h"
#include "SysMsg.h"
#include "ToolTip.h"
#include <Commctrl.h>
#include <shlobj.h>
#include "common_func.h"

#ifndef WH_MOUSE_LL
#define WH_MOUSE_LL 14
#endif

static HWND		hWndServer		= NULL;
static HHOOK	hookMouse		= NULL;

static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)
    {
		::CallNextHookEx(hookMouse, nCode, wParam, lParam);
        return 0;
    }

    switch (wParam)
    {
		case WM_MOUSEMOVE:
		case WM_NCMOUSEMOVE:
			::PostMessage(hWndServer, wParam, 0, 0);
			break;
		case WM_LBUTTONUP:
		case WM_NCLBUTTONUP:
			::PostMessage(hWndServer, wParam, 0, 0);
			break;
        default: 
			break;
	}

	return ::CallNextHookEx(hookMouse, nCode, wParam, lParam);
}


DockingCont::DockingCont(void)
{
	_isMouseOver		= FALSE;
	_isMouseClose		= FALSE;
	_isMouseDown		= FALSE;
	_isFloating			= false;
	_isTopCaption		= CAPTION_TOP;
	_dragFromTab		= FALSE;
	_hContTab			= NULL;
	_hDefaultTabProc	= NULL;
	_beginDrag			= FALSE;
	_prevItem			= 0;
	_hFont				= NULL;
	_bTabTTHover		= FALSE;
	_bCaptionTT			= FALSE;
	_bCapTTHover		= FALSE;
	_hoverMPos			= posClose;
	_bDrawOgLine		= TRUE;
	_vTbData.clear();
}

DockingCont::~DockingCont()
{
	::DeleteObject(_hFont);
}


void DockingCont::doDialog(bool willBeShown, bool isFloating)
{
	if (!isCreated())
	{
		create(IDD_CONTAINER_DLG);

		_isFloating  = isFloating;

		if (_isFloating == true)
		{
			::SetWindowLong(_hSelf, GWL_STYLE, POPUP_STYLES);
			::SetWindowLong(_hSelf, GWL_EXSTYLE, POPUP_EXSTYLES);
			::ShowWindow(_hCaption, SW_HIDE);
		}
		else
		{
			::SetWindowLong(_hSelf, GWL_STYLE, CHILD_STYLES);
			::SetWindowLong(_hSelf, GWL_EXSTYLE, CHILD_EXSTYLES);
			::ShowWindow(_hCaption, SW_SHOW);
		}

		_hFont = ::CreateFont(14, 0, 0, 0,
			FW_NORMAL, FALSE, FALSE, FALSE,
			ANSI_CHARSET, OUT_DEFAULT_PRECIS,
			CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
			DEFAULT_PITCH | FF_ROMAN,
			"MS Shell Dlg");
	}

	display(willBeShown);
}


tTbData* DockingCont::createToolbar(tTbData data, Window **ppWin)
{
	tTbData *pTbData = new tTbData;

	*pTbData = data;

	/* force window style of client window */
	::SetWindowLong(pTbData->hClient, GWL_STYLE, CHILD_STYLES);
	::SetWindowLong(pTbData->hClient, GWL_EXSTYLE, CHILD_EXSTYLES);

	/* restore position if plugin is in floating state */
	if ((_isFloating == true) && (::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0) == 0))
	{
		reSizeToWH(pTbData->rcFloat);
	}

	/* set attached child window */
    ::SetParent(pTbData->hClient, ::GetDlgItem(_hSelf, IDC_CLIENT_TAB));

	/* set names for captions and view toolbar */
	viewToolbar(pTbData);

	/* attach to list */
	_vTbData.push_back(pTbData);

	return pTbData;
}


void DockingCont::removeToolbar(tTbData TbData)
{
	INT			iItemCnt	= 0;

	/* remove from list */
	for (size_t iTb = 0; iTb < _vTbData.size(); iTb++)
	{
		if (_vTbData[iTb]->hClient == TbData.hClient)
		{
			/* remove tab */
			removeTab(_vTbData[iTb]);

			/* free resources */
			delete _vTbData[iTb];
			vector<tTbData*>::iterator itr = _vTbData.begin() + iTb;
			_vTbData.erase(itr);
		}
	}
}


tTbData* DockingCont::findToolbarByWnd(HWND hClient)
{
	tTbData*	pTbData		= NULL;

	/* find entry by handle */
	for (size_t iTb = 0; iTb < _vTbData.size(); iTb++)
	{
		if (hClient == _vTbData[iTb]->hClient)
		{
			pTbData = _vTbData[iTb];
		}
	}
	return pTbData;
}

tTbData* DockingCont::findToolbarByName(char* pszName)
{
	tTbData*	pTbData		= NULL;

	/* find entry by handle */
	for (size_t iTb = 0; iTb < _vTbData.size(); iTb++)
	{
		if (strcmp(pszName, _vTbData[iTb]->pszName) == 0)
		{
			pTbData = _vTbData[iTb];
		}
	}
	return pTbData;
}

void DockingCont::setActiveTb(tTbData* pTbData)
{
	INT iItem = SearchPosInTab(pTbData);
	setActiveTb(iItem);
}

void DockingCont::setActiveTb(INT iItem)
{
	//if ((iItem != -1) && (iItem < ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0)))
	if (iItem < ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0))
	{
		SelectTab(iItem);
	}
}

INT DockingCont::getActiveTb(void)
{
	return ::SendMessage(_hContTab, TCM_GETCURSEL, 0, 0);
}

tTbData* DockingCont::getDataOfActiveTb(void)
{
	tTbData*	pTbData	= NULL;
	INT			iItem	= getActiveTb();

	if (iItem != -1)
	{
		TCITEM	tcItem	= {0};

		tcItem.mask		= TCIF_PARAM;
		::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
		pTbData = (tTbData*)tcItem.lParam;
	}

	return pTbData;
}

vector<tTbData*> DockingCont::getDataOfVisTb(void)
{
	vector<tTbData*>	vTbData;
	TCITEM				tcItem		= {0};
	INT					iItemCnt	= ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);

	tcItem.mask	= TCIF_PARAM;

	for(INT iItem = 0; iItem < iItemCnt; iItem++)
	{
		::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
		vTbData.push_back((tTbData*)tcItem.lParam);
	}
	return vTbData;
}

bool DockingCont::isTbVis(tTbData* data)
{
	bool				bRet		= false;
	TCITEM				tcItem		= {0};
	INT					iItemCnt	= ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0);

	tcItem.mask	= TCIF_PARAM;

	for(INT iItem = 0; iItem < iItemCnt; iItem++)
	{
		::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem);
		if (((tTbData*)tcItem.lParam) == data)
		{
			bRet = true;
			break;
		}
	}
	return bRet;
}


/*********************************************************************************
 *    Process function of caption bar
 */
LRESULT DockingCont::runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
	static ToolTip	toolTip;

	switch (Message)
	{
		case WM_LBUTTONDOWN:
		{
			_isMouseDown = TRUE;

			if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posClose)
			{
				_isMouseClose	= TRUE;
				_isMouseOver	= TRUE;

				/* start hooking */
				hWndServer		= _hCaption;
				if (GetVersion() & 0x80000000)
				{
					hookMouse	= ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0);
				}
				else
				{
					hookMouse	= ::SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)hookProcMouse, _hInst, 0);
				}

				if (!hookMouse)
				{
					DWORD dwError = ::GetLastError();
					TCHAR  str[128];
					::wsprintf(str, "GetLastError() returned %lu", dwError);
					::MessageBox(NULL, str, "SetWindowsHookEx(MOUSE) failed", MB_OK | MB_ICONERROR);
				}
				::RedrawWindow(hwnd, NULL, NULL, TRUE);
			}

			focusClient();
			return TRUE;
		}
		case WM_LBUTTONUP:
		{
			_isMouseDown = FALSE;
			if (_isMouseClose == TRUE)
			{
				/* end hooking */
				::UnhookWindowsHookEx(hookMouse);

				if (_isMouseOver == TRUE)
				{
					doClose();
				}
				_isMouseClose	= FALSE;
				_isMouseOver	= FALSE;
			}
			
			focusClient();
			return TRUE;
		}
		case WM_LBUTTONDBLCLK:
		{
			if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posCaption)
				::SendMessage(_hParent, DMM_FLOATALL, 0, (LPARAM)this);

			focusClient();
			return TRUE;
		}
		case WM_MOUSEMOVE:
		{
			POINT	pt			= {0};

			/* get correct cursor position */
			::GetCursorPos(&pt);
			::ScreenToClient(_hCaption, &pt);

			if (_isMouseDown == TRUE)
			{
				if (_isMouseClose == FALSE)
				{
                    /* keep sure that button is still down and within caption */
                    if ((wParam == MK_LBUTTON) && (isInRect(hwnd, pt.x, pt.y) == posCaption))
                    {
    					_dragFromTab = FALSE;
    					NotifyParent(DMM_MOVE);
    					_isMouseDown = FALSE;
                    }
                    else
                    {
                        _isMouseDown = FALSE;
                    }
				}
				else
				{
					BOOL    isMouseOver	= _isMouseOver;
					_isMouseOver = (isInRect(hwnd, pt.x, pt.y) == posClose ? TRUE : FALSE);

					/* if state is changed draw new */
					if (_isMouseOver != isMouseOver)
					{
						::SetFocus(NULL);
						::RedrawWindow(hwnd, NULL, NULL, TRUE);
					}
				}
			}
			else if (_bCapTTHover == FALSE)
			{
				_hoverMPos = isInRect(hwnd, LOWORD(lParam), HIWORD(lParam));

				if ((_bCaptionTT == TRUE) || (_hoverMPos == posClose))
				{
					TRACKMOUSEEVENT tme;
					tme.cbSize = sizeof(tme);
					tme.hwndTrack = hwnd;
					tme.dwFlags = TME_LEAVE | TME_HOVER;
					tme.dwHoverTime = 1000;
					_bCapTTHover = _TrackMouseEvent(&tme);
				}
			}
			else if ((_bCapTTHover == TRUE) &&
				(_hoverMPos != isInRect(hwnd, LOWORD(lParam), HIWORD(lParam))))
			{
				toolTip.destroy();
				_bCapTTHover = FALSE;
			}
			return TRUE;
		}
		case WM_MOUSEHOVER:
		{
			RECT	rc	= {0};
			POINT	pt	= {0};


			/* get mouse position */
			::GetCursorPos(&pt);

			toolTip.init(_hInst, hwnd);
			if (_hoverMPos == posCaption)
			{
				toolTip.Show(rc, _pszCaption, pt.x, pt.y + 20);
			}
			else
			{
				toolTip.Show(rc, "Close", pt.x, pt.y + 20);
			}
			return TRUE;
		}
		case WM_MOUSELEAVE:
		{
			toolTip.destroy();
			_bCapTTHover = FALSE;
			return TRUE;
		}
		case WM_SIZE:
		{
			::GetWindowRect(hwnd, &_rcCaption);
			ScreenToClient(hwnd, &_rcCaption);
			break;
		}
		case WM_SETTEXT:
		{
			::RedrawWindow(hwnd, NULL, NULL, TRUE);
			return TRUE;
		}
		default:
			break;
	}

	return ::CallWindowProc(_hDefaultCaptionProc, hwnd, Message, wParam, lParam);
}

void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct)
{
	HBRUSH		bgbrush		= NULL;
	HFONT		hOldFont	= NULL;
	RECT		rc			= pDrawItemStruct->rcItem;
	HDC			hDc			= pDrawItemStruct->hDC;
	HPEN		hPen		= ::CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNSHADOW));
	BITMAP		bmp			= {0};
	HBITMAP		hBmpCur		= NULL;
	HBITMAP		hBmpOld 	= NULL;
	HBITMAP		hBmpNew		= NULL;
	UINT		length  	= strlen(_pszCaption);

	INT nSavedDC			= ::SaveDC(hDc);

	/* begin with paint */
	::SetBkMode(hDc, TRANSPARENT);

	if (_isActive == TRUE) {
		bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION));
		::SetTextColor(hDc, ::GetSysColor(COLOR_CAPTIONTEXT));
	} else {
		bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情成人在线| 欧美大片日本大片免费观看| 国产精品电影院| 日本麻豆一区二区三区视频| 色一区在线观看| 国产精品高清亚洲| 成人美女在线观看| 国产精品久久久久久亚洲伦| 国产**成人网毛片九色| 久久综合色综合88| 国产精品亚洲а∨天堂免在线| 欧美一区二区性放荡片| 亚洲午夜激情av| 欧美亚洲国产bt| 亚洲国产精品一区二区久久| 欧美三级电影在线看| 亚洲精品成人在线| 欧美色图天堂网| 亚洲国产精品一区二区久久| 欧美日本乱大交xxxxx| 石原莉奈在线亚洲三区| 91精品国产综合久久精品图片| 日本最新不卡在线| 日韩美女视频一区二区在线观看| 秋霞av亚洲一区二区三| 日韩欧美aaaaaa| 极品少妇xxxx精品少妇| 国产丝袜美腿一区二区三区| 久久不见久久见免费视频7| 精品免费国产一区二区三区四区| 国产乱码精品1区2区3区| 国产精品情趣视频| 欧美三级一区二区| 黑人精品欧美一区二区蜜桃| 中文字幕不卡三区| 日本乱人伦aⅴ精品| 日韩国产欧美在线观看| 精品嫩草影院久久| 91在线观看视频| 日韩电影在线看| 久久精品视频在线免费观看| 91免费观看视频| 视频在线观看91| 久久久精品国产免大香伊| 99综合影院在线| 亚洲综合小说图片| 久久综合色婷婷| 日本道在线观看一区二区| 久久99久久99| 亚洲欧美日韩在线| 中文字幕视频一区二区三区久| 欧美日韩大陆一区二区| 国产电影精品久久禁18| 亚洲h动漫在线| 国产女人水真多18毛片18精品视频| 色噜噜夜夜夜综合网| 精品亚洲成a人| 亚洲另类在线一区| 欧美va亚洲va| 欧美日韩一级黄| 成人丝袜18视频在线观看| 日本vs亚洲vs韩国一区三区二区| 国产日产欧美一区| 色一情一伦一子一伦一区| 九九**精品视频免费播放| 亚洲美女免费视频| 国产日韩欧美精品综合| 欧美高清视频www夜色资源网| 国产一区二区看久久| 天堂在线一区二区| 亚洲色图欧洲色图婷婷| 久久影院午夜片一区| 91麻豆精品国产综合久久久久久| 99精品国产一区二区三区不卡| 日本色综合中文字幕| 亚洲黄色免费网站| 中文字幕欧美区| 欧美精品一区二区三区四区| 6080日韩午夜伦伦午夜伦| 91成人在线免费观看| 99热国产精品| 东方欧美亚洲色图在线| 国产一区二区不卡在线| 奇米影视一区二区三区| 亚洲黄色片在线观看| 国产视频一区在线观看| 久久综合九色综合97_久久久| 欧美日韩一区二区三区高清| 91九色最新地址| 91视频免费播放| 99精品国产91久久久久久 | 国产精品久久久久久妇女6080| 制服丝袜在线91| 一本色道久久加勒比精品| av亚洲精华国产精华| av不卡一区二区三区| 成人福利在线看| 成人蜜臀av电影| 成人三级在线视频| 粉嫩嫩av羞羞动漫久久久| 亚洲成人久久影院| 午夜久久久久久久久| 亚洲电影激情视频网站| 婷婷中文字幕综合| 蜜臀久久久99精品久久久久久| 免费人成在线不卡| 久久99国内精品| 久久99国内精品| 国产精品一区二区三区99| 高清成人免费视频| 精品欧美乱码久久久久久| 日韩精品中文字幕在线不卡尤物| 精品国产伦一区二区三区免费| 91精品国产综合久久久久久久久久| 欧洲国产伦久久久久久久| 欧美日韩在线观看一区二区 | 欧美精品自拍偷拍| 欧美日韩免费高清一区色橹橹| 欧美午夜不卡在线观看免费| 在线播放视频一区| 精品久久久久久久久久久久久久久 | 欧美三级日韩三级| 日韩一级在线观看| 久久精品水蜜桃av综合天堂| 欧美喷潮久久久xxxxx| 日韩视频免费直播| 日韩欧美一级特黄在线播放| 国产婷婷色一区二区三区四区| 亚洲欧美综合色| 国产精品拍天天在线| 亚洲人成电影网站色mp4| 污片在线观看一区二区| 国精产品一区一区三区mba视频| 成人app在线观看| 欧美精品久久久久久久久老牛影院| 91黄视频在线| 精品sm在线观看| 一区二区在线免费观看| 九九**精品视频免费播放| 一本色道**综合亚洲精品蜜桃冫| 91精品免费观看| 久久精品水蜜桃av综合天堂| 亚洲一区二区四区蜜桃| 国产在线一区二区综合免费视频| 色av成人天堂桃色av| 中文字幕综合网| 色噜噜狠狠一区二区三区果冻| 精品福利在线导航| 日韩毛片精品高清免费| 精品一区二区综合| 欧美日韩一区 二区 三区 久久精品| 久久蜜桃av一区精品变态类天堂| 精品一区二区成人精品| 国产精品白丝jk黑袜喷水| 久久久久9999亚洲精品| 五月激情综合婷婷| 麻豆成人综合网| 国产乱码精品一区二区三区忘忧草| 在线免费观看成人短视频| 中文在线免费一区三区高中清不卡| 日韩精品一级中文字幕精品视频免费观看| 波多野结衣精品在线| www亚洲一区| 亚洲一区二区免费视频| 成人看片黄a免费看在线| 日韩免费福利电影在线观看| 亚洲一二三区视频在线观看| 高清不卡一二三区| 26uuu另类欧美亚洲曰本| 国产酒店精品激情| 久久综合色之久久综合| 麻豆精品视频在线| 日韩亚洲欧美一区| 亚洲成人免费在线| 91精品视频网| 五月天久久比比资源色| 91福利视频在线| 一区二区激情小说| 色悠悠久久综合| 亚洲视频资源在线| 97精品久久久午夜一区二区三区 | 91精品久久久久久久久99蜜臂| 亚洲精品美国一| 91在线视频观看| 成人欧美一区二区三区白人| 国产毛片精品一区| 日本一区二区成人在线| 成人综合婷婷国产精品久久| 国产亚洲自拍一区| 成人午夜视频免费看| 国产精品美女久久久久久久久久久 | 在线不卡中文字幕| 日本三级亚洲精品| 精品国产不卡一区二区三区| 国产sm精品调教视频网站| 国产精品美女久久久久久久久久久| 成人午夜在线视频| 亚洲视频一二三| 日本韩国欧美国产| 美女尤物国产一区|