📄 tlmsgprc.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
TLMsgProc.c - TreeList message processing routine
$Id: TLMsgPrc.c,v 1.19 2002/10/09 15:04:02 pbj Exp $
____________________________________________________________________________*/
#include "TLintern.h"
#include <math.h>
// _______________________________________________
//
// Message processing function for TreeList class
LRESULT WINAPI
TreeListMsgProc (
HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
DWORD dwStyle;
TLWndData* pWD = TreeList_GetPtr(hWnd);
if (pWD == NULL)
{
if (msg == WM_NCCREATE)
{
pWD = (TLWndData*)TLAlloc (sizeof(TLWndData));
if (pWD == NULL)
return 0L;
TreeList_SetPtr (hWnd, pWD);
}
else
return DefWindowProc (hWnd, msg, wParam, lParam);
}
if (msg == WM_NCDESTROY)
{
TLFree (pWD);
pWD = NULL;
TreeList_SetPtr (hWnd, NULL);
}
switch (msg) {
case WM_CREATE :
pWD->hWnd = hWnd;
pWD->hWndParent = ((LPCREATESTRUCT)lParam)->hwndParent;
pWD->hdcMem = NULL;
pWD->id = (LONG)((LPCREATESTRUCT)lParam)->hMenu;
pWD->style = (LONG)((LPCREATESTRUCT)lParam)->style;
pWD->bTreeFocused = FALSE;
pWD->uDragScrollState = 0;
pWD->rootItem = NULL;
pWD->columnItem = NULL;
pWD->hImageList = NULL;
pWD->watermark.hbm = NULL;
pWD->watermark.ulFlags = 0;
pWD->hCursorNormal = LoadCursor (NULL, IDC_ARROW);
pWD->hCursorDragging =
LoadCursor (GetModuleHandle (NULL), "TreeListDraggingCursor");
if (!(pWD->hCursorDragging))
pWD->hCursorDragging = pWD->hCursorNormal;
pWD->hCursorNoDrag = LoadCursor (NULL, IDC_NO);
if (!(pWD->hCursorNoDrag))
pWD->hCursorNoDrag = pWD->hCursorNormal;
pWD->hCursorDragSelect =
LoadCursor (GetModuleHandle (NULL), "TreeListDragSelectCursor");
if (!(pWD->hCursorDragSelect))
pWD->hCursorDragSelect = pWD->hCursorNormal;
pWD->firstSelectItem = NULL;
pWD->focusItem = NULL;
pWD->iNumberColumns = 0;
pWD->iHorizontalPos = 0;
pWD->iFirstRow = 0;
pWD->iWheelDelta = 0;
pWD->iWheelScroll = 3;
pWD->iNumberSelected = 0;
pWD->clickedTreeItem = NULL;
pWD->bDragging = FALSE;
pWD->bSelectDragging = FALSE;
pWD->nmTreeList.hdr.hwndFrom = hWnd;
pWD->bStillTyping = FALSE;
pWD->szTypeBuf[0] = '\0';
pWD->pTypeBufPtr = &(pWD->szTypeBuf[0]);
pWD->iNumCharInTypeBuf = 0;
pWD->bToolTipEnabled = FALSE;
pWD->bStepAnimation = FALSE;
pWD->bContAnimation = FALSE;
TLInitPaint (pWD);
// create a vertical scroll bar
GetClientRect (pWD->hWnd, &pWD->tlRect);
// create header control
dwStyle = WS_VISIBLE | WS_CHILD | HDS_HORZ;
if (pWD->style & TLS_DRAGABLEHEADERS)
dwStyle |= HDS_DRAGDROP;
if (!(pWD->style & TLS_NOSORTHEADER))
dwStyle |= HDS_BUTTONS;
pWD->hWndHeader = CreateWindowEx (
0L, WC_HEADER, (LPCTSTR) NULL, dwStyle,
0, 0, 30000, pWD->iRowHeight+1,
hWnd, (HMENU)IDC_TREELISTHEADER,
((LPCREATESTRUCT)lParam)->hInstance, NULL);
SendMessage (pWD->hWndHeader, WM_SETFONT, (WPARAM)pWD->hFont, FALSE);
// create tooltip control
dwStyle = 0;
if (pWD->style & TLS_TOOLTIPNOTIFY)
{
// if NOTIFY is turned on, then the tooltip control must
// be created to support Unicode
pWD->hWndToolTip = CreateWindowExW (
0L, TOOLTIPS_CLASSW, NULL, dwStyle,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hWnd, (HMENU)NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
}
else
{
pWD->hWndToolTip = CreateWindowEx (
0L, TOOLTIPS_CLASS, NULL, dwStyle,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hWnd, (HMENU)NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
}
if (pWD->hWndToolTip)
{
TOOLINFO ti;
ZeroMemory (&ti, sizeof(TOOLINFO));
ti.cbSize = sizeof(TOOLINFO);
if (!(pWD->style & TLS_TOOLTIPNOTIFY))
ti.uFlags = TTF_ABSOLUTE|TTF_TRACK|TTF_IDISHWND|TTF_TRANSPARENT;
ti.hwnd = pWD->hWnd;
ti.uId = (LPARAM)pWD->hWnd;
ti.hinst = ((LPCREATESTRUCT)lParam)->hInstance;
SendMessage (pWD->hWndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti);
SendMessage (pWD->hWndToolTip,
TTM_TRACKACTIVATE, FALSE, (LPARAM)&ti);
if (pWD->style & TLS_TOOLTIPNOTIFY)
{
SendMessage (pWD->hWndToolTip,
TTM_SETMAXTIPWIDTH, 0, 600);
}
}
break;
case WM_ERASEBKGND :
return 1;
case WM_KILLFOCUS :
if (pWD->bDragging)
{
if (pWD->style & TLS_INTERNALDRAG)
{
TLEndDrag (pWD, MAKELPARAM (-1, -1));
pWD->bDragging = FALSE;
InvalidateRect (hWnd, NULL, FALSE);
}
}
else
{
pWD->bTreeFocused = FALSE;
InvalidateRect (hWnd, NULL, FALSE);
}
return 0;
case WM_SETFOCUS :
pWD->bTreeFocused = TRUE;
if (!pWD->focusItem)
{
if (pWD->rootItem)
{
pWD->focusItem = pWD->rootItem;
pWD->focusItem->state |= TLIS_FOCUSED;
}
}
else
pWD->focusItem->state |= TLIS_FOCUSED;
InvalidateRect (hWnd, NULL, FALSE);
return 0;
case WM_GETDLGCODE :
{
MSG* p = (MSG*)lParam;
if (p)
{
if (p->message == WM_KEYDOWN)
{
if (p->wParam == VK_ESCAPE)
return DLGC_WANTALLKEYS;
}
}
return DLGC_WANTARROWS | DLGC_WANTCHARS;
}
case WM_PAINT :
hdc = BeginPaint (pWD->hWnd, &ps);
TLPrePaint (pWD);
TLMemPaint (pWD, hdc, &ps);
EndPaint (pWD->hWnd, &ps);
pWD->bStepAnimation = FALSE;
return 0;
case TLM_DRAGOVERPAINT :
TLPrePaint (pWD);
hdc = GetDCEx (pWD->hWnd, NULL, DCX_LOCKWINDOWUPDATE);
TLMemPaint (pWD, hdc, NULL);
ReleaseDC (pWD->hWnd, hdc);
return 0;
case TLM_RENDERDRAGBITMAP :
TLPrePaint (pWD);
return ((BOOL)TLMemPaintDragBitmap (pWD, (LPTL_DRAGBITMAP)lParam));
case TLM_DRAGOVER :
pWD->bTreeFocused = TRUE;
return ((LRESULT)TLDragOver (pWD, lParam));
case TLM_STEPANIMATION :
pWD->bStepAnimation = TRUE;
if (wParam)
pWD->bContAnimation = TRUE;
InvalidateRect (pWD->hWnd, &pWD->tlInval, FALSE);
return pWD->bContAnimation;
case TLM_INVALIDATE :
InvalidateRect (pWD->hWnd, &pWD->tlInval, wParam);
return 0;
case WM_LBUTTONDOWN :
SetFocus (hWnd);
TLEndDrag (pWD, lParam);
pWD->bDragging = FALSE;
KillTimer (hWnd, TOOLTIPDWELLTIMERID);
TLLeftButtonDown (pWD, wParam, lParam);
pWD->ptButtonDown.x = LOWORD (lParam);
pWD->ptButtonDown.y = HIWORD (lParam);
return 0;
case WM_LBUTTONUP :
if (pWD->bSelectDragging)
pWD->bSelectDragging = FALSE;
else if (pWD->bDragging)
TLEndDrag (pWD, lParam);
else
TLLeftButtonUp (pWD, wParam, lParam);
pWD->bDragging = FALSE;
break;
case WM_RBUTTONDOWN :
SetCapture (hWnd);
SetFocus (hWnd);
KillTimer (hWnd, TOOLTIPDWELLTIMERID);
TLEndDrag (pWD, lParam);
pWD->bDragging = FALSE;
TLRightButtonDown (pWD, wParam, lParam);
return 0;
case WM_RBUTTONUP :
ReleaseCapture ();
break;
case WM_LBUTTONDBLCLK :
SetFocus (hWnd);
TLEndDrag (pWD, lParam);
pWD->bDragging = FALSE;
TLLeftButtonDblClk (pWD, wParam, lParam);
return 0;
case WM_RBUTTONDBLCLK :
SetFocus (hWnd);
break;
case WM_MOUSEMOVE :
TLMouseMove (pWD, wParam, lParam);
return 0;
case TLM_INSERTITEM :
return ((LRESULT)TLInsertTreeItem (pWD, (LPTL_INSERTSTRUCT)lParam));
case TLM_REINSERTITEM :
return ((LRESULT)TLReInsertTreeItem (pWD, (LPTL_INSERTSTRUCT)lParam));
case TLM_DELETEITEM :
return ((LRESULT)TLDeleteTreeItem (pWD, (TL_TREEITEM*)lParam));
case TLM_GETITEM :
return ((LRESULT)TLGetTreeItem (pWD, (TL_TREEITEM*)lParam));
case TLM_SETITEM :
return ((LRESULT)TLSetTreeItem (pWD, (TL_TREEITEM*)lParam));
case TLM_GETFIRSTITEM :
return ((LRESULT)pWD->rootItem);
case TLM_INSERTCOLUMN :
return ((LRESULT)TLInsertColumn (pWD, wParam, (TL_COLUMN*)lParam));
case TLM_SETCOLUMN :
return ((LRESULT)TLSetColumn (pWD, wParam, (TL_COLUMN*)lParam));
case TLM_DELETEALLCOLUMNS :
return (TLDeleteAllColumns (pWD));
case TLM_GETCOLUMNWIDTH :
return ((LRESULT)TLGetColumnWidth (pWD, wParam));
case TLM_SETIMAGELIST :
pWD->hImageList = (HIMAGELIST)lParam;
Header_SetImageList (pWD->hWndHeader, pWD->hImageList);
return 0;
case TLM_SETWATERMARKBMP :
pWD->watermark = (*(LPTL_WATERMARK)lParam);
return 0;
case TLM_SETLISTITEM :
return ((LRESULT)TLSetListItem (pWD,
(TL_LISTITEM*)lParam, (BOOL)wParam));
case TLM_GETLISTITEM :
return ((LRESULT)TLGetListItem (pWD,
(TL_LISTITEM*)lParam));
case TLM_EXPAND :
return ((LRESULT)TLExpandTreeItem (pWD,
(TL_TREEITEM*)lParam, wParam));
case TLM_SELECTITEM :
return ((LRESULT)TLSelectTreeItem (pWD,
(TL_TREEITEM*)lParam, wParam));
case TLM_SELECTCHILDREN :
return ((LRESULT)TLSelectChildren (pWD,
(TL_TREEITEM*)lParam));
case TLM_ENSUREVISIBLE :
return ((LRESULT)TLEnsureVisible (pWD,
(TL_TREEITEM*)lParam));
case TLM_ITERATESELECTED :
return ((LRESULT)TLIterateSelected (pWD, lParam));
case TLM_DELETECHILDREN :
return ((LRESULT)TLDeleteChildren (pWD,
(TL_TREEITEM*)lParam));
case TLM_DELETETREE :
if (wParam) TLDeleteTreeList (pWD, pWD->rootItem);
pWD->rootItem = NULL;
pWD->focusItem = NULL;
pWD->firstSelectItem = NULL;
pWD->iNumberSelected = 0;
pWD->iFirstRow = 0;
pWD->bToolTipEnabled = FALSE;
return TRUE;
case TLM_GETORDERARRAY :
return (SendMessage (pWD->hWndHeader,
HDM_GETORDERARRAY, wParam, lParam));
case TLM_SETWHEELSCROLLLINES :
pWD->iWheelScroll = lParam;
break;
case WM_HELP :
pWD->nmTreeList.hdr.code = TLN_HELP;
SendMessage (pWD->hWndParent,
WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList));
break;
case WM_TIMER :
switch (wParam) {
case KEYBOARDTIMERID :
KillTimer (hWnd, wParam);
pWD->bStillTyping = FALSE;
break;
case REORDERTIMERID :
KillTimer (hWnd, wParam);
pWD->nmTreeList.hdr.code = TLN_HEADERREORDERED;
SendMessage (pWD->hWndParent,
WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList));
break;
case DRAGSCROLLTIMERID :
KillTimer (hWnd, wParam);
TLDragScroll (pWD);
break;
case TOOLTIPDWELLTIMERID :
if (pWD->style & TLS_TOOLTIPNOTIFY)
{
KillTimer (hWnd, wParam);
if (pWD->bTreeFocused)
TLShowNotifyToolTip (pWD, TRUE);
}
break;
case TOOLTIPTIMERID :
if (TLKillToolTip (pWD))
KillTimer (hWnd, wParam);
break;
}
break;
case WM_NOTIFY :
switch (wParam) {
case IDC_TREELISTHEADER :
return TLHeaderNotification (pWD, (NMHEADER*)lParam);
}
break;
case WM_HSCROLL :
TLHScroll (pWD, LOWORD (wParam), HIWORD (wParam), (HWND)lParam);
return 0;
case WM_VSCROLL :
TLVScroll (pWD, LOWORD (wParam), HIWORD (wParam), (HWND)lParam);
return 0;
case WM_MOUSEWHEEL :
TLMouseWheel (pWD, LOWORD (wParam), HIWORD (wParam));
return 0;
case WM_WINDOWPOSCHANGED :
TLResize (pWD, (WINDOWPOS*)lParam);
return 0;
case WM_SIZE :
case WM_MOVE :
return 0;
case WM_KEYDOWN :
TLKeyboardChar (pWD, wParam, lParam);
break;
case WM_SYSCOLORCHANGE :
TLClosePaint (pWD);
TLInitPaint (pWD);
SetWindowPos (pWD->hWndHeader, 0, 0, 0, 30000,
pWD->iRowHeight+1, SWP_NOZORDER|SWP_NOMOVE);
SendMessage (pWD->hWndHeader, WM_SETFONT, (WPARAM)pWD->hFont, FALSE);
break;
case WM_CONTEXTMENU :
pWD->nmTreeList.hdr.code = TLN_CONTEXTMENU;
if (lParam == 0xFFFFFFFF)
{
// invoked from keyboard
if (pWD->focusItem)
{
// use focused item for coordinates, if available
pWD->nmTreeList.ptDrag.x = pWD->focusItem->selectRect.left;
pWD->nmTreeList.ptDrag.y = pWD->focusItem->selectRect.top;
}
else
{
// otherwise use left center of window
pWD->nmTreeList.ptDrag.x = 0;
pWD->nmTreeList.ptDrag.y = pWD->tlRect.bottom >> 1;
}
MapWindowPoints (pWD->hWnd, NULL, &pWD->nmTreeList.ptDrag, 1);
}
else
{
// invoked from mouse, use mouse coordinates
pWD->nmTreeList.ptDrag.x = (LONG)(SHORT)LOWORD (lParam);
pWD->nmTreeList.ptDrag.y = (LONG)(SHORT)HIWORD (lParam);
}
SendMessage (pWD->hWndParent,
WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmTreeList));
return 0;
case WM_CHAR :
if ((pWD->style & TLS_AUTOSCROLL) && ~(lParam & 0x80000000))
{
TLSelectByKeyboard (pWD, wParam, pWD->bStillTyping);
pWD->bStillTyping = TRUE;
SetTimer (hWnd, KEYBOARDTIMERID, KEYTIMEOUT, NULL);
}
pWD->nmKeyDown.hdr.code = TLN_CHAR;
pWD->nmKeyDown.wVKey = wParam;
pWD->nmKeyDown.flags = lParam;
SendMessage (pWD->hWndParent,
WM_NOTIFY, pWD->id, (LPARAM)&(pWD->nmKeyDown));
break;
case WM_CLOSE :
TLDeleteMemDC (pWD);
TLClosePaint (pWD);
TLDeleteTreeList (pWD, pWD->rootItem);
pWD->rootItem = NULL;
TLDeleteAllColumns (pWD);
pWD->columnItem = NULL;
break;
}
return (DefWindowProc (hWnd, msg, wParam, lParam));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -