Leaked source code of windows server 2003
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.
 
 
 
 
 
 

426 lines
12 KiB

#include "common.h"
#include "diskutil.h"
#include "msprintf.h"
#include "drivlist.h"
#include "miniicon.h"
#define cxBITMAP 18
#define cyBITMAP 18
#define cbRESOURCE 256
/*
* VARIABLES __________________________________________________________________
*
*/
FARPROC lpfnComboMain;
/*
* PROTOTYPES _________________________________________________________________
*
*/
LONG APIENTRY
DriveListProc(
HWND hWnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
);
BOOL CALLBACK
DriveComboProc(
HWND hWnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
);
void
GoSelectDrive(
HWND hWnd,
drenum dre
);
void
DrawDriveItem(
DRAWITEMSTRUCT *lpdi
);
/*
* ROUTINES ___________________________________________________________________
*
*/
/*** RegisterDriveList - Registers the DriveList class (always do this!!!)
*
*/
BOOL
RegisterDriveList(
HINSTANCE hInst
)
{
WNDCLASS wc;
wc.style = CS_NOCLOSE;
wc.lpfnWndProc = DriveListProc; // Standard callback function
wc.cbClsExtra = 0; // No per-class extra data
wc.cbWndExtra = 12; // We store proc addresses here
wc.hInstance = hInst; // Registering application
wc.hIcon = NULL;
wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE(IDC_ARROW));
wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
wc.lpszMenuName = NULL; // Name of menu resource in .RC file
wc.lpszClassName = szDriveListCLASS; // Name used in call to CreateWindow
RegisterClass(&wc);
return TRUE;
}
/*** ExitDriveList - Frees memory allocated for the DriveList class
*
*/
void
ExitDriveList(
void
)
{
}
/*** DriveListProc - Procedure for handing a DriveList
*
*/
LONG APIENTRY
DriveListProc(
HWND hWnd,
UINT Message,
WPARAM wParam,
LPARAM lParam
)
{
MEASUREITEMSTRUCT *lpmi;
CREATESTRUCT *lpcs;
HWND hCombo;
PAINTSTRUCT ps;
long l;
RECT r;
switch (Message)
{
case WM_CREATE:
lpcs = (CREATESTRUCT *)lParam;
if (lpcs->style & STYLE_LISTBOX)
{
MiDebugMsg((0, "CreateWindowEx(ListBox)"));
hCombo = CreateWindowEx (
//EDGE_SUNKEN | WS_EX_EDGEMASK,
EDGE_SUNKEN,
"ListBox",
"",
LBS_OWNERDRAWFIXED | LBS_HASSTRINGS |
WS_VSCROLL |
WS_VISIBLE | WS_CHILD | CBS_SIMPLE,
0,
0,
lpcs->cx,
lpcs->cy *5,
hWnd,
NULL,
lpcs->hInstance,
NULL
);
}
else
{
MiDebugMsg((0, "CreateWindowEx(ComboBox)"));
hCombo = CreateWindow (
"ComboBox",
"",
LBS_USETABSTOPS |
CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
CBS_DROPDOWNLIST | WS_VSCROLL |
WS_VISIBLE | WS_CHILD | CBS_SIMPLE,
0,
0,
lpcs->cx,
lpcs->cy *4, // NUMBER LINES in DROP DOWN
hWnd,
NULL,
lpcs->hInstance,
NULL
);
}
SetWindowLong(hWnd, DL_COMBOWND, (long)hCombo);
SetWindowLong(hWnd, DL_UPDATES, 0L);
if (hCombo == NULL)
return -1;
//
//Subclass the combobox
//
lpfnComboMain = (FARPROC)GetWindowLong(hCombo, GWL_WNDPROC);
SetWindowLong(hCombo, GWL_WNDPROC, (LONG)DriveComboProc);
//wproc = (WNDPROC)GetWindowLong (hCombo, GWL_WNDPROC);
//SetWindowLong(hWnd, DL_COMBOPROC, (long)wproc);
//wproc = (WNDPROC)DriveComboProc;
//SetWindowLong(hCombo, GWL_WNDPROC, (long)wproc);
return 0;
break;
case WM_DESTROY:
hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND);
if (hCombo != NULL)
{
SetWindowLong (hCombo, GWL_WNDPROC, (long)lpfnComboMain);
DestroyWindow(hCombo);
SetWindowLong(hWnd, DL_COMBOWND, 0L);
}
return 0;
break;
case WM_HELP:
((LPHELPINFO) lParam)->hItemHandle = hWnd;
return DefWindowProc (hWnd, Message, wParam, lParam);
case WM_CONTEXTMENU:
return DefWindowProc (hWnd, Message, (WPARAM) hWnd, lParam);
case WM_PAINT:
BeginPaint (hWnd, &ps);
EndPaint (hWnd, &ps);
break;
case WM_COMMAND:
if ((HIWORD(lParam) == CBN_SELCHANGE) ||
(HIWORD(lParam) == LBN_SELCHANGE))
{
wParam = GetWindowLong(hWnd, GWL_ID);
SendMessage(GetParent(hWnd),Message,wParam,lParam);
}
break;
case WM_MEASUREITEM:
lpmi = (MEASUREITEMSTRUCT *)lParam;
lpmi->itemWidth = cxBITMAP;
lpmi->itemHeight = cyBITMAP +2;
break;
case WM_DRAWITEM:
DrawDriveItem((DRAWITEMSTRUCT *)lParam);
return 0;
break;
case DL_UPDATESBAD:
l = GetWindowLong(hWnd, DL_UPDATES);
SetWindowLong(hWnd, DL_UPDATES, l+1);
break;
case DL_UPDATESOKAY:
l = GetWindowLong(hWnd, DL_UPDATES);
SetWindowLong(hWnd, DL_UPDATES, l-1);
if (l == 1)
{
GetClientRect(hWnd, &r);
InvalidateRect(hWnd, &r, FALSE);
UpdateWindow(hWnd);
}
break;
}
/*
if ((hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND)) == NULL)
return -1;
if ((wproc = (WNDPROC)GetWindowLong(hCombo, GWL_WNDPROC)) == NULL)
return -1;
if (Message > WM_USER)
{
return CallWindowProc(wproc, hCombo, Message, wParam, lParam);
}
if (Message == WM_SETFONT || Message == WM_SETFOCUS || Message == WM_KILLFOCUS)
{
CallWindowProc(wproc, hCombo, Message, wParam, lParam);
}
if (Message == WM_GETDLGCODE)
return (DLGC_WANTCHARS | DLGC_WANTARROWS);
if (Message == WM_KEYDOWN)
{
if ((wParam == VK_UP) || (wParam == VK_DOWN) ||
(wParam == VK_LEFT) || (wParam == VK_RIGHT) ||
(wParam == VK_HOME) || (wParam == VK_END) ||
(wParam == VK_F4))
{
CallWindowProc (wproc, hCombo, Message, wParam, lParam);
Message = WM_CHAR;
}
}
if (Message == WM_CHAR)
{
return CallWindowProc (wproc, hCombo, Message, wParam, lParam);
}
*/
return DefWindowProc (hWnd, Message, wParam, lParam);
}
/*** DriveComboProc - Procedure for handing a DriveList
*
*/
BOOL CALLBACK
DriveComboProc(
HWND hCombo,
UINT Message,
WPARAM wParam,
LPARAM lParam
)
{
HWND hWnd;
if ((hWnd = GetParent(hCombo)) == NULL)
return -1;
if (Message == WM_GETDLGCODE)
return (DLGC_WANTCHARS | DLGC_WANTARROWS);
if (Message == WM_CHAR)
{
if (wParam >= 'A' && wParam <= 'Z') GoSelectDrive(hWnd, (drenum)(wParam-'A'));
if (wParam >= 'a' && wParam <= 'z') GoSelectDrive(hWnd, (drenum)(wParam-'a'));
return DefWindowProc (hWnd, Message, wParam, lParam);
}
return CallWindowProc((WNDPROC)lpfnComboMain, hCombo, Message, wParam, lParam);
}
/*** GoSelectDrive - Choose a new drive, based on a keypress
*
*/
void
GoSelectDrive(
HWND hWnd,
drenum dre
)
{
HWND hCombo;
USHORT nItems;
USHORT n;
DWORD data;
WPARAM wParam;
LPARAM lParam;
BOOL fList;
if ((hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND)) == NULL)
return;
fList = (GetWindowLong (hWnd, GWL_STYLE) & STYLE_LISTBOX) ? TRUE : FALSE;
if (fList)
nItems = (USHORT)CallWindowProc((WNDPROC)lpfnComboMain, hCombo, LB_GETCOUNT, 0, 0L);
else
nItems = (USHORT)CallWindowProc((WNDPROC)lpfnComboMain, hCombo, CB_GETCOUNT, 0, 0L);
for (n = 0; n < nItems; n++)
{
if (fList)
data = CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, LB_GETITEMDATA, (WPARAM)n, 0L);
else
data = CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, CB_GETITEMDATA, (WPARAM)n, 0L);
if (LOBYTE(data) == dre)
{
if (fList)
CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, LB_SETCURSEL, (WPARAM)n, 0L);
else
CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, CB_SETCURSEL, (WPARAM)n, 0L);
wParam = (WPARAM)GetWindowLong(hWnd, GWL_ID);
lParam = (LPARAM)MAKELONG((WORD)hCombo, (WORD)CBN_SELCHANGE);
SendMessage(GetParent(hWnd), WM_COMMAND, wParam, lParam);
return;
}
}
MessageBeep (MB_ICONEXCLAMATION);
}
void
DrawDriveItem(
DRAWITEMSTRUCT *lpdi
)
{
TCHAR buf[cbRESOURCE] = "";
HWND hWnd;
int x, y;
HICON hi;
COLORREF clrBk, clrFg;
HBRUSH hb;
int dre;
long l;
if (lpdi->itemAction & ODA_FOCUS)
return;
dre = (int)LOBYTE(lpdi->itemData);
MiDebugMsg((0, "DrawDriveItem for dre %d", dre));
if ((dre != Drive_INV) && ((dre < (int)Drive_A) || (dre > (int)Drive_Z)))
return;
hWnd = GetParent (lpdi->hwndItem);
if (GetWindowLong (hWnd, DL_UPDATES) != 0)
return;
l = GetWindowLong (hWnd, GWL_STYLE);
if (l & STYLE_LISTBOX)
SendMessage (hWnd, LB_GETTEXT, (WPARAM)lpdi->itemID,(LPARAM)(LPTSTR)buf);
else
SendMessage (hWnd, CB_GETLBTEXT,(WPARAM)lpdi->itemID,(LPARAM)(LPTSTR)buf);
x = lpdi->rcItem.left;
y = lpdi->rcItem.top;
hi = GetDriveIcon((drenum)dre);
if (lpdi->itemState & ODS_SELECTED)
{
clrBk = SetBkColor (lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
clrFg = SetTextColor (lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
else
{
clrBk = SetBkColor (lpdi->hDC, GetSysColor(COLOR_WINDOW));
clrFg = SetTextColor (lpdi->hDC, GetSysColor(COLOR_WINDOWTEXT));
}
hb = CreateSolidBrush (GetBkColor(lpdi->hDC));
FillRect (lpdi->hDC, &lpdi->rcItem, hb);
DeleteObject (hb);
TabbedTextOut (lpdi->hDC, x +((hi == NULL) ? 1 : 21), y+3,
buf, _fstrlen(buf), 0, NULL, 0);
SetBkColor (lpdi->hDC, clrBk);
SetTextColor (lpdi->hDC, clrFg);
if (hi == NULL)
return;
DrawIconEx(lpdi->hDC, x+1, y+1, hi,
MINIY, MINIX, 0, NULL, DI_NORMAL);
}