mirror of https://github.com/lianthony/NT4.0
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.
523 lines
12 KiB
523 lines
12 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_DBGVAR(0);
|
|
|
|
|
|
|
|
HFONT
|
|
CreateBoldFont(
|
|
HFONT hFont
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
17-Oct-1995 Tue 16:35:07 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HFONT hFontBold = NULL;
|
|
|
|
|
|
if (hFont) {
|
|
|
|
LOGFONT lf;
|
|
|
|
GetObject(hFont, sizeof(lf), &lf);
|
|
|
|
lf.lfWeight = FW_BOLD;
|
|
|
|
if (!(hFontBold = CreateFontIndirect(&lf))) {
|
|
|
|
CPSUIERR(("CreateFontIndirect(hFont BOLD) failed"));
|
|
}
|
|
}
|
|
|
|
return(hFontBold);
|
|
}
|
|
|
|
|
|
|
|
|
|
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 hFont;
|
|
HFONT hOldFont;
|
|
HFONT hBoldFont;
|
|
HFONT hCurFont;
|
|
HFONT hLastFont;
|
|
DWORD OldTextClr;
|
|
DWORD OldBkClr;
|
|
RECT rcUpdate;
|
|
RECT rc;
|
|
TV_ITEM tvi;
|
|
POINTL ptlOff;
|
|
LONG yIconOff = -1;
|
|
UINT cUpdate = 0;
|
|
UINT cxIndent;
|
|
UINT cyItem;
|
|
UINT OldTAMode;
|
|
UINT OldBkMode;
|
|
DWORD HLState;
|
|
BOOL HasFocus;
|
|
WCHAR Buf[MAX_RES_STR_CHARS * 2 + 10];
|
|
|
|
|
|
rcUpdate = *prcUpdate;
|
|
hFont = (HFONT)SendMessage(hWndTV, WM_GETFONT, 0, 0L);
|
|
hOldFont = SelectObject(hDC, hLastFont = hFont);
|
|
cxIndent = TreeView_GetIndent(hWndTV);
|
|
HasFocus = (BOOL)(GetFocus() == hWndTV);
|
|
|
|
if (!(hBoldFont = pTVWnd->hBoldFont)) {
|
|
|
|
if (hBoldFont = CreateBoldFont(hFont)) {
|
|
|
|
pTVWnd->hBoldFont = hBoldFont;
|
|
|
|
} else {
|
|
|
|
hBoldFont = hFont;
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
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;
|
|
DWORD ClrBk;
|
|
DWORD ClrOpt;
|
|
DWORD ClrName;
|
|
SIZEL szlText;
|
|
BOOL HighLight;
|
|
BOOL DarkBk;
|
|
INT x;
|
|
INT y;
|
|
|
|
|
|
//
|
|
// Check if DROP highlight or selected item
|
|
//
|
|
|
|
HighLight = (BOOL)(tvi.state & HLState);
|
|
|
|
//
|
|
// Draw the Text
|
|
//
|
|
|
|
hCurFont = (tvi.state & TVIS_BOLD) ? hBoldFont : hFont;
|
|
|
|
if (hCurFont != hLastFont) {
|
|
|
|
SelectObject(hDC, hLastFont = hCurFont);
|
|
}
|
|
|
|
tvlp = GET_TVLP(tvi.lParam);
|
|
cBuf = (UINT)lstrlen(Buf);
|
|
cName = (UINT)tvlp.cName;
|
|
|
|
GetTextExtentPoint(hDC, Buf, cBuf, &szlText);
|
|
|
|
if (yIconOff == -1) {
|
|
|
|
cyItem = (UINT)(rc.bottom - rc.top);
|
|
ptlOff.x = (rc.right - rc.left - szlText.cx) / 2;
|
|
ptlOff.y = (cyItem - szlText.cy) / 2;
|
|
yIconOff = (cyItem - CYIMAGE) / 2;
|
|
}
|
|
|
|
CPSUIDBG(DBG_DRAWITEM_RECT,
|
|
("Item=[%08lx] (%ld, %ld)-(%ld, %ld) = %ld x %ld <%ws>",
|
|
tvi.state, rc.left, rc.top, rc.right, rc.bottom,
|
|
rc.right - rc.left, rc.bottom - rc.top, Buf));
|
|
|
|
if (HighLight) {
|
|
|
|
//
|
|
// 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;
|
|
}
|
|
|
|
ClrBk = GetSysColor((UINT)ClrBk);
|
|
ClrName = GetSysColor((UINT)ClrName);
|
|
DarkBk = (BOOL)(((GetRValue(ClrBk) * 23) +
|
|
(GetGValue(ClrBk) * 67) +
|
|
(GetBValue(ClrBk) * 10)) < (255L * 50L));
|
|
|
|
if (tvlp.Flags & TVLPF_CHANGEONCE) {
|
|
|
|
if (tvlp.Flags & TVLPF_DISABLED) {
|
|
|
|
ClrOpt = (DarkBk) ? RGB(255, 255, 0) : RGB(128, 0, 0);
|
|
|
|
} else {
|
|
|
|
ClrOpt = (DarkBk) ? RGB(255, 0, 255) : RGB(255, 0, 0);
|
|
}
|
|
|
|
} else {
|
|
|
|
if (tvlp.Flags & TVLPF_DISABLED) {
|
|
|
|
ClrOpt = (DarkBk) ? RGB(192, 192, 192) : RGB(0, 0, 128);
|
|
|
|
} else {
|
|
|
|
ClrOpt = (DarkBk) ? RGB(0, 255, 255) : RGB(0, 0, 255);
|
|
}
|
|
}
|
|
|
|
CPSUIDBG(DBG_SYS_COLOR,
|
|
("\nClrBk=(%3d,%3d,%3d), ClrName=(%3d,%3d,%3d), ClrOpt=(%3d,%3d,%3d), ",
|
|
GetRValue(ClrBk), GetGValue(ClrBk), GetBValue(ClrBk),
|
|
GetRValue(ClrName), GetGValue(ClrName), GetBValue(ClrName),
|
|
GetRValue(ClrOpt), GetGValue(ClrOpt), GetBValue(ClrOpt)));
|
|
|
|
CPSUIDBG(DBG_DRAWITEM_COLOR,
|
|
("COLOR: Item=(%3d,%3d,%3d), Option=(%3d,%3d,%3d)",
|
|
GetRValue(ClrName), GetGValue(ClrName), GetBValue(ClrName),
|
|
GetRValue(ClrOpt), GetGValue(ClrOpt), GetBValue(ClrOpt)));
|
|
|
|
MoveToEx(hDC, rc.left + ptlOff.x, rc.top + ptlOff.y, NULL);
|
|
SetTextColor(hDC, ClrName);
|
|
TextOut(hDC, 0, 0, Buf, cName);
|
|
|
|
if (cBuf > cName) {
|
|
|
|
if (tvlp.Flags & TVLPF_HAS_ANGLE) {
|
|
|
|
--cBuf;
|
|
}
|
|
|
|
if (ClrOpt == ClrBk) {
|
|
|
|
ClrOpt = (DWORD)-1;
|
|
SetBkMode(hDC, OPAQUE);
|
|
}
|
|
|
|
SetTextColor(hDC, ClrOpt);
|
|
TextOut(hDC, 0, 0, &Buf[cName], cBuf - cName);
|
|
|
|
if (ClrOpt == (DWORD)-1) {
|
|
|
|
SetBkMode(hDC, TRANSPARENT);
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_HAS_ANGLE) {
|
|
|
|
SetTextColor(hDC, ClrName);
|
|
TextOut(hDC, 0, 0, &Buf[cBuf], 1);
|
|
}
|
|
}
|
|
|
|
x = (INT)(rc.left - cxIndent);
|
|
y = (INT)(rc.top + yIconOff);
|
|
|
|
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,
|
|
x,
|
|
y,
|
|
ILD_TRANSPARENT);
|
|
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_STOP) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd, NULL, 0, IDI_CPSUI_STOP),
|
|
hDC,
|
|
x,
|
|
y,
|
|
ILD_TRANSPARENT);
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_NO) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd, NULL, 0, IDI_CPSUI_NO),
|
|
hDC,
|
|
x,
|
|
y,
|
|
ILD_TRANSPARENT);
|
|
}
|
|
|
|
if (tvlp.Flags & TVLPF_WARNING) {
|
|
|
|
ImageList_Draw(pTVWnd->himi,
|
|
GetIcon16Idx(pTVWnd,
|
|
NULL,
|
|
0,
|
|
IDI_CPSUI_WARNING_OVERLAY),
|
|
hDC,
|
|
x,
|
|
y,
|
|
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);
|
|
}
|
|
|
|
|
|
|
|
LRESULT
|
|
CALLBACK
|
|
MyTVWndProc(
|
|
HWND hWnd,
|
|
UINT Msg,
|
|
UINT wParam,
|
|
LONG lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
Return Value:
|
|
|
|
|
|
|
|
|
|
Author:
|
|
|
|
17-Oct-1995 Tue 12:36:19 created -by- Daniel Chou (danielc)
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hDlg;
|
|
HDC hDC;
|
|
PTVWND pTVWnd;
|
|
LRESULT lResult;
|
|
RECT rcUpdate;
|
|
|
|
|
|
hDlg = GetParent(hWnd);
|
|
pTVWnd = GET_PTVWND(hDlg);
|
|
|
|
CPSUIASSERT(0, "HWNDTV2PTVWND: Invalid hWndTV's (%08lx) Parent",
|
|
(pTVWnd->hDlgTV == hDlg) && (pTVWnd->hWndTV == hWnd), hWnd);
|
|
|
|
|
|
switch (Msg) {
|
|
|
|
case WM_PAINT:
|
|
|
|
GetUpdateRect(hWnd, &rcUpdate, FALSE);
|
|
lResult = CallWindowProc(pTVWnd->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));
|
|
|
|
IntersectClipRect(hDC = GetDC(hWnd),
|
|
rcUpdate.left,
|
|
rcUpdate.top,
|
|
rcUpdate.right,
|
|
rcUpdate.bottom);
|
|
|
|
DrawTVItems(hDC, hWnd, pTVWnd, &rcUpdate);
|
|
ReleaseDC(hWnd, hDC);
|
|
|
|
|
|
return(lResult);
|
|
|
|
default:
|
|
|
|
lResult = CallWindowProc(pTVWnd->TVWndProc, hWnd, Msg, wParam, lParam);
|
|
}
|
|
|
|
return(lResult);
|
|
|
|
}
|