home *** CD-ROM | disk | FTP | other *** search
/ Online Software 2: 1,000 Utilities / TK_OJ9711.iso / accessor / TCL170.LZH / DLLSRC.lzh / startmenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-27  |  8.4 KB  |  300 lines

  1. /*-------------------------------------------
  2. ü@STARTMENU.C
  3. ü@ü@âXâ^ü[âgâüâjâàü[é╠ëⁿæó
  4. ü@ü@Copyright (C) KAZUBON 1997
  5. ---------------------------------------------*/
  6.  
  7. #include "tcdll.h"
  8.  
  9. static void OnDrawItem(HWND hwnd, DRAWITEMSTRUCT* pdis);
  10. static BOOL IsStartMenu(HMENU hmenu);
  11.  
  12. /*------------------------------------------------
  13. ü@Globals
  14. --------------------------------------------------*/
  15. BOOL bStartMenu = FALSE;
  16. HWND hwndBar = NULL;           // â^âXâNâoü[é╠âEâBâôâhâEânâôâhâï
  17. WNDPROC oldWndProcBar = NULL;  // âEâBâôâhâEâvâìâVü[âWââé≡ò█æ╢
  18. HDC hdcMemMenu = NULL;         // âüâjâàü[ò`ëµùpâüâéâèDC
  19. HBITMAP hbmpMenu = NULL;       // âüâjâàü[ò`ëµùpârâbâgâ}âbâv
  20. HDC hdcMemMenuLeft = NULL;     // üuWindows95üvòöò¬ùpâüâéâèDC
  21. HBITMAP hbmpMenuLeft = NULL;   // üuWindows95üvòöò¬ùpârâbâgâ}âbâv
  22. int hStartMenu = 0;            // âüâjâàü[é╠ìéé│é≡ò█æ╢
  23. COLORREF colMenuLeft;          // ÉF
  24.  
  25. /*------------------------------------------------
  26. ü@â^âXâNâoü[é╠âTâuâNâëâXâvâìâVü[âWââ
  27. --------------------------------------------------*/
  28. LRESULT CALLBACK WndProcBar(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  29. {
  30.     switch(message)
  31.     {
  32.         // âüâjâàü[é╠âIü[âiü[âhâìü[
  33.         case WM_DRAWITEM:
  34.         {
  35.             DRAWITEMSTRUCT* pdis;
  36.             
  37.             if(!bStartMenu) break;
  38.             pdis = (DRAWITEMSTRUCT*)lParam;
  39.             // âXâ^ü[âgâüâjâàü[é┼é╚é⌐é┴é╜éτé╗é╠é▄é▄
  40.             if(wParam || !IsStartMenu((HMENU)pdis->hwndItem)) break;
  41.             OnDrawItem(hwnd, pdis);
  42.             return 1;
  43.         }
  44.         // âVâXâeâÇÉFò╧ìX
  45.         case WM_SYSCOLORCHANGE:
  46.             if(hdcMemMenu) DeleteDC(hdcMemMenu); hdcMemMenu = NULL;
  47.             if(hbmpMenu) DeleteObject(hbmpMenu); hbmpMenu = NULL;
  48.             break;
  49.         // v1.7  â^âXâNâoü[é╠ò\Īé¬ùÉéΩéΘé╠é≡ûhé«
  50.         case WM_EXITSIZEMOVE:
  51.             PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
  52.             break;
  53.     }
  54.     return CallWindowProc(oldWndProcBar, hwnd, message, wParam, lParam);
  55. }
  56.  
  57. /*------------------------------------------------
  58. ü@âüâjâàü[é╠âIü[âiü[âhâìü[
  59. --------------------------------------------------*/
  60. void OnDrawItem(HWND hwnd, DRAWITEMSTRUCT* pdis)
  61. {
  62.     HDC hdc;
  63.     RECT rcBox, rcItem;
  64.     HBRUSH hbr;
  65.     BITMAP bmp;
  66.  
  67.     hdc = pdis->hDC;
  68.     CopyRect(&rcItem, &(pdis->rcItem));
  69.     GetClipBox(hdc, &rcBox); // âüâjâàü[æSæ╠é╠æσé½é│
  70.  
  71.     // ò`ëµùpâüâéâèDCé╞ârâbâgâ}âbâvé╠ì∞ɼ
  72.     if(hdcMemMenu == NULL ||
  73.         (hStartMenu != rcBox.bottom && rcBox.left == 0))
  74.     {
  75.         if(hdcMemMenu) DeleteDC(hdcMemMenu);
  76.         if(hbmpMenu) DeleteObject(hbmpMenu);
  77.                 
  78.         hdcMemMenu = CreateCompatibleDC(hdc);
  79.         hbmpMenu = CreateCompatibleBitmap(hdc, rcBox.right, rcBox.bottom);
  80.         SelectObject(hdcMemMenu, hbmpMenu);
  81.         hbr = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
  82.         FillRect(hdcMemMenu, &rcBox, hbr);
  83.         hStartMenu = rcBox.bottom;
  84.     }
  85.             
  86.     SelectObject(hdcMemMenu, (HFONT)GetCurrentObject(hdc, OBJ_FONT));
  87.             
  88.     // öwîiÉFüAò╢ÄÜÉFé╠É▌ÆΦ
  89.     if(pdis->itemState & ODS_FOCUS)
  90.     {
  91.         SetTextColor(hdcMemMenu, GetSysColor(COLOR_HIGHLIGHTTEXT));
  92.         SetBkColor(hdcMemMenu, GetSysColor(COLOR_HIGHLIGHT));
  93.     }
  94.     else
  95.     {
  96.         SetTextColor(hdcMemMenu, GetSysColor(COLOR_MENUTEXT));
  97.         SetBkColor(hdcMemMenu, GetSysColor(COLOR_MENU));
  98.     }
  99.  
  100.     // âüâéâèDCé╔âfâtâHâïâgé╠ò`ëµé≡é│é╣éΘ
  101.     pdis->hDC = hdcMemMenu;
  102.     CallWindowProc(oldWndProcBar, hwnd, WM_DRAWITEM, 0, (LPARAM)pdis);
  103.             
  104.     // üuWindows95üvé╠ò¥é¬üApdis->rcItem.lefté╔ôⁿé┴é─é¡éΘ
  105.     rcItem.right = pdis->rcItem.left;
  106.     
  107.     if(rcItem.right > 0)
  108.     {
  109.         COLORREF col;
  110.         //üuÉFüvé┼ôhéΦé┬é╘é╡
  111.         col = colMenuLeft;
  112.         if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  113.         hbr = CreateSolidBrush(col);
  114.         FillRect(hdcMemMenu, &rcItem, hbr);
  115.         DeleteObject(hbr);
  116.         
  117.         if(hbmpMenuLeft)
  118.             GetObject(hbmpMenuLeft, sizeof(BITMAP), &bmp);
  119.         
  120.         if(hbmpMenuLeft &&
  121.             rcItem.bottom > rcBox.bottom - bmp.bmHeight)
  122.         {
  123.             int y, ysrc;
  124.             if(rcItem.top > rcBox.bottom - bmp.bmHeight)
  125.             {
  126.                 y = rcItem.top;
  127.                 ysrc = rcItem.top - (rcBox.bottom - bmp.bmHeight);
  128.             }
  129.             else
  130.             {
  131.                 y = rcBox.bottom - bmp.bmHeight;
  132.                 ysrc = 0;
  133.             }
  134.             // ârâbâgâ}âbâvò`ëµ
  135.             BitBlt(hdcMemMenu, 0, y,
  136.                 rcItem.right, rcItem.bottom - y,
  137.                 hdcMemMenuLeft, 0, ysrc, SRCCOPY);
  138.         }
  139.     }
  140.  
  141.     // û{ôûé╠DCé╔é▄é╞é▀é─ò`ëµ
  142.     BitBlt(hdc, 0, rcItem.top,
  143.         pdis->rcItem.right, rcItem.bottom - rcItem.top,
  144.         hdcMemMenu, 0, rcItem.top, SRCCOPY);
  145.     pdis->hDC = hdc;
  146. }
  147.  
  148. /*--------------------------------------------------
  149. ü@âXâ^ü[âgâüâjâàü[ëⁿæóé╠Åëè·ë╗
  150. ----------------------------------------------------*/
  151. void SetStartMenu(HWND hwndClock)
  152. {
  153.     char fname[1024];
  154.  
  155.     EndStartMenu();
  156.     
  157.     // â^âXâNâoü[é╠âTâuâNâëâXë╗üiv1.7éµéΦòKé╕âTâuâNâëâXë╗üj
  158.     hwndBar = GetParent(GetParent(hwndClock)); // Shell_TrayWnd
  159.     oldWndProcBar = (WNDPROC)GetWindowLong(hwndBar, GWL_WNDPROC);
  160.     SetWindowLong(hwndBar, GWL_WNDPROC, (LONG)WndProcBar);
  161.     
  162.     if(!GetMyRegLong("StartMenu", &bStartMenu))
  163.         bStartMenu = FALSE;
  164.     
  165.     if(!bStartMenu) return;
  166.     
  167.     if(!GetMyRegLong("StartMenuCol", &colMenuLeft))
  168.         colMenuLeft = RGB(128, 128, 128);
  169.     
  170.     if(!GetMyRegStr("StartMenuBmp", fname))
  171.         fname[0] = 0;
  172.     
  173.     if(fname[0]) // üuWindows95üvòöò¬ùpé╠âüâéâèDCé╞ârâbâgâ}âbâvì∞ɼ
  174.     {
  175.         hbmpMenuLeft = ReadBitmap(hwndBar, fname, FALSE);
  176.         if(hbmpMenuLeft)
  177.         {
  178.             HDC hdc;
  179.             hdc = GetDC(hwndBar);
  180.             hdcMemMenuLeft = CreateCompatibleDC(hdc);
  181.             SelectObject(hdcMemMenuLeft, hbmpMenuLeft);
  182.             ReleaseDC(hwndBar, hdc);
  183.         }
  184.     }
  185. }
  186.  
  187. /*--------------------------------------------------
  188. ü@î│é╔û▀é╖
  189. ----------------------------------------------------*/
  190. void EndStartMenu()
  191. {
  192.     if(hwndBar && IsWindow(hwndBar) && oldWndProcBar)
  193.         SetWindowLong(hwndBar, GWL_WNDPROC, (LONG)oldWndProcBar);
  194.     hwndBar = NULL; oldWndProcBar = NULL;
  195.     if(hdcMemMenu) DeleteDC(hdcMemMenu); hdcMemMenu = NULL;
  196.     if(hbmpMenu) DeleteObject(hbmpMenu); hbmpMenu = NULL;
  197.     if(hdcMemMenuLeft) DeleteDC(hdcMemMenuLeft); hdcMemMenuLeft = NULL;
  198.     if(hbmpMenuLeft) DeleteObject(hbmpMenuLeft); hbmpMenuLeft = NULL;
  199. }
  200.  
  201. /*--------------------------------------------------
  202. ü@âXâ^ü[âgâüâjâàü[é⌐é╟éñé⌐ö╗ò╩
  203. ----------------------------------------------------*/
  204. BOOL IsStartMenu(HMENU hmenu)
  205. {
  206.     int i, count, id;
  207.     
  208.     count = GetMenuItemCount(hmenu);
  209.     for(i = 0; i < count; i++)
  210.     {
  211.         id = GetMenuItemID(hmenu, i);
  212.         // üuâwâïâvüvé¬éáéΩé╬âXâ^ü[âgâüâjâàü[
  213.         if(id == 503) return TRUE;
  214.     }
  215.     return FALSE;
  216. }
  217.  
  218. // ------------------------------------------------------
  219. // ê╚ë║üAIE4ùp
  220.  
  221. LRESULT CALLBACK WndProcStartMenu(HWND hwnd, UINT message,
  222.     WPARAM wParam, LPARAM lParam);
  223. HWND hwndStartMenu = NULL; // âXâ^ü[âgâüâjâàü[é╠âEâBâôâhâEânâôâhâï
  224. WNDPROC oldWndProcStartMenu = NULL;
  225.  
  226. /*--------------------------------------------------
  227. ü@âXâ^ü[âgâüâjâàü[âEâBâôâhâEé╠âTâuâNâëâXë╗
  228. ----------------------------------------------------*/
  229. void InitStartMenuIE4(HWND hwnd)
  230. {
  231.     HWND hwndChild;
  232.     RECT rc1, rc2;
  233.     
  234.     if(!bStartMenu) return;
  235.     if(GetParent(hwnd)) return;
  236.     hwndChild = GetTopWindow(hwnd);
  237.     GetClientRect(hwnd, &rc1);
  238.     GetClientRect(hwndChild, &rc2);
  239.     if(rc1.right - rc2.right != 21) return;
  240.  
  241.     // âTâuâNâëâXë╗
  242.     oldWndProcStartMenu = (WNDPROC)GetWindowLong(hwnd, GWL_WNDPROC);
  243.     SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndProcStartMenu);
  244.     hwndStartMenu = hwnd;    
  245. }
  246.  
  247. /*--------------------------------------------------
  248. ü@âXâ^ü[âgâüâjâàü[âEâBâôâhâEé≡î│é╔û▀é╖
  249. ----------------------------------------------------*/
  250. void ClearStartMenuIE4(void)
  251. {
  252.     if(hwndStartMenu && IsWindow(hwndStartMenu) && oldWndProcStartMenu)
  253.         SetWindowLong(hwndStartMenu, GWL_WNDPROC, (LONG)oldWndProcStartMenu);
  254.     hwndStartMenu = NULL; oldWndProcStartMenu = NULL;
  255. }
  256.  
  257. /*------------------------------------------------
  258. ü@âXâ^ü[âgâüâjâàü[é╠âTâuâNâëâXâvâìâVü[âWââ
  259. --------------------------------------------------*/
  260. LRESULT CALLBACK WndProcStartMenu(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  261. {
  262.     switch(message)
  263.     {
  264.         // âüâjâàü[é╠ò`ëµ
  265.         case WM_PAINT:
  266.         {
  267.             PAINTSTRUCT ps;
  268.             HDC hdc;
  269.             RECT rc;
  270.             COLORREF col;
  271.             HBRUSH hbr;
  272.             BITMAP bmp;
  273.  
  274.             hdc = BeginPaint(hwnd, &ps);
  275.             GetClientRect(hwnd, &rc);
  276.             rc.right = 21;
  277.             //üuÉFüvé┼ôhéΦé┬é╘é╡
  278.             col = colMenuLeft;
  279.             if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  280.             hbr = CreateSolidBrush(col);
  281.             FillRect(hdc, &rc, hbr);
  282.             DeleteObject(hbr);
  283.             if(hbmpMenuLeft)
  284.             {
  285.                 GetObject(hbmpMenuLeft, sizeof(BITMAP), &bmp);
  286.                 // ârâbâgâ}âbâvò`ëµ
  287.                 BitBlt(hdc, 0, rc.bottom - bmp.bmHeight,
  288.                     rc.right, bmp.bmHeight,
  289.                     hdcMemMenuLeft, 0, 0, SRCCOPY);
  290.             }
  291.             EndPaint(hwnd, &ps);
  292.             return 0;
  293.         }
  294.         // âVâXâeâÇÉFò╧ìX
  295.         case WM_SYSCOLORCHANGE:
  296.             break;
  297.     }
  298.     return CallWindowProc(oldWndProcStartMenu, hwnd, message, wParam, lParam);
  299. }
  300.