?? dockingsplitter.cpp
字號:
//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 "DockingSplitter.h"
BOOL DockingSplitter::_isVertReg = FALSE;
BOOL DockingSplitter::_isHoriReg = FALSE;
static HWND hWndMouse = NULL;
static HHOOK hookMouse = NULL;
#ifndef WH_MOUSE_LL
#define WH_MOUSE_LL 14
#endif
static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode >= 0)
{
switch (wParam)
{
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
::PostMessage(hWndMouse, wParam, 0, 0);
break;
case WM_LBUTTONUP:
case WM_NCLBUTTONUP:
::PostMessage(hWndMouse, wParam, 0, 0);
return TRUE;
default:
break;
}
}
return ::CallNextHookEx(hookMouse, nCode, wParam, lParam);
}
void DockingSplitter::init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags)
{
Window::init(hInst, hWnd);
_hMessage = hMessage;
_flags = flags;
WNDCLASS wc;
if (flags & DMS_HORIZONTAL)
{
//double sided arrow pointing north-south as cursor
wc.hCursor = ::LoadCursor(NULL,IDC_SIZENS);
wc.lpszClassName = "nsdockspliter";
}
else
{
// double sided arrow pointing east-west as cursor
wc.hCursor = ::LoadCursor(NULL,IDC_SIZEWE);
wc.lpszClassName = "wedockspliter";
}
if (((_isHoriReg == FALSE) && (flags & DMS_HORIZONTAL)) ||
((_isVertReg == FALSE) && (flags & DMS_VERTICAL)))
{
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = staticWinProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = _hInst;
wc.hIcon = NULL;
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
wc.lpszMenuName = NULL;
if (!::RegisterClass(&wc))
{
systemMessage("System Err");
throw int(98);
}
else if (flags & DMS_HORIZONTAL)
{
_isHoriReg = TRUE;
}
else
{
_isVertReg = TRUE;
}
}
/* create splitter windows and initialize it */
_hSelf = ::CreateWindowEx( 0, wc.lpszClassName, "", WS_CHILD | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
_hParent, NULL, _hInst, (LPVOID)this);
if (!_hSelf)
{
systemMessage("System Err");
throw int(777);
}
}
LRESULT CALLBACK DockingSplitter::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
DockingSplitter *pDockingSplitter = NULL;
switch (message)
{
case WM_NCCREATE :
pDockingSplitter = (DockingSplitter *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
pDockingSplitter->_hSelf = hwnd;
::SetWindowLong(hwnd, GWL_USERDATA, reinterpret_cast<LONG>(pDockingSplitter));
return TRUE;
default :
pDockingSplitter = (DockingSplitter *)::GetWindowLong(hwnd, GWL_USERDATA);
if (!pDockingSplitter)
return ::DefWindowProc(hwnd, message, wParam, lParam);
return pDockingSplitter->runProc(hwnd, message, wParam, lParam);
}
}
LRESULT DockingSplitter::runProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDOWN:
{
hWndMouse = hwnd;
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);
}
else
{
::SetCapture(_hSelf);
::GetCursorPos(&_ptOldPos);
_isLeftButtonDown = TRUE;
}
break;
}
case WM_LBUTTONUP:
case WM_NCLBUTTONUP:
{
/* end hooking */
if (hookMouse)
{
::UnhookWindowsHookEx(hookMouse);
::SetCapture(NULL);
hookMouse = NULL;
}
_isLeftButtonDown = FALSE;
break;
}
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
{
if (_isLeftButtonDown == TRUE)
{
POINT pt;
::GetCursorPos(&pt);
if ((_flags & DMS_HORIZONTAL) && (_ptOldPos.y != pt.y))
{
::SendMessage(_hMessage, DMM_MOVE_SPLITTER, (WPARAM)_ptOldPos.y - pt.y, (LPARAM)_hSelf);
}
else if (_ptOldPos.x != pt.x)
{
::SendMessage(_hMessage, DMM_MOVE_SPLITTER, (WPARAM)_ptOldPos.x - pt.x, (LPARAM)_hSelf);
}
_ptOldPos = pt;
}
break;
}
default :
break;
}
return ::DefWindowProc(hwnd, message, wParam, lParam);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -