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.
214 lines
6.4 KiB
214 lines
6.4 KiB
/***************************************************************************
|
|
*
|
|
* File Name: listbox.c
|
|
*
|
|
* Copyright (C) 1993, 1994 Hewlett-Packard Company.
|
|
* All rights reserved.
|
|
*
|
|
* 11311 Chinden Blvd.
|
|
* Boise, Idaho 83714
|
|
*
|
|
* This is a part of the HP JetAdmin Printer Utility
|
|
*
|
|
* This source code is only intended as a supplement for support and
|
|
* localization of HP JetAdmin by 3rd party Operating System vendors.
|
|
* Modification of source code cannot be made without the express written
|
|
* consent of Hewlett-Packard.
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
* Author: Name
|
|
*
|
|
*
|
|
* Modification history:
|
|
*
|
|
* date initials change description
|
|
*
|
|
* mm-dd-yy CRW
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include <pch_c.h>
|
|
|
|
#ifndef WIN32
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#include "listbox.h"
|
|
|
|
extern HINSTANCE hInstance;
|
|
extern HFONT hFont; // garth 05-03-96
|
|
|
|
int Cls_OnCompareItem(HWND hwnd, const COMPAREITEMSTRUCT FAR* lpCompareItem)
|
|
// handles WM_COMPAREITEM
|
|
{
|
|
TCHAR buff1[128],
|
|
buff2[128];
|
|
|
|
ListBox_GetText(hwnd, lpCompareItem->itemID1, buff1);
|
|
ListBox_GetText(hwnd, lpCompareItem->itemID2, buff2);
|
|
return(_tcscmp(buff1, buff2));
|
|
}
|
|
|
|
|
|
//...................................................................
|
|
void Cls_OnLBDrawItem(HWND hwnd, const DRAWITEMSTRUCT FAR* lpDrawItem)
|
|
// handles WM_DRAWITEM
|
|
{
|
|
DrawIconEntry(hwnd, lpDrawItem);
|
|
}
|
|
|
|
|
|
//...................................................................
|
|
void Cls_OnLBMeasureItem(HWND hwnd, MEASUREITEMSTRUCT FAR* lpMeasureItem)
|
|
//Handles WM_MEASUREITEM
|
|
{
|
|
lpMeasureItem->itemHeight = 44;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
//...................................................................
|
|
void DrawIconEntry(HWND hwnd, const DRAWITEMSTRUCT FAR* lpdis)
|
|
{
|
|
UINT resID,
|
|
textX,
|
|
textY;
|
|
HICON hIcon;
|
|
TCHAR buffer[128],
|
|
tempBuffer[128],
|
|
*charPtr;
|
|
DWORD buffSize = sizeof(buffer);
|
|
TEXTMETRIC tm;
|
|
RECT r;
|
|
SIZE size;
|
|
|
|
BOOL bTooLong,
|
|
bDrawText;
|
|
HPEN hOldPen,
|
|
hiPen,
|
|
shPen;
|
|
HBRUSH hOldBrush,
|
|
br;
|
|
RECT clipRect;
|
|
|
|
bDrawText = FALSE;
|
|
if (lpdis->itemAction & ODA_DRAWENTIRE)
|
|
{
|
|
br = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
|
|
hiPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
shPen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
|
|
|
|
bDrawText = TRUE;
|
|
CopyRect(&r, &lpdis->rcItem);
|
|
r.left = 3;
|
|
r.right = r.left + 5 + 32 + 3;
|
|
r.top += ( r.bottom - r.top - 36 ) / 2 - 2;
|
|
r.bottom = r.top + 36 + 4;
|
|
hOldPen = SelectObject(lpdis->hDC, GetStockObject(BLACK_PEN));
|
|
hOldBrush = SelectObject(lpdis->hDC, br);
|
|
Rectangle(lpdis->hDC, r.left, r.top, r.right, r.bottom);
|
|
SelectObject(lpdis->hDC, hiPen);
|
|
MoveToEx(lpdis->hDC, r.left + 1, r.bottom - 3, NULL);
|
|
LineTo(lpdis->hDC, r.left + 1, r.top + 1);
|
|
LineTo(lpdis->hDC, r.right - 2, r.top + 1);
|
|
SelectObject(lpdis->hDC, shPen);
|
|
MoveToEx(lpdis->hDC, r.right - 2, r.top + 1, NULL);
|
|
LineTo(lpdis->hDC, r.right - 2, r.bottom - 2);
|
|
LineTo(lpdis->hDC, r.left, r.bottom - 2);
|
|
|
|
resID = (UINT)ListBox_GetItemData(hwnd, lpdis->itemID);
|
|
hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(resID));
|
|
DrawIcon(lpdis->hDC, 7, ( lpdis->rcItem.bottom - lpdis->rcItem.top - 32 ) / 2 + lpdis->rcItem.top, hIcon);
|
|
SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));
|
|
SetTextColor(lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT));
|
|
|
|
// Clean up
|
|
DestroyIcon(hIcon);
|
|
SelectObject(lpdis->hDC, hOldPen);
|
|
SelectObject(lpdis->hDC, hOldBrush);
|
|
DeleteObject(br);
|
|
DeleteObject(hiPen);
|
|
DeleteObject(shPen);
|
|
}
|
|
|
|
if ((lpdis->itemState & ODS_SELECTED) &&
|
|
(lpdis->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
|
|
{
|
|
// item has been selected - hilite frame
|
|
bDrawText = TRUE;
|
|
br = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
|
|
CopyRect(&r, &lpdis->rcItem);
|
|
r.left = 5 + 32 + 8;
|
|
FillRect(lpdis->hDC, &r, br);
|
|
SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT));
|
|
SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
DeleteObject(br);
|
|
}
|
|
|
|
if (!(lpdis->itemState & ODS_SELECTED) &&
|
|
(lpdis->itemAction & ODA_SELECT))
|
|
{
|
|
bDrawText = TRUE;
|
|
// Item has been de-selected -- remove frame
|
|
br = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
|
|
CopyRect(&r, &lpdis->rcItem);
|
|
r.left = 5 + 32 + 8;
|
|
FillRect(lpdis->hDC, &r, br);
|
|
SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));
|
|
SetTextColor(lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT));
|
|
DeleteObject(br);
|
|
}
|
|
|
|
// Draw the text
|
|
if ( bDrawText )
|
|
{
|
|
ListBox_GetText(hwnd, lpdis->itemID, buffer);
|
|
//SelectObject(lpdis->hDC, GetStockObject(ANSI_VAR_FONT));
|
|
SelectObject(lpdis->hDC, hFont); //garth 05-03-96
|
|
SetBkMode(lpdis->hDC, OPAQUE);
|
|
GetTextMetrics(lpdis->hDC, &tm);
|
|
GetTextExtentPoint(lpdis->hDC, buffer, _tcslen(buffer), &size);
|
|
if ( size.cx > ( lpdis->rcItem.right - lpdis->rcItem.left - 5 - 32 - 12 - 3/* spacing at end */) )
|
|
{ // Line split
|
|
_tcscpy(tempBuffer, buffer);
|
|
bTooLong = TRUE;
|
|
while ( bTooLong )
|
|
{
|
|
charPtr = _tcsrchr(tempBuffer, ' ');
|
|
if ( charPtr )
|
|
*charPtr = '\0';
|
|
else
|
|
break;
|
|
GetTextExtentPoint(lpdis->hDC, tempBuffer, _tcslen(tempBuffer), &size);
|
|
if ( size.cx <= ( lpdis->rcItem.right - lpdis->rcItem.left - 5 - 32 - 12 - 3/* spacing at end */) )
|
|
bTooLong = FALSE;
|
|
}
|
|
textY = lpdis->rcItem.top + ( ( lpdis->rcItem.bottom - lpdis->rcItem.top - ( 2 * tm.tmHeight ) ) / 2 );
|
|
textX = 5 + 32 + 12;
|
|
clipRect.left = textX;
|
|
clipRect.right = lpdis->rcItem.right - 3;
|
|
clipRect.top = textY;
|
|
clipRect.bottom = textY + size.cy;
|
|
ExtTextOut(lpdis->hDC, textX, textY, ETO_CLIPPED, &clipRect,
|
|
tempBuffer, _tcslen(tempBuffer), NULL);
|
|
textY += tm.tmHeight;
|
|
clipRect.top = textY;
|
|
clipRect.bottom = textY + size.cy;
|
|
charPtr = buffer + _tcslen(tempBuffer) + 1;
|
|
ExtTextOut(lpdis->hDC, 5 + 32 + 12, textY, ETO_CLIPPED, &clipRect,
|
|
charPtr, _tcslen(charPtr), NULL);
|
|
}
|
|
else
|
|
{
|
|
textY = lpdis->rcItem.top + ( ( lpdis->rcItem.bottom - lpdis->rcItem.top - tm.tmHeight ) / 2 );
|
|
TextOut(lpdis->hDC, 5 + 32 + 12, textY, buffer, _tcslen(buffer));
|
|
}
|
|
}
|
|
}
|
|
|