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

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

?? gripper.cpp

?? 文字編輯器源碼 Text editor source code
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//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 "Gripper.h"

#ifndef WH_KEYBOARD_LL
#define WH_KEYBOARD_LL 13
#endif

#ifndef WH_MOUSE_LL
#define WH_MOUSE_LL 14
#endif


BOOL Gripper::_isRegistered	= FALSE;

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

static LRESULT CALLBACK hookProcMouse(INT nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
		switch (wParam)
		{
			case WM_MOUSEMOVE:
			case WM_NCMOUSEMOVE:
				//::PostMessage(hWndServer, wParam, 0, 0);
				::SendMessage(hWndServer, wParam, 0, 0);
				break;
			case WM_LBUTTONUP:
			case WM_NCLBUTTONUP:
				//::PostMessage(hWndServer, wParam, 0, 0);
				::SendMessage(hWndServer, wParam, 0, 0);
				return TRUE;
			default: 
				break;
		}
	}
	return ::CallNextHookEx(hookMouse, nCode, wParam, lParam);
}

static LRESULT CALLBACK hookProcKeyboard(INT nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
		if (wParam == VK_ESCAPE)
		{
			::PostMessage(hWndServer, DMM_CANCEL_MOVE, 0, 0);
			return FALSE;
		}
	}

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

Gripper::Gripper(void)
{
	_hInst				= NULL;
	_hParent			= NULL;
	_hSelf				= NULL;

	_pDockMgr			= NULL;
	_pCont				= NULL;

	_ptOffset.x			= 0;
	_ptOffset.y			= 0;

	_ptOld.x			= 0;
	_ptOld.y			= 0;
	_bPtOldValid		= FALSE;

	_hTab				= NULL;
	_hTabSource			= NULL;
	_startMovingFromTab	= FALSE;
	_iItem				= 0;

	_hdc				= NULL;
	_hbm				= NULL;
	_hbrush				= NULL;


	memset(&_rcItem, 0, sizeof(RECT));
	memset(&_tcItem, 0, sizeof(TCITEM));
	memset(&_dockData, 0, sizeof(tDockMgr));
}


void Gripper::startGrip(DockingCont* pCont, DockingManager* pDockMgr, void* pRes)
{
	MSG			msg		= {0};
	BOOL		bIsRel  = FALSE;
	HWND		hWnd	= NULL;

	_pDockMgr   = pDockMgr;
	_pCont		= pCont;
	_pRes		= pRes;

	_pDockMgr->getDockInfo(&_dockData);

	if (!_isRegistered)
	{
		WNDCLASS clz;

		clz.style = 0;
		clz.lpfnWndProc = staticWinProc;
		clz.cbClsExtra = 0;
		clz.cbWndExtra = 0;
		clz.hInstance = _hInst;
		clz.hIcon = NULL;
		clz.hCursor = ::LoadCursor(NULL, IDC_ARROW);

		clz.hbrBackground = NULL; 
		clz.lpszMenuName = NULL;
		clz.lpszClassName = MDLG_CLASS_NAME;

		if (!::RegisterClass(&clz))
		{
			systemMessage(TEXT("System Err"));
			throw int(98);
		}
		_isRegistered = TRUE;
	}

	_hSelf = ::CreateWindowEx(
					0,
					MDLG_CLASS_NAME,
					TEXT(""), 0,
					CW_USEDEFAULT, CW_USEDEFAULT,
					CW_USEDEFAULT, CW_USEDEFAULT,
					NULL,
					NULL,
					_hInst,
					(LPVOID)this);
	hWndServer = _hSelf;

	if (!_hSelf)
	{
		systemMessage(TEXT("System Err"));
		throw int(777);
	}
}


LRESULT CALLBACK Gripper::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	Gripper *pDlgMoving = NULL;
	switch (message)
	{	
		case WM_NCCREATE :
			pDlgMoving = (Gripper *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
			pDlgMoving->_hSelf = hwnd;
			::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast<LONG>(pDlgMoving));
			return TRUE;

		default :
			pDlgMoving = (Gripper *)::GetWindowLongPtr(hwnd, GWL_USERDATA);
			if (!pDlgMoving)
				return ::DefWindowProc(hwnd, message, wParam, lParam);
			return pDlgMoving->runProc(message, wParam, lParam);
	}
}

