drivlist.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 12k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "common.h"
  2. #include "diskutil.h"
  3. #include "msprintf.h"
  4. #include "drivlist.h" 
  5. #include "miniicon.h"
  6. #define  cxBITMAP  18
  7. #define  cyBITMAP  18
  8. #define  cbRESOURCE 256
  9. /*
  10.  * VARIABLES __________________________________________________________________
  11.  *
  12.  */
  13. FARPROC lpfnComboMain;
  14. /*
  15.  * PROTOTYPES _________________________________________________________________
  16.  *
  17.  */
  18. LONG APIENTRY 
  19. DriveListProc(
  20.     HWND hWnd, 
  21.     UINT Message, 
  22.     WPARAM wParam, 
  23.     LPARAM lParam
  24.     );
  25. BOOL CALLBACK 
  26. DriveComboProc(
  27.     HWND hWnd, 
  28.     UINT Message, 
  29.     WPARAM wParam, 
  30.     LPARAM lParam
  31.     );
  32. void 
  33. GoSelectDrive(
  34.     HWND hWnd, 
  35.     drenum dre
  36.     );
  37.     
  38. void 
  39. DrawDriveItem(
  40.     DRAWITEMSTRUCT *lpdi
  41.     );
  42. /*
  43.  * ROUTINES ___________________________________________________________________
  44.  *
  45.  */
  46. /*** RegisterDriveList - Registers the DriveList class (always do this!!!)
  47.  *
  48.  */
  49. BOOL 
  50. RegisterDriveList(
  51.     HINSTANCE hInst
  52.     )
  53. {
  54.     WNDCLASS wc;
  55.     wc.style       = CS_NOCLOSE;
  56.     wc.lpfnWndProc = DriveListProc; // Standard callback function
  57.     wc.cbClsExtra  = 0;             // No per-class extra data
  58.     wc.cbWndExtra  = 12;         // We store proc addresses here
  59.     wc.hInstance   = hInst;         // Registering application
  60.     wc.hIcon = NULL;
  61.     wc.hCursor = LoadCursor (NULL, MAKEINTRESOURCE(IDC_ARROW));
  62.     wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  63.     wc.lpszMenuName  = NULL;     // Name of menu resource in .RC file
  64.     wc.lpszClassName = szDriveListCLASS; // Name used in call to CreateWindow
  65.     RegisterClass(&wc);
  66.     return TRUE;
  67. }
  68. /*** ExitDriveList - Frees memory allocated for the DriveList class
  69.  *
  70.  */
  71. void 
  72. ExitDriveList(
  73.     void
  74.     )
  75. {
  76. }
  77. /*** DriveListProc - Procedure for handing a DriveList
  78.  *
  79.  */
  80. LONG APIENTRY 
  81. DriveListProc(
  82.     HWND hWnd, 
  83.     UINT Message, 
  84.     WPARAM wParam, 
  85.     LPARAM lParam
  86.     )
  87. {
  88.     MEASUREITEMSTRUCT *lpmi;
  89.     CREATESTRUCT      *lpcs;
  90.     HWND              hCombo;
  91.     PAINTSTRUCT       ps;
  92.     long              l;
  93.     RECT              r;
  94.     switch (Message)
  95.     {
  96.         case  WM_CREATE:
  97.             lpcs = (CREATESTRUCT *)lParam;
  98.             if (lpcs->style & STYLE_LISTBOX)
  99.             {
  100.                 MiDebugMsg((0, "CreateWindowEx(ListBox)"));
  101.                 hCombo = CreateWindowEx (
  102.                                 //EDGE_SUNKEN | WS_EX_EDGEMASK,
  103.                                 EDGE_SUNKEN,
  104.                                 "ListBox",
  105.                                 "",
  106.                                 LBS_OWNERDRAWFIXED | LBS_HASSTRINGS |
  107.                                 WS_VSCROLL |
  108.                                 WS_VISIBLE | WS_CHILD | CBS_SIMPLE,
  109.                                 0,
  110.                                 0,
  111.                                 lpcs->cx,
  112.                                 lpcs->cy *5,
  113.                                 hWnd,
  114.                                 NULL,
  115.                                 lpcs->hInstance,
  116.                                 NULL
  117.                                 );
  118.             }
  119.             else
  120.             {
  121.                 MiDebugMsg((0, "CreateWindowEx(ComboBox)"));
  122.                 hCombo = CreateWindow (
  123.                                 "ComboBox",
  124.                                 "",
  125.                                 LBS_USETABSTOPS |
  126.                                 CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
  127.                                 CBS_DROPDOWNLIST | WS_VSCROLL |
  128.                                 WS_VISIBLE | WS_CHILD | CBS_SIMPLE,
  129.                                 0,
  130.                                 0,
  131.                                 lpcs->cx,
  132.                                 lpcs->cy *4, // NUMBER LINES in DROP DOWN
  133.                                 hWnd,
  134.                                 NULL,
  135.                                 lpcs->hInstance,
  136.                                 NULL
  137.                                 );
  138.             }
  139.             SetWindowLong(hWnd, DL_COMBOWND, (long)hCombo);
  140.             SetWindowLong(hWnd, DL_UPDATES, 0L);
  141.             if (hCombo == NULL)
  142.                 return -1;
  143.             //
  144.             //Subclass the combobox
  145.             //
  146.             lpfnComboMain = (FARPROC)GetWindowLong(hCombo, GWL_WNDPROC);
  147.             SetWindowLong(hCombo, GWL_WNDPROC, (LONG)DriveComboProc);
  148.             //wproc = (WNDPROC)GetWindowLong (hCombo, GWL_WNDPROC);
  149.             //SetWindowLong(hWnd, DL_COMBOPROC, (long)wproc);
  150.             //wproc = (WNDPROC)DriveComboProc;
  151.             //SetWindowLong(hCombo, GWL_WNDPROC, (long)wproc);
  152.             return 0;
  153.             break;
  154.         case  WM_DESTROY:  
  155.             hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND);
  156.             if (hCombo != NULL)
  157.             {
  158.                 SetWindowLong (hCombo, GWL_WNDPROC, (long)lpfnComboMain);
  159.                 DestroyWindow(hCombo);
  160.                 SetWindowLong(hWnd, DL_COMBOWND, 0L);
  161.             }
  162.             return 0;
  163.             break;
  164.         case WM_HELP:
  165.             ((LPHELPINFO) lParam)->hItemHandle = hWnd;
  166.             return DefWindowProc (hWnd, Message, wParam, lParam);
  167.         case WM_CONTEXTMENU:
  168.             return DefWindowProc (hWnd, Message, (WPARAM) hWnd, lParam);
  169.         case  WM_PAINT:
  170.             BeginPaint (hWnd, &ps);
  171.             EndPaint (hWnd, &ps);
  172.             break;
  173.         case  WM_COMMAND:
  174.             if ((HIWORD(lParam) == CBN_SELCHANGE) || 
  175.                 (HIWORD(lParam) == LBN_SELCHANGE))
  176.             {
  177.                 wParam = GetWindowLong(hWnd, GWL_ID);
  178.                 SendMessage(GetParent(hWnd),Message,wParam,lParam);
  179.             }
  180.             break;
  181.         case  WM_MEASUREITEM:
  182.             lpmi = (MEASUREITEMSTRUCT *)lParam;
  183.             lpmi->itemWidth = cxBITMAP;
  184.             lpmi->itemHeight = cyBITMAP +2;
  185.             break;
  186.         case  WM_DRAWITEM:
  187.             DrawDriveItem((DRAWITEMSTRUCT *)lParam);
  188.             return 0;
  189.             break;
  190.         case  DL_UPDATESBAD:
  191.             l = GetWindowLong(hWnd, DL_UPDATES);
  192.             SetWindowLong(hWnd, DL_UPDATES, l+1);
  193.             break;
  194.         case  DL_UPDATESOKAY:
  195.             l = GetWindowLong(hWnd, DL_UPDATES);
  196.             SetWindowLong(hWnd, DL_UPDATES, l-1);
  197.             if (l == 1)
  198.             {
  199.                 GetClientRect(hWnd, &r);
  200.                 InvalidateRect(hWnd, &r, FALSE);
  201.                 UpdateWindow(hWnd);
  202.             }
  203.             break;
  204.     }
  205.     /*
  206.     if ((hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND)) == NULL)
  207.         return -1;
  208.     if ((wproc = (WNDPROC)GetWindowLong(hCombo, GWL_WNDPROC)) == NULL)
  209.         return -1;
  210.     if (Message > WM_USER)
  211.     {
  212.         return CallWindowProc(wproc, hCombo, Message, wParam, lParam);
  213.     }
  214.     if (Message == WM_SETFONT || Message == WM_SETFOCUS || Message == WM_KILLFOCUS)
  215.     {
  216.         CallWindowProc(wproc, hCombo, Message, wParam, lParam);
  217.     }
  218.     if (Message == WM_GETDLGCODE)
  219.         return (DLGC_WANTCHARS | DLGC_WANTARROWS);
  220.     if (Message == WM_KEYDOWN)
  221.     {
  222.         if ((wParam == VK_UP) || (wParam == VK_DOWN) ||
  223.             (wParam == VK_LEFT) || (wParam == VK_RIGHT) ||
  224.             (wParam == VK_HOME) || (wParam == VK_END) ||
  225.             (wParam == VK_F4))
  226.         {
  227.             CallWindowProc (wproc, hCombo, Message, wParam, lParam);
  228.             Message = WM_CHAR;
  229.         }
  230.     }
  231.     if (Message == WM_CHAR)
  232.     {
  233.         return CallWindowProc (wproc, hCombo, Message, wParam, lParam);
  234.     }
  235.     */
  236.     return DefWindowProc (hWnd, Message, wParam, lParam);
  237. }
  238. /*** DriveComboProc - Procedure for handing a DriveList
  239.  *
  240.  */
  241. BOOL CALLBACK 
  242. DriveComboProc(
  243.     HWND hCombo, 
  244.     UINT Message, 
  245.     WPARAM wParam, 
  246.     LPARAM lParam
  247.     )
  248. {
  249.     HWND      hWnd;
  250.     if ((hWnd = GetParent(hCombo)) == NULL)
  251.         return -1;
  252.     if (Message == WM_GETDLGCODE)
  253.         return (DLGC_WANTCHARS | DLGC_WANTARROWS);
  254.     if (Message == WM_CHAR)
  255.     {
  256.         if (wParam >= 'A' && wParam <= 'Z')  GoSelectDrive(hWnd, (drenum)(wParam-'A'));
  257.         if (wParam >= 'a' && wParam <= 'z')  GoSelectDrive(hWnd, (drenum)(wParam-'a'));
  258.         return DefWindowProc (hWnd, Message, wParam, lParam);
  259.     }
  260.     return CallWindowProc((WNDPROC)lpfnComboMain, hCombo, Message, wParam, lParam);
  261. }
  262. /*** GoSelectDrive - Choose a new drive, based on a keypress
  263.  *
  264.  */
  265. void 
  266. GoSelectDrive(
  267.     HWND hWnd, 
  268.     drenum dre
  269.     )
  270. {
  271.     HWND      hCombo;
  272.     USHORT    nItems;
  273.     USHORT    n;
  274.     DWORD     data;
  275.     WPARAM    wParam;
  276.     LPARAM    lParam;
  277.     BOOL      fList;
  278.     if ((hCombo = (HWND)GetWindowLong(hWnd, DL_COMBOWND)) == NULL)
  279.         return;
  280.     fList = (GetWindowLong (hWnd, GWL_STYLE) & STYLE_LISTBOX) ? TRUE : FALSE;
  281.     if (fList)
  282.         nItems = (USHORT)CallWindowProc((WNDPROC)lpfnComboMain, hCombo, LB_GETCOUNT, 0, 0L);
  283.     else
  284.         nItems = (USHORT)CallWindowProc((WNDPROC)lpfnComboMain, hCombo, CB_GETCOUNT, 0, 0L);
  285.     for (n = 0; n < nItems; n++)
  286.     {
  287.         if (fList)
  288.             data = CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, LB_GETITEMDATA, (WPARAM)n, 0L);
  289.         else
  290.             data = CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, CB_GETITEMDATA, (WPARAM)n, 0L);
  291.         if (LOBYTE(data) == dre)
  292.         {
  293.             if (fList)
  294.                 CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, LB_SETCURSEL, (WPARAM)n, 0L);
  295.             else
  296.                 CallWindowProc ((WNDPROC)lpfnComboMain, hCombo, CB_SETCURSEL, (WPARAM)n, 0L);
  297.             wParam = (WPARAM)GetWindowLong(hWnd, GWL_ID);
  298.             lParam = (LPARAM)MAKELONG((WORD)hCombo, (WORD)CBN_SELCHANGE);
  299.             SendMessage(GetParent(hWnd), WM_COMMAND, wParam, lParam);
  300.             return;
  301.         }
  302.     }
  303.     MessageBeep (MB_ICONEXCLAMATION);
  304. }
  305. void 
  306. DrawDriveItem(
  307.     DRAWITEMSTRUCT *lpdi
  308.     )
  309. {
  310.     TCHAR    buf[cbRESOURCE] = "";
  311.     HWND     hWnd;
  312.     int      x, y;
  313.     HICON    hi;
  314.     COLORREF clrBk, clrFg;
  315.     HBRUSH   hb;
  316.     int      dre;
  317.     long     l;
  318.     if (lpdi->itemAction & ODA_FOCUS)
  319.         return;
  320.     dre = (int)LOBYTE(lpdi->itemData);
  321.     MiDebugMsg((0, "DrawDriveItem for dre %d", dre));
  322.     if ((dre != Drive_INV) && ((dre < (int)Drive_A) || (dre > (int)Drive_Z)))
  323.         return;
  324.     hWnd = GetParent (lpdi->hwndItem);
  325.     if (GetWindowLong (hWnd, DL_UPDATES) != 0)
  326.         return;
  327.     l = GetWindowLong (hWnd, GWL_STYLE);
  328.     if (l & STYLE_LISTBOX)
  329.         SendMessage (hWnd, LB_GETTEXT,  (WPARAM)lpdi->itemID,(LPARAM)(LPTSTR)buf);
  330.     else
  331.         SendMessage (hWnd, CB_GETLBTEXT,(WPARAM)lpdi->itemID,(LPARAM)(LPTSTR)buf);
  332.     x = lpdi->rcItem.left;
  333.     y = lpdi->rcItem.top;
  334.     hi = GetDriveIcon((drenum)dre);
  335.     if (lpdi->itemState & ODS_SELECTED)
  336.     {
  337.         clrBk = SetBkColor   (lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
  338.         clrFg = SetTextColor (lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
  339.     }
  340.     else
  341.     {
  342.         clrBk = SetBkColor   (lpdi->hDC, GetSysColor(COLOR_WINDOW));
  343.         clrFg = SetTextColor (lpdi->hDC, GetSysColor(COLOR_WINDOWTEXT));
  344.     }
  345.     hb = CreateSolidBrush (GetBkColor(lpdi->hDC));
  346.     FillRect (lpdi->hDC, &lpdi->rcItem, hb);
  347.     DeleteObject (hb);
  348.     TabbedTextOut (lpdi->hDC, x +((hi == NULL) ? 1 : 21), y+3,
  349.                    buf, _fstrlen(buf), 0, NULL, 0);
  350.     SetBkColor (lpdi->hDC, clrBk);
  351.     SetTextColor (lpdi->hDC, clrFg);
  352.     if (hi == NULL)
  353.         return;
  354.     DrawIconEx(lpdi->hDC, x+1, y+1, hi,
  355.         MINIY, MINIX, 0, NULL, DI_NORMAL);
  356. }