mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1071 lines
26 KiB
1071 lines
26 KiB
/*++
|
|
|
|
Copyright (c) 1990-1995 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
tvctrl.c
|
|
|
|
|
|
Abstract:
|
|
|
|
This module contains all procedures to paint the treeview window
|
|
|
|
|
|
Author:
|
|
|
|
17-Oct-1995 Tue 16:06:50 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
[Environment:]
|
|
|
|
NT Windows - Common Printer Driver UI DLL
|
|
|
|
|
|
[Notes:]
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#define DBG_CPSUIFILENAME DbgTVCtrl
|
|
|
|
|
|
#define DBG_WM_PAINT 0x00000001
|
|
#define DBG_DRAWITEM_RECT 0x00000002
|
|
#define DBG_DRAWITEM_COLOR 0x00000004
|
|
#define DBG_SYS_COLOR 0x00000008
|
|
#define DBG_ORIGIN 0x00000010
|
|
#define DBG_COMMAND 0x00000020
|
|
#define DBG_EDIT_PROC 0x00000040
|
|
#define DBG_SCROLL 0x00000080
|
|
#define DBG_CYICON 0x00000100
|
|
#define DBG_WM_SETFONT 0x00000200
|
|
#define DBG_KEYS 0x00000400
|
|
#define DBG_CTRLCOLOR 0x00000800
|
|
|
|
|
|
DEFINE_DBGVAR(0);
|
|
|
|
|
|
extern HINSTANCE hInstDLL;
|
|
|
|
|
|
typedef struct _MYBMPINFO {
|
|
BITMAPINFOHEADER bh;
|
|
RGBQUAD clr[2];
|
|
} MYBMPINFO;
|
|
|
|
#define CY_LINES 9
|
|
|
|
static const BYTE HLineBits[CY_LINES * 4] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x55, 0x55, 0x55, 0x55
|
|
};
|
|
|
|
static const BYTE TLineBits[CY_LINES * 4] = {
|
|
|
|
0x00, 0x80, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x80, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x80, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x80, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x55, 0x55, 0x55, 0x55
|
|
};
|
|
|
|
static const BITMAPINFOHEADER bhLines = {
|
|
|
|
sizeof(BITMAPINFOHEADER),
|
|
CXIMAGE,
|
|
CY_LINES,
|
|
1,
|
|
1,
|
|
BI_RGB,
|
|
ALIGN_DW(CXIMAGE, 24) * CY_LINES,
|
|
0,
|
|
0,
|
|
2,
|
|
2
|
|
};
|
|
|
|
|
|
|
|
VOID
|
|
DeleteTVFonts(
|
|
PTVWND pTVWnd
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
11-Aug-1998 Tue 14:05:24 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HDC hDC;
|
|
HFONT hFont;
|
|
|
|
if ((hDC = pTVWnd->hDCTVWnd) &&
|
|
(hFont = pTVWnd->hTVFont[0])) {
|
|
|
|
SelectObject(hDC, (HANDLE)hFont);
|
|
|
|
if (hFont = pTVWnd->hTVFont[1]) {
|
|
|
|
DeleteObject(hFont);
|
|
pTVWnd->hTVFont[1] = NULL;
|
|
}
|
|
|
|
if (hFont = pTVWnd->hTVFont[2]) {
|
|
|
|
DeleteObject(hFont);
|
|
pTVWnd->hTVFont[2] = NULL;
|
|
}
|
|
|
|
if (hFont = pTVWnd->hTVFont[3]) {
|
|
|
|
DeleteObject(hFont);
|
|
pTVWnd->hTVFont[3] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CreateTVFonts(
|
|
PTVWND pTVWnd,
|
|
HFONT hFont
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
11-Aug-1998 Tue 14:04:04 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hWndTV;
|
|
HDC hDC;
|
|
|
|
|
|
if ((hWndTV = pTVWnd->hWndTV) &&
|
|
(hDC = pTVWnd->hDCTVWnd) &&
|
|
(hFont)) {
|
|
|
|
RECT rc;
|
|
SIZEL szlText;
|
|
WCHAR Buf[16];
|
|
LOGFONT lf;
|
|
TEXTMETRIC tm;
|
|
|
|
DeleteTVFonts(pTVWnd);
|
|
|
|
//
|
|
// hTVFont[0] = Regular current treeview font
|
|
//
|
|
|
|
pTVWnd->hTVFont[0] = hFont;
|
|
GetObject(hFont, sizeof(lf), &lf);
|
|
|
|
//
|
|
// hTVFont[1] = BOLD Font
|
|
//
|
|
|
|
lf.lfWeight = FW_BOLD;
|
|
|
|
if (!(pTVWnd->hTVFont[1] = CreateFontIndirect(&lf))) {
|
|
|
|
CPSUIERR(("CreateFontIndirect(hTVFont[1] BOLD) failed"));
|
|
|
|
pTVWnd->hTVFont[1] = hFont;
|
|
}
|
|
|
|
//
|
|
// hTVFont[2] = Underline font
|
|
//
|
|
|
|
GetObject(hFont, sizeof(lf), &lf);
|
|
|
|
lf.lfUnderline = 1;
|
|
|
|
if (!(pTVWnd->hTVFont[2] = CreateFontIndirect(&lf))) {
|
|
|
|
CPSUIERR(("CreateFontIndirect(hTVFont[2] UnderLine) failed"));
|
|
|
|
pTVWnd->hTVFont[2] = hFont;
|
|
}
|
|
|
|
//
|
|
// hTVFont[3] = Bold + Underline font
|
|
//
|
|
|
|
lf.lfWeight = FW_BOLD;
|
|
|
|
if (!(pTVWnd->hTVFont[3] = CreateFontIndirect(&lf))) {
|
|
|
|
CPSUIERR(("CreateFontIndirect(hTVFont[3]) failed"));
|
|
pTVWnd->hTVFont[3] = hFont;
|
|
}
|
|
|
|
SelectObject(hDC, (HANDLE)pTVWnd->hTVFont[0]);
|
|
|
|
Buf[0] = L' ';
|
|
|
|
GetTextExtentPoint(hDC, Buf, 1, &szlText);
|
|
|
|
pTVWnd->cxSpace = (WORD)szlText.cx;
|
|
pTVWnd->cxSelAdd = (WORD)((szlText.cx + 1) / 2);
|
|
|
|
szlText.cy = (LONG)wsprintf(Buf, L"-88888 ");
|
|
|
|
GetTextExtentPoint(hDC, Buf, szlText.cy, &szlText);
|
|
pTVWnd->cxMaxUDEdit = (WORD)szlText.cx;
|
|
|
|
GetTextMetrics(hDC, &tm);
|
|
|
|
pTVWnd->cxAveChar = (WORD)tm.tmAveCharWidth;
|
|
|
|
GetClientRect(hWndTV, &rc);
|
|
|
|
pTVWnd->cxExtAdd = (WORD)(tm.tmAveCharWidth + pTVWnd->cxSelAdd);
|
|
|
|
CPSUIDBG(DBG_WM_SETFONT, ("CreateTVFonts: 0=%p, 1=%p, 2=%p, 3=%p, Ave=%ld, Space=%ld",
|
|
pTVWnd->hTVFont[0], pTVWnd->hTVFont[1],
|
|
pTVWnd->hTVFont[2], pTVWnd->hTVFont[3],
|
|
pTVWnd->cxAveChar, pTVWnd->cxSpace));
|
|
|
|
return(TRUE);
|
|
|
|
} else {
|
|
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
UINT
|
|
DrawTVItems(
|
|
HDC hDC,
|
|
HWND hWndTV,
|
|
PTVWND pTVWnd,
|
|
PRECT prcUpdate
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
17-Oct-1995 Tue 14:54:47 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HFONT hTVFont;
|
|
HFONT hBoldFont;
|
|
HFONT hStdFont;
|
|
HFONT hChgFont;
|
|
HFONT hOldFont;
|
|
HTREEITEM hCurItem;
|
|
DWORD OldTextClr;
|
|
DWORD OldBkClr;
|
|
DWORD ClrFill;
|
|
RECT rcUpdate;
|
|
RECT rc;
|
|
TV_ITEM tvi;
|
|
POINTL ptlOff;
|
|
MYBMPINFO bi;
|
|
LONG yIconOff = -1;
|
|
UINT cUpdate = 0;
|
|
UINT cxIndent;
|
|
UINT OldTAMode;
|
|
UINT OldBkMode;
|
|
INT yLinesOff;
|
|
DWORD HLState;
|
|
BOOL HasFocus;
|
|
WCHAR Buf[MAX_RES_STR_CHARS * 2 + 10];
|
|
|
|
|
|
rcUpdate = *prcUpdate;
|
|
hTVFont = pTVWnd->hTVFont[0];
|
|
hBoldFont = pTVWnd->hTVFont[1];
|
|
hStdFont = pTVWnd->hTVFont[2];
|
|
hChgFont = pTVWnd->hTVFont[3];
|
|
hOldFont = SelectObject(hDC, hTVFont);
|
|
cxIndent = TreeView_GetIndent(hWndTV);
|
|
HasFocus = (BOOL)(GetFocus() == hWndTV);
|
|
hCurItem = (pTVWnd->pCurTVItem) ? _OI_HITEM(pTVWnd->pCurTVItem) : NULL;
|
|
OldTextClr = SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
|
|
OldBkClr = SetBkColor(hDC, RGB(0xFF, 0xFF, 0xFF));
|
|
OldBkMode = (UINT)SetBkMode(hDC, TRANSPARENT);
|
|
OldTAMode = (UINT)SetTextAlign(hDC, TA_UPDATECP);
|
|
tvi.mask = TVIF_CHILDREN |
|
|
TVIF_HANDLE |
|
|
TVIF_STATE |
|
|
TVIF_PARAM |
|
|
TVIF_IMAGE |
|
|
TVIF_SELECTEDIMAGE |
|
|
TVIF_TEXT;
|
|
tvi.hItem = TreeView_GetFirstVisible(hWndTV);
|
|
HLState = (DWORD)((TreeView_GetDropHilight(hWndTV)) ? TVIS_DROPHILITED :
|
|
TVIS_SELECTED);
|
|
|
|
bi.bh = bhLines;
|
|
ClrFill = GetSysColor(COLOR_WINDOW);
|
|
bi.clr[0].rgbRed = GetRValue(ClrFill);
|
|
bi.clr[0].rgbGreen = GetGValue(ClrFill);
|
|
bi.clr[0].rgbBlue = GetBValue(ClrFill);
|
|
ClrFill = GetSysColor(COLOR_3DSHADOW);
|
|
bi.clr[1].rgbRed = GetRValue(ClrFill);
|
|
bi.clr[1].rgbGreen = GetGValue(ClrFill);
|
|
bi.clr[1].rgbBlue = GetBValue(ClrFill);
|
|
|
|
while (tvi.hItem) {
|
|
|
|
tvi.pszText = Buf;
|
|
tvi.cchTextMax = sizeof(Buf);
|
|
|
|
if ((TreeView_GetItemRect(hWndTV, tvi.hItem, &rc, TRUE)) &&
|
|
(rc.left < rcUpdate.right) &&
|
|
(rc.right > rcUpdate.left) &&
|
|
(rc.top < rcUpdate.bottom) &&
|
|
(rc.bottom > rcUpdate.top) &&
|
|
(TreeView_GetItem(hWndTV, &tvi))) {
|
|
|
|
TVLP tvlp;
|
|
UINT cBuf;
|
|
UINT cName;
|
|
RECT rcFill;
|
|
DWORD ClrBk;
|
|
DWORD ClrName;
|
|
SIZEL szlText;
|
|
INT xIcon;
|
|
INT yIcon;
|
|
|
|
|
|
rcFill = rc;
|
|
rcFill.left = rc.right;
|
|
|
|
//
|
|
// Draw the Text
|
|
//
|
|
|
|
tvlp = GET_TVLP(tvi.lParam);
|
|
cBuf = (UINT)lstrlen(Buf);
|
|
cName = (UINT)tvlp.cName;
|
|
|
|
SelectObject(hDC, (tvi.state & TVIS_BOLD) ? hBoldFont : hTVFont);
|
|
GetTextExtentPoint(hDC, Buf, cBuf, &szlText);
|
|
|
|
if (yIconOff == -1) {
|
|
|
|
yIconOff = rc.bottom - rc.top;
|
|
//
|
|
// Currently the common control group is drawing the text left aligned, starting at
|
|
// rc.left + GetSystemMetrics(SM_CXEDGE). So we are following the methods
|
|
// in common control to draw the text. Though "guessing" their implementation is
|
|
// not the best way to do, it's the only solution we can take. Otherwise, we need
|
|
// to implement all the drawing work for the treeview text, which could be even
|
|
// worse.
|
|
//
|
|
ptlOff.x = GetSystemMetrics(SM_CXEDGE);
|
|
ptlOff.y = (yIconOff - szlText.cy) / 2;
|
|
yIconOff = (yIconOff - (LONG)pTVWnd->cyImage) / 2;
|
|
yLinesOff = (INT)((pTVWnd->cyImage / 2) + pTVWnd->yLinesOff);
|
|
|
|
CPSUIDBG(DBG_CYICON, ("cy=%ld, cyImage=%ld, yIconOff=%ld, yLinesOff=%ld, Indent=%ld",
|
|
rc.bottom - rc.top, pTVWnd->cyImage, yIconOff,
|
|
yLinesOff, cxIndent));
|
|
}
|
|
|
|
xIcon = (INT)(rc.left - cxIndent);
|
|
yIcon = (INT)(rc.top + yIconOff);
|
|
rc.left += ptlOff.x;
|
|
rc.top += ptlOff.y;
|
|
|
|
CPSUIDBG(DBG_DRAWITEM_RECT,
|
|
("tvlp=[%04lx] (%ld, %ld)-(%ld, %ld)=%ldx%ld (%ld/%ld) <%ws>",
|
|
tvlp.Flags, rc.left, rc.top, rc.right, rc.bottom,
|
|
rc.right - rc.left, rc.bottom - rc.top,
|
|
cName, cBuf, Buf));
|
|
|
|
if (tvi.state & HLState) {
|
|
|
|
//
|
|
// Current item is selected
|
|
//
|
|
|
|
if (HasFocus) {
|
|
|
|
ClrBk = COLOR_HIGHLIGHT;
|
|
ClrName = (tvlp.Flags & TVLPF_DISABLED) ?
|
|
COLOR_3DFACE : COLOR_HIGHLIGHTTEXT;
|
|
|
|
} else {
|
|
|
|
//
|
|
// The COLOR_3DFACE is a text background
|
|
//
|
|
|
|
ClrBk = COLOR_3DFACE;
|
|
ClrName = (tvlp.Flags & TVLPF_DISABLED) ? COLOR_3DSHADOW :
|
|
COLOR_BTNTEXT;
|
|
}
|
|
|
|
} else {
|
|
|
|
//
|
|
// The item is not currently selected
|
|
//
|
|
|
|
ClrBk = COLOR_WINDOW;
|
|
ClrName = (tvlp.Flags & TVLPF_DISABLED) ? COLOR_3DSHADOW :
|
|
COLOR_WINDOWTEXT;
|
|
}
|
|
|
|
ClrFill = ClrBk + 1;
|
|
ClrBk = GetSysColor((UINT)ClrBk);
|
|
ClrName = GetSysColor((UINT)ClrName);
|
|
|
|
CPSUIDBG(DBG_SYS_COLOR,
|
|
("ClrBk=(%3d,%3d,%3d), ClrName=(%3d,%3d,%3d), State=%08lx/%08lx, Focus=%ld, %ws",
|
|
GetRValue(ClrBk), GetGValue(ClrBk), GetBValue(ClrBk),
|
|
GetRValue(ClrName), GetGValue(ClrName), GetBValue(ClrName),
|
|
tvi.state, HLState, (HasFocus) ? 1 : 0, Buf));
|
|
|
|
CPSUIDBG(DBG_DRAWITEM_COLOR,
|
|
("COLOR: Item=(%3d,%3d,%3d)",
|
|
GetRValue(ClrName), GetGValue(ClrName), GetBValue(ClrName)));
|
|
|
|
if (cBuf > cName) {
|
|
|
|
GetTextExtentPoint(hDC, Buf, cName, &szlText);
|
|
MoveToEx(hDC, rc.left += szlText.cx, rc.top, NULL);
|
|
SelectObject(hDC, (tvlp.Flags & TVLPF_CHANGEONCE) ? hChgFont :
|
|
hStdFont);
|
|
GetTextExtentPoint(hDC, &Buf[cName], cBuf - cName, &szlText);
|
|
|
|
if ((rcFill.right = rc.left + szlText.cx) > rcFill.left) {
|
|
|
|
FillRect(hDC, &rcFill, (HBRUSH)LongToHandle(ClrFill));
|
|
}
|
|
|
|
SetTextColor(hDC, ClrName);
|
|
SetBkColor(hDC, ClrBk);
|
|
SetBkMode(hDC, OPAQUE);
|
|
TextOut(hDC, rc.left, rc.top, &Buf[cName], cBuf - cName);
|
|
}
|
|
#if DO_IN_PLACE
|
|
if (tvlp.Flags & TVLPF_EMPTYICON) {
|
|
#if DBG
|
|
Buf[cName] = L'\0';
|
|
CPSUIDBG(DBG_CYICON, ("%40ws Lines='%hs'",
|
|
Buf, ((tvi.cChildren) &&
|
|
(tvi.state & TVIS_EXPANDED)) ? "T" : "-"));
|
|
#endif
|
|
SetDIBitsToDevice(hDC,
|
|
xIcon,
|
|
yIcon + yLinesOff,
|
|
CXIMAGE,
|
|
CY_LINES,
|
|
0,
|
|
0,
|
|
0,
|
|
CY_LINES,
|
|
((tvi.cChildren) &&
|
|
(tvi.state & TVIS_EXPANDED)) ? TLineBits :
|
|
HLineBits,
|
|
(BITMAPINFO *)&bi,
|
|
DIB_RGB_COLORS);
|
|
}
|
|
#endif
|
|
if (tvlp.Flags & TVLPF_ECBICON) {
|
|
|
|
POPTITEM pItem;
|
|
PEXTCHKBOX pECB;
|
|
|
|
pItem = GetOptions(pTVWnd, tvi.lParam);
|
|
pECB = pItem->pExtChkBox;
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd,
|
|
_OI_HINST(pItem),
|
|
GET_ICONID(pECB,
|
|
ECBF_ICONID_AS_HICON),
|
|
IDI_CPSUI_EMPTY),
|
|
hDC,
|
|
xIcon,
|
|
yIcon,
|
|
ILD_TRANSPARENT);
|
|
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_STOP) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd, NULL, 0, IDI_CPSUI_STOP),
|
|
hDC,
|
|
xIcon,
|
|
yIcon,
|
|
ILD_TRANSPARENT);
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_NO) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd, NULL, 0, IDI_CPSUI_NO),
|
|
hDC,
|
|
xIcon,
|
|
yIcon,
|
|
ILD_TRANSPARENT);
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_WARNING) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd,
|
|
NULL,
|
|
0,
|
|
IDI_CPSUI_WARNING_OVERLAY),
|
|
hDC,
|
|
xIcon + X_WARNOVLY_ADD,
|
|
yIcon + Y_WARNOVLY_ADD,
|
|
ILD_TRANSPARENT);
|
|
}
|
|
|
|
++cUpdate;
|
|
}
|
|
|
|
tvi.hItem = TreeView_GetNextVisible(hWndTV, tvi.hItem);
|
|
}
|
|
|
|
SelectObject(hDC, hOldFont);
|
|
SetTextColor(hDC, OldTextClr);
|
|
SetBkColor(hDC, OldBkClr);
|
|
SetBkMode(hDC, OldBkMode);
|
|
SetTextAlign(hDC, OldTAMode);
|
|
|
|
return(cUpdate);
|
|
}
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
LRESULT
|
|
CALLBACK
|
|
FocusCtrlProc(
|
|
HWND hWnd,
|
|
UINT Msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
12-Feb-1998 Thu 13:08:24 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
PTVWND pTVWnd;
|
|
HWND hDlg;
|
|
HWND hWndTV;
|
|
HWND hFocus;
|
|
UINT chWndEdit;
|
|
HWND hWndEdit[2];
|
|
BOOL PrevCtrl;
|
|
WNDPROC WndProc;
|
|
|
|
|
|
if (WndProc = (WNDPROC)GetProp(hWnd, CPSUIPROP_WNDPROC)) {
|
|
|
|
switch (Msg) {
|
|
|
|
case WM_SETFOCUS:
|
|
|
|
if (!wParam) {
|
|
|
|
wParam = (WPARAM)GetFocus();
|
|
}
|
|
|
|
CPSUIDBG(DBG_EDIT_PROC,
|
|
("%ws WM_SETFOCUS, Old=%08lx (%ld)",
|
|
(GetWindowLongPtr(hWnd, GWLP_ID) == IDD_PRE_EDIT) ?
|
|
L"PREV" : L"NEXT",
|
|
wParam, GetWindowLongPtr((HWND)wParam, GWLP_ID)));
|
|
|
|
if ((wParam) &&
|
|
(hDlg = GetParent(hWnd)) &&
|
|
(pTVWnd = GET_PTVWND(hDlg)) &&
|
|
(chWndEdit = (UINT)pTVWnd->chWndEdit) &&
|
|
(hWndTV = pTVWnd->hWndTV)) {
|
|
|
|
if (hWndEdit[0] = pTVWnd->hWndEdit[0]) {
|
|
|
|
if ((!IsWindowVisible(hWndEdit[0])) ||
|
|
(!IsWindowEnabled(hWndEdit[0]))) {
|
|
|
|
hWndEdit[0] = NULL;
|
|
}
|
|
}
|
|
|
|
if (hWndEdit[1] = pTVWnd->hWndEdit[1]) {
|
|
|
|
if ((!IsWindowVisible(hWndEdit[1])) ||
|
|
(!IsWindowEnabled(hWndEdit[1]))) {
|
|
|
|
hWndEdit[1] = NULL;
|
|
}
|
|
}
|
|
|
|
if (PrevCtrl = (BOOL)(GetWindowLongPtr(hWnd, GWLP_ID) ==
|
|
IDD_PRE_EDIT)) {
|
|
|
|
if ((HWND)wParam == hWndTV) {
|
|
|
|
hFocus = NULL;
|
|
|
|
} else if ((HWND)wParam == hWndEdit[1]) {
|
|
|
|
hFocus = hWndEdit[0];
|
|
|
|
} else {
|
|
|
|
hFocus = hWndTV;
|
|
}
|
|
|
|
} else {
|
|
|
|
if ((HWND)wParam == hWndTV) {
|
|
|
|
hFocus = hWndEdit[0];
|
|
|
|
} else if ((HWND)wParam == hWndEdit[0]) {
|
|
|
|
hFocus = hWndEdit[1];
|
|
|
|
} else if ((HWND)wParam == hWndEdit[1]) {
|
|
|
|
hFocus = NULL;
|
|
|
|
} else if (!(hFocus = hWndEdit[1])) {
|
|
|
|
if (!(hFocus = hWndEdit[0])) {
|
|
|
|
hFocus = hWndTV;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hFocus) {
|
|
|
|
SetFocus(hFocus);
|
|
|
|
} else {
|
|
|
|
if (!(pTVWnd->Flags & TWF_TV_BY_PUSH)) {
|
|
|
|
hDlg = GetParent(hDlg);
|
|
}
|
|
|
|
PostMessage(hDlg, WM_NEXTDLGCTL, PrevCtrl, 0);
|
|
}
|
|
|
|
CPSUIDBG(DBG_EDIT_PROC,
|
|
(" %ws WM_SETFOCUS, Old=%08lx (%ld), hWndTV=%08lx, Set to %08lx (%ld)",
|
|
(PrevCtrl) ? L"PREV" : L"NEXT",
|
|
wParam, GetWindowLongPtr((HWND)wParam, GWLP_ID),
|
|
hWndTV, hFocus, GetWindowLongPtr(hFocus, GWLP_ID)));
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
|
|
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LPARAM)WndProc);
|
|
RemoveProp(hWnd, CPSUIPROP_WNDPROC);
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
return(CallWindowProc(WndProc, hWnd, Msg, wParam, lParam));
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
LRESULT
|
|
CALLBACK
|
|
MyTVWndProc(
|
|
HWND hWnd,
|
|
UINT Msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
17-Oct-1995 Tue 12:36:19 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hDlg;
|
|
HWND *phWndEdit;
|
|
HWND hWndEdit;
|
|
UINT chWndEdit;
|
|
HDWP hDWP;
|
|
PTVWND pTVWnd;
|
|
WNDPROC TVWndProc;
|
|
DWORD ClrBk;
|
|
DWORD ClrText;
|
|
|
|
|
|
if ((hDlg = GetParent(hWnd)) &&
|
|
(pTVWnd = GET_PTVWND(hDlg)) &&
|
|
(TVWndProc = pTVWnd->TVWndProc)) {
|
|
|
|
HDC hDC;
|
|
LRESULT lResult;
|
|
RECT rcUpdate;
|
|
|
|
switch (Msg) {
|
|
|
|
#if DO_IN_PLACE
|
|
case WM_VSCROLL:
|
|
case WM_HSCROLL:
|
|
|
|
CPSUIDBG(DBG_SCROLL, ("MyTVWndProc: WM_%cSCROLL, hScroll=%08lx (%08lx:%08lx:%08lx)=%ld, Pos=%ld, Code=%ld",
|
|
(Msg == WM_VSCROLL) ? 'V' : 'H',
|
|
lParam, pTVWnd->hWndEdit[0],
|
|
pTVWnd->hWndEdit[1], pTVWnd->hWndEdit[2],
|
|
pTVWnd->chWndEdit, HIWORD(wParam), LOWORD(wParam)));
|
|
|
|
chWndEdit = pTVWnd->chWndEdit;
|
|
phWndEdit = pTVWnd->hWndEdit;
|
|
|
|
if (lParam) {
|
|
|
|
while (chWndEdit--) {
|
|
|
|
if ((HWND)lParam == *phWndEdit++) {
|
|
|
|
PostMessage(hDlg, WM_COMMAND, wParam, lParam);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
break;
|
|
#endif
|
|
case WM_COMMAND:
|
|
|
|
CPSUIDBG(DBG_COMMAND, ("MyTVWndProc: WM_COMMAND"));
|
|
|
|
PostMessage(hDlg, WM_COMMAND, wParam, lParam);
|
|
|
|
return(FALSE);
|
|
|
|
break;
|
|
|
|
case WM_CTLCOLORBTN:
|
|
case WM_CTLCOLORSTATIC:
|
|
|
|
switch (GetWindowLongPtr((HWND)lParam, GWLP_ID)) {
|
|
|
|
case IDD_TV_CHKBOX:
|
|
case IDD_TV_EXTCHKBOX:
|
|
|
|
if (GetFocus() == (HWND)lParam) {
|
|
|
|
CPSUIDBG(DBG_CTRLCOLOR, ("Get WM_CTLCOLOR, HAS FOCUS"));
|
|
|
|
ClrText = (DWORD)COLOR_HIGHLIGHTTEXT;
|
|
ClrBk = (DWORD)COLOR_HIGHLIGHT;
|
|
|
|
} else {
|
|
|
|
CPSUIDBG(DBG_CTRLCOLOR, ("Get WM_CTLCOLOR, NO FOCUS"));
|
|
|
|
ClrText = COLOR_WINDOWTEXT;
|
|
ClrBk = COLOR_WINDOW;
|
|
}
|
|
|
|
SetTextColor((HDC)wParam, GetSysColor(ClrText));
|
|
SetBkMode((HDC)wParam, TRANSPARENT);
|
|
return((LRESULT)GetSysColorBrush(ClrBk));
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_HELP:
|
|
case WM_CONTEXTMENU:
|
|
|
|
PostMessage(hDlg, Msg, wParam, lParam);
|
|
|
|
break;
|
|
|
|
case WM_SETFONT:
|
|
|
|
CPSUIDBG(DBG_WM_SETFONT, ("MyTVWndProc: WM_SETFONT, IGNORE"));
|
|
return(TRUE);
|
|
|
|
break;
|
|
|
|
case WM_KEYDOWN:
|
|
|
|
switch (wParam) {
|
|
|
|
case VK_RIGHT:
|
|
|
|
if ((pTVWnd->chWndEdit) &&
|
|
(pTVWnd->hWndEdit[0])) {
|
|
|
|
SetFocus(pTVWnd->hWndEdit[0]);
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
case WM_KEYUP:
|
|
|
|
CPSUIDBG(DBG_KEYS, ("MyTVWndProc: WM_KEY%hs: VK=%ld",
|
|
(Msg == WM_KEYUP) ? "UP" : "DOWN", wParam));
|
|
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
#if DO_IN_PLACE
|
|
if ((pTVWnd->pCurTVItem) &&
|
|
(chWndEdit = (UINT)pTVWnd->chWndEdit) &&
|
|
(TreeView_GetItemRect(hWnd,
|
|
_OI_HITEM(pTVWnd->pCurTVItem),
|
|
&rcUpdate,
|
|
TRUE)) &&
|
|
((rcUpdate.left != pTVWnd->ptCur.x) ||
|
|
(rcUpdate.top != pTVWnd->ptCur.y)) &&
|
|
(hDWP = BeginDeferWindowPos(chWndEdit))) {
|
|
|
|
POINTL pt;
|
|
|
|
phWndEdit = pTVWnd->hWndEdit;
|
|
|
|
CPSUIDBG(DBG_ORIGIN, ("CurTVItem=Moved (%08lx:%08lx:%08lx)From (%4ld, %4ld) ---> (%4ld, %4ld)",
|
|
pTVWnd->hWndEdit[0],
|
|
pTVWnd->hWndEdit[1], pTVWnd->hWndEdit[2],
|
|
pTVWnd->ptCur.x, pTVWnd->ptCur.y,
|
|
rcUpdate.left, rcUpdate.top));
|
|
|
|
pt.x = rcUpdate.left - pTVWnd->ptCur.x;
|
|
pt.y = rcUpdate.top - pTVWnd->ptCur.y;
|
|
pTVWnd->ptCur.x = rcUpdate.left;
|
|
pTVWnd->ptCur.y = rcUpdate.top;
|
|
|
|
while ((chWndEdit--) && (hDWP)) {
|
|
|
|
if (hWndEdit = *phWndEdit++) {
|
|
|
|
GetWindowRect(hWndEdit, &rcUpdate);
|
|
|
|
rcUpdate.left += pt.x;
|
|
rcUpdate.top += pt.y;
|
|
rcUpdate.right += pt.x;
|
|
rcUpdate.bottom += pt.y;
|
|
|
|
MapWindowPoints(NULL, hWnd, (LPPOINT)&rcUpdate, 2);
|
|
|
|
hDWP = DeferWindowPos(hDWP, hWndEdit, NULL,
|
|
rcUpdate.left, rcUpdate.top, 0, 0,
|
|
SWP_DRAWFRAME |
|
|
SWP_FRAMECHANGED |
|
|
SWP_NOSIZE |
|
|
SWP_NOZORDER);
|
|
}
|
|
}
|
|
|
|
if (hDWP) {
|
|
|
|
EndDeferWindowPos(hDWP);
|
|
}
|
|
}
|
|
#endif
|
|
GetUpdateRect(hWnd, &rcUpdate, FALSE);
|
|
|
|
lResult = CallWindowProc(TVWndProc, hWnd, Msg, wParam, lParam);
|
|
|
|
CPSUIDBG(DBG_WM_PAINT,
|
|
("\n!! Update Rect = (%ld, %ld)-(%ld, %ld) = %ld x %ld\n\n",
|
|
rcUpdate.left, rcUpdate.top,
|
|
rcUpdate.right, rcUpdate.bottom,
|
|
rcUpdate.right - rcUpdate.left,
|
|
rcUpdate.bottom - rcUpdate.top));
|
|
|
|
if (hDC = GetDC(hWnd)) {
|
|
|
|
IntersectClipRect(hDC,
|
|
rcUpdate.left,
|
|
rcUpdate.top,
|
|
rcUpdate.right,
|
|
rcUpdate.bottom);
|
|
|
|
DrawTVItems(hDC, hWnd, pTVWnd, &rcUpdate);
|
|
ReleaseDC(hWnd, hDC);
|
|
|
|
} else {
|
|
|
|
CPSUIERR(("MyTVWndProc: GetDC(%08lx) FAILED", hWnd));
|
|
}
|
|
|
|
return(lResult);
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
return(CallWindowProc(TVWndProc, hWnd, Msg, wParam, lParam));
|
|
|
|
} else {
|
|
|
|
CPSUIERR(("MyTVWndProc: hDlg=%08lx, pTVWnd=%08lx, TVWndProc=%08lx",
|
|
hDlg, pTVWnd, TVWndProc));
|
|
|
|
return(TRUE);
|
|
}
|
|
}
|