LRESULT Gripper::runProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_CREATE:
		{
			create();
			break;
		}
		case WM_MOUSEMOVE:
		case WM_NCMOUSEMOVE:
		{
			onMove();
			return TRUE;
		}
		case WM_LBUTTONUP:
		case WM_NCLBUTTONUP:
		{
			/* end hooking */
			if (hookMouse)
			{
				::UnhookWindowsHookEx(hookMouse);
				::UnhookWindowsHookEx(hookKeyboard);
				hookMouse = NULL;
				hookKeyboard = NULL;
			}

			onButtonUp();

			::DestroyWindow(_hSelf);
			return TRUE;
		}
		case DMM_CANCEL_MOVE:
		{
			POINT			pt			= {0,0};
			POINT			ptBuf		= {0,0};
			RECT			rc			= {0};

			::GetCursorPos(&pt);
			getMousePoints(&pt, &ptBuf);

			/* erase last drawn rectangle */
			drawRectangle(ptBuf);

			/* end hooking */
			::UnhookWindowsHookEx(hookMouse);
			::UnhookWindowsHookEx(hookKeyboard);

			::DestroyWindow(_hSelf);
			return FALSE;
		}
		case WM_DESTROY:
		{
			mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
			::SetWindowPos(_hParent, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
			_pCont->focusClient();
			delete _pRes;
			break;
		}
		default:
			break;
	}

	return ::DefWindowProc(_hSelf, message, wParam, lParam);
}

 
void Gripper::create(void)
{
	RECT		rc		= {0};
	POINT		pt		= {0};

	/* start hooking */
	::SetWindowPos(_pCont->getHSelf(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
	::SetCapture(_hSelf);

	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, TEXT("GetLastError() returned %lu"), dwError);
        ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(MOUSE) failed"), MB_OK | MB_ICONERROR);
    }

	winVer winVersion = (NppParameters::getInstance())->getWinVersion();
	if (winVersion <  WV_VISTA)
	{
	hookKeyboard	= ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)hookProcKeyboard, _hInst, 0);
    if (!hookKeyboard)
    {
        DWORD dwError = ::GetLastError();
        TCHAR  str[128];
        ::wsprintf(str, TEXT("GetLastError() returned %lu"), dwError);
        ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(KEYBOARD) failed"), MB_OK | MB_ICONERROR);
    }
	}
//  Removed regarding W9x systems
//	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

	/* calculate the mouse pt within dialog */
	::GetCursorPos(&pt);
	
	/* get tab informations */
	initTabInformation(pt);

	if (_pCont->isFloating() == true)
	{
		::GetWindowRect(_pCont->getHSelf(), &rc);
	}
	else
	{
		_pCont->getClientRect(rc);
		::ScreenToClient(_pCont->getHSelf(), &pt);
	}

	_ptOffset.x	= pt.x - rc.left;
	_ptOffset.y	= pt.y - rc.top;
}


void Gripper::onMove(void)
{
	POINT		pt		= {0,0};
	POINT		ptBuf	= {0,0};

	::GetCursorPos(&pt);
	getMousePoints(&pt, &ptBuf);

	/* On first time: Do not erase previous rect, because it dosn't exist */
	if (_bPtOldValid == TRUE)
		drawRectangle(ptBuf);

	/* tab reordering only when tab was selected */
	if (_startMovingFromTab == TRUE)
	{
		doTabReordering(pt);
	}

	drawRectangle(pt);
	_bPtOldValid = TRUE;
}


void Gripper::onButtonUp(void)
{
	POINT			pt			= {0,0};
	POINT			ptBuf		= {0,0};
	RECT			rc			= {0};
	RECT			rcCorr		= {0};
	DockingCont*	pContMove	= NULL;

	::GetCursorPos(&pt);
	getMousePoints(&pt, &ptBuf);

	/* do nothing, when old point is not valid */
	if (_bPtOldValid == FALSE)
		return;

	/* erase last drawn rectangle */
	drawRectangle(ptBuf);

	/* look if current position is within dockable area */
	DockingCont*	pDockCont = contHitTest(pt);

	if (pDockCont == NULL)
	{
		pDockCont = workHitTest(pt);
	}

	/* add dependency to other container class */
	if (pDockCont == NULL)
	{
		/* calculate new position */
		rc = _pCont->getDataOfActiveTb()->rcFloat;
		_pCont->getClientRect(rcCorr);

		CalcRectToScreen(_dockData.hWnd, &rc);
		CalcRectToScreen(_dockData.hWnd, &rcCorr);

		rc.left    = pt.x - _ptOffset.x;
		rc.top     = pt.y - _ptOffset.y;

		/* correct rectangle position when mouse is not within */
		DoCalcGripperRect(&rc, rcCorr, pt);

		/* change location of toolbars */
		if (_startMovingFromTab == TRUE)
		{
			/* when tab is moved */
			if ((!_pCont->isFloating()) || 
				((_pCont->isFloating()) && (::SendMessage(_hTabSource, TCM_GETITEMCOUNT, 0, 0) > 1)))
			{
				pContMove = _pDockMgr->toggleActiveTb(_pCont, DMM_FLOAT, TRUE, &rc);
			}
		}
		else if (!_pCont->isFloating())
		{
			/* when all windows are moved */
			pContMove = _pDockMgr->toggleVisTb(_pCont, DMM_FLOAT, &rc);
		}

		/* set moving container */
		if (pContMove == NULL)
		{
			pContMove = _pCont;
		}

		/* update window position */
		::MoveWindow(pContMove->getHSelf(), rc.left, rc.top, rc.right, rc.bottom, TRUE);
		::SendMessage(pContMove->getHSelf(), WM_SIZE, 0, 0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久精品日日躁夜夜躁欧美| 99在线精品一区二区三区| 中文字幕免费观看一区| 欧美在线啊v一区| 国产美女精品在线| 亚洲成人免费观看| 国产精品麻豆视频| 久久久久久久久99精品| 欧美猛男超大videosgay| 成人精品鲁一区一区二区| 日本免费新一区视频| 亚洲视频小说图片| 久久精品视频免费观看| 欧美精品色综合| 91传媒视频在线播放| 国产宾馆实践打屁股91| 另类小说视频一区二区| 亚洲一区二区三区四区中文字幕| 国产欧美一区二区三区沐欲| 91精品国产高清一区二区三区| 972aa.com艺术欧美| 国产一区二区0| 美女视频一区二区三区| 亚洲国产另类av| 国产精品人人做人人爽人人添 | 青青青爽久久午夜综合久久午夜| 亚洲欧洲日产国码二区| 国产三级精品视频| 久久你懂得1024| 精品捆绑美女sm三区| 91精选在线观看| 欧美精品v日韩精品v韩国精品v| 91久久久免费一区二区| 99r国产精品| 99精品欧美一区| 99精品黄色片免费大全| 91在线无精精品入口| 91免费精品国自产拍在线不卡| 成人美女视频在线观看18| 国产成人在线观看| 国产酒店精品激情| 国产成a人亚洲| fc2成人免费人成在线观看播放| 不卡一区中文字幕| 色综合久久99| 欧美在线观看禁18| 678五月天丁香亚洲综合网| 欧美猛男男办公室激情| 欧美一区二区视频在线观看 | 视频在线在亚洲| 亚洲国产视频在线| 亚洲成人激情综合网| 人人狠狠综合久久亚洲| 美女诱惑一区二区| 国产精品一区二区久久不卡 | 国产麻豆视频精品| 国产自产高清不卡| 成人在线视频首页| 99re66热这里只有精品3直播| 91久久精品网| 欧美一级在线视频| 国产人伦精品一区二区| 国产精品福利一区二区| 一区二区三区高清不卡| 蜜臀久久久99精品久久久久久| 国产麻豆视频一区二区| 91无套直看片红桃| 欧美一级xxx| 国产精品免费aⅴ片在线观看| 尤物av一区二区| 天天综合色天天综合| 国产一区二区三区免费在线观看| 成人网页在线观看| 欧美视频在线观看一区| 欧美xxxx在线观看| 亚洲日本va午夜在线电影| 亚洲国产你懂的| 国产91丝袜在线播放0| 欧美日韩一区视频| 国产亚洲女人久久久久毛片| 一区二区视频免费在线观看| 男人的天堂亚洲一区| 99re热这里只有精品免费视频| 91精品国产乱| 18欧美乱大交hd1984| 免费在线看一区| 色综合天天综合网天天狠天天| 欧美一区二区三区免费大片 | 欧美最新大片在线看| 欧美精品一区二区三区四区 | 精品一区二区免费视频| 91亚洲午夜精品久久久久久| 3d成人动漫网站| 亚洲欧美综合网| 韩国毛片一区二区三区| 欧美探花视频资源| 久久久久久久综合| 天堂久久一区二区三区| 成人黄色小视频| 精品久久久久久亚洲综合网 | 日韩电影在线免费观看| eeuss影院一区二区三区| 欧美大片在线观看一区二区| 亚洲另类色综合网站| 国产精品白丝jk白祙喷水网站| 欧美人妖巨大在线| 亚洲激情五月婷婷| 国产成人亚洲综合a∨猫咪| 717成人午夜免费福利电影| 最新热久久免费视频| 国产一区 二区| 日韩视频在线一区二区| 亚洲电影第三页| 一道本成人在线| 中文字幕成人av| 韩国午夜理伦三级不卡影院| 91精品国产全国免费观看| 亚洲国产日韩精品| 91蜜桃在线观看| 日本一区二区三区在线观看| 精品一区二区三区日韩| 91精品国产综合久久香蕉麻豆| 一区二区三区四区亚洲| 99综合电影在线视频| 国产偷国产偷精品高清尤物| 激情综合色综合久久| 日韩欧美亚洲另类制服综合在线 | 亚洲午夜精品网| 91在线国内视频| 日韩毛片视频在线看| 不卡av在线网| 亚洲天堂成人在线观看| 91在线观看美女| 亚洲欧美另类久久久精品| 91丝袜国产在线播放| 尤物在线观看一区| 欧美体内she精高潮| 亚洲超丰满肉感bbw| 欧美浪妇xxxx高跟鞋交| 免费在线欧美视频| 26uuu亚洲| 国产精品1区2区| 欧美国产欧美亚州国产日韩mv天天看完整| 国产伦精品一区二区三区免费迷 | 国产91丝袜在线18| 国产精品色噜噜| 91在线视频官网| 一区二区欧美精品| 欧美日韩国产综合一区二区三区| 亚洲国产综合人成综合网站| 欧美日本不卡视频| 久久国产剧场电影| 欧美极品另类videosde| eeuss影院一区二区三区| 亚洲丝袜制服诱惑| 欧美日韩一级片在线观看| 日韩高清不卡在线| 欧美精品一区二区高清在线观看| 国产激情偷乱视频一区二区三区| 欧美国产综合色视频| 91欧美一区二区| 性做久久久久久免费观看欧美| 69久久99精品久久久久婷婷| 寂寞少妇一区二区三区| 国产精品久久久久久久裸模| av在线一区二区三区| 亚洲成人1区2区| 日韩一级精品视频在线观看| 国产盗摄一区二区三区| 亚洲黄色片在线观看| 日韩欧美卡一卡二| 99精品一区二区| 秋霞国产午夜精品免费视频| 中文字幕 久热精品 视频在线| 欧美丝袜自拍制服另类| 久久 天天综合| 国产精品久久久久久久岛一牛影视| 在线观看不卡一区| 久久99精品一区二区三区三区| 国产精品欧美一级免费| 在线播放亚洲一区| av在线免费不卡| 麻豆精品久久久| 亚洲日本在线a| 精品捆绑美女sm三区| 色综合天天视频在线观看| 蜜桃在线一区二区三区| 亚洲三级电影网站| 欧美精品一区视频| 欧美日韩在线亚洲一区蜜芽| 粉嫩av一区二区三区| 日本成人在线一区| 综合激情网...| 国产亚洲自拍一区| 制服丝袜在线91| 色先锋久久av资源部| 国产一区二三区| 男女男精品网站| 性感美女极品91精品| 成人免费一区二区三区在线观看|