home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------
- ü@STARTMENU.C
- ü@ü@âXâ^ü[âgâüâjâàü[é╠ëⁿæó
- ü@ü@Copyright (C) KAZUBON 1997
- ---------------------------------------------*/
-
- #include "tcdll.h"
-
- static void OnDrawItem(HWND hwnd, DRAWITEMSTRUCT* pdis);
- static BOOL IsStartMenu(HMENU hmenu);
-
- /*------------------------------------------------
- ü@Globals
- --------------------------------------------------*/
- BOOL bStartMenu = FALSE;
- HWND hwndBar = NULL; // â^âXâNâoü[é╠âEâBâôâhâEânâôâhâï
- WNDPROC oldWndProcBar = NULL; // âEâBâôâhâEâvâìâVü[âWââé≡ò█æ╢
- HDC hdcMemMenu = NULL; // âüâjâàü[ò`ëµùpâüâéâèDC
- HBITMAP hbmpMenu = NULL; // âüâjâàü[ò`ëµùpârâbâgâ}âbâv
- HDC hdcMemMenuLeft = NULL; // üuWindows95üvòöò¬ùpâüâéâèDC
- HBITMAP hbmpMenuLeft = NULL; // üuWindows95üvòöò¬ùpârâbâgâ}âbâv
- int hStartMenu = 0; // âüâjâàü[é╠ìéé│é≡ò█æ╢
- COLORREF colMenuLeft; // ÉF
-
- /*------------------------------------------------
- ü@â^âXâNâoü[é╠âTâuâNâëâXâvâìâVü[âWââ
- --------------------------------------------------*/
- LRESULT CALLBACK WndProcBar(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch(message)
- {
- // âüâjâàü[é╠âIü[âiü[âhâìü[
- case WM_DRAWITEM:
- {
- DRAWITEMSTRUCT* pdis;
-
- if(!bStartMenu) break;
- pdis = (DRAWITEMSTRUCT*)lParam;
- // âXâ^ü[âgâüâjâàü[é┼é╚é⌐é┴é╜éτé╗é╠é▄é▄
- if(wParam || !IsStartMenu((HMENU)pdis->hwndItem)) break;
- OnDrawItem(hwnd, pdis);
- return 1;
- }
- // âVâXâeâÇÉFò╧ìX
- case WM_SYSCOLORCHANGE:
- if(hdcMemMenu) DeleteDC(hdcMemMenu); hdcMemMenu = NULL;
- if(hbmpMenu) DeleteObject(hbmpMenu); hbmpMenu = NULL;
- break;
- // v1.7 â^âXâNâoü[é╠ò\Īé¬ùÉéΩéΘé╠é≡ûhé«
- case WM_EXITSIZEMOVE:
- PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
- break;
- }
- return CallWindowProc(oldWndProcBar, hwnd, message, wParam, lParam);
- }
-
- /*------------------------------------------------
- ü@âüâjâàü[é╠âIü[âiü[âhâìü[
- --------------------------------------------------*/
- void OnDrawItem(HWND hwnd, DRAWITEMSTRUCT* pdis)
- {
- HDC hdc;
- RECT rcBox, rcItem;
- HBRUSH hbr;
- BITMAP bmp;
-
- hdc = pdis->hDC;
- CopyRect(&rcItem, &(pdis->rcItem));
- GetClipBox(hdc, &rcBox); // âüâjâàü[æSæ╠é╠æσé½é│
-
- // ò`ëµùpâüâéâèDCé╞ârâbâgâ}âbâvé╠ì∞ɼ
- if(hdcMemMenu == NULL ||
- (hStartMenu != rcBox.bottom && rcBox.left == 0))
- {
- if(hdcMemMenu) DeleteDC(hdcMemMenu);
- if(hbmpMenu) DeleteObject(hbmpMenu);
-
- hdcMemMenu = CreateCompatibleDC(hdc);
- hbmpMenu = CreateCompatibleBitmap(hdc, rcBox.right, rcBox.bottom);
- SelectObject(hdcMemMenu, hbmpMenu);
- hbr = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
- FillRect(hdcMemMenu, &rcBox, hbr);
- hStartMenu = rcBox.bottom;
- }
-
- SelectObject(hdcMemMenu, (HFONT)GetCurrentObject(hdc, OBJ_FONT));
-
- // öwîiÉFüAò╢ÄÜÉFé╠É▌ÆΦ
- if(pdis->itemState & ODS_FOCUS)
- {
- SetTextColor(hdcMemMenu, GetSysColor(COLOR_HIGHLIGHTTEXT));
- SetBkColor(hdcMemMenu, GetSysColor(COLOR_HIGHLIGHT));
- }
- else
- {
- SetTextColor(hdcMemMenu, GetSysColor(COLOR_MENUTEXT));
- SetBkColor(hdcMemMenu, GetSysColor(COLOR_MENU));
- }
-
- // âüâéâèDCé╔âfâtâHâïâgé╠ò`ëµé≡é│é╣éΘ
- pdis->hDC = hdcMemMenu;
- CallWindowProc(oldWndProcBar, hwnd, WM_DRAWITEM, 0, (LPARAM)pdis);
-
- // üuWindows95üvé╠ò¥é¬üApdis->rcItem.lefté╔ôⁿé┴é─é¡éΘ
- rcItem.right = pdis->rcItem.left;
-
- if(rcItem.right > 0)
- {
- COLORREF col;
- //üuÉFüvé┼ôhéΦé┬é╘é╡
- col = colMenuLeft;
- if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
- hbr = CreateSolidBrush(col);
- FillRect(hdcMemMenu, &rcItem, hbr);
- DeleteObject(hbr);
-
- if(hbmpMenuLeft)
- GetObject(hbmpMenuLeft, sizeof(BITMAP), &bmp);
-
- if(hbmpMenuLeft &&
- rcItem.bottom > rcBox.bottom - bmp.bmHeight)
- {
- int y, ysrc;
- if(rcItem.top > rcBox.bottom - bmp.bmHeight)
- {
- y = rcItem.top;
- ysrc = rcItem.top - (rcBox.bottom - bmp.bmHeight);
- }
- else
- {
- y = rcBox.bottom - bmp.bmHeight;
- ysrc = 0;
- }
- // ârâbâgâ}âbâvò`ëµ
- BitBlt(hdcMemMenu, 0, y,
- rcItem.right, rcItem.bottom - y,
- hdcMemMenuLeft, 0, ysrc, SRCCOPY);
- }
- }
-
- // û{ôûé╠DCé╔é▄é╞é▀é─ò`ëµ
- BitBlt(hdc, 0, rcItem.top,
- pdis->rcItem.right, rcItem.bottom - rcItem.top,
- hdcMemMenu, 0, rcItem.top, SRCCOPY);
- pdis->hDC = hdc;
- }
-
- /*--------------------------------------------------
- ü@âXâ^ü[âgâüâjâàü[ëⁿæóé╠Åëè·ë╗
- ----------------------------------------------------*/
- void SetStartMenu(HWND hwndClock)
- {
- char fname[1024];
-
- EndStartMenu();
-
- // â^âXâNâoü[é╠âTâuâNâëâXë╗üiv1.7éµéΦòKé╕âTâuâNâëâXë╗üj
- hwndBar = GetParent(GetParent(hwndClock)); // Shell_TrayWnd
- oldWndProcBar = (WNDPROC)GetWindowLong(hwndBar, GWL_WNDPROC);
- SetWindowLong(hwndBar, GWL_WNDPROC, (LONG)WndProcBar);
-
- if(!GetMyRegLong("StartMenu", &bStartMenu))
- bStartMenu = FALSE;
-
- if(!bStartMenu) return;
-
- if(!GetMyRegLong("StartMenuCol", &colMenuLeft))
- colMenuLeft = RGB(128, 128, 128);
-
- if(!GetMyRegStr("StartMenuBmp", fname))
- fname[0] = 0;
-
- if(fname[0]) // üuWindows95üvòöò¬ùpé╠âüâéâèDCé╞ârâbâgâ}âbâvì∞ɼ
- {
- hbmpMenuLeft = ReadBitmap(hwndBar, fname, FALSE);
- if(hbmpMenuLeft)
- {
- HDC hdc;
- hdc = GetDC(hwndBar);
- hdcMemMenuLeft = CreateCompatibleDC(hdc);
- SelectObject(hdcMemMenuLeft, hbmpMenuLeft);
- ReleaseDC(hwndBar, hdc);
- }
- }
- }
-
- /*--------------------------------------------------
- ü@î│é╔û▀é╖
- ----------------------------------------------------*/
- void EndStartMenu()
- {
- if(hwndBar && IsWindow(hwndBar) && oldWndProcBar)
- SetWindowLong(hwndBar, GWL_WNDPROC, (LONG)oldWndProcBar);
- hwndBar = NULL; oldWndProcBar = NULL;
- if(hdcMemMenu) DeleteDC(hdcMemMenu); hdcMemMenu = NULL;
- if(hbmpMenu) DeleteObject(hbmpMenu); hbmpMenu = NULL;
- if(hdcMemMenuLeft) DeleteDC(hdcMemMenuLeft); hdcMemMenuLeft = NULL;
- if(hbmpMenuLeft) DeleteObject(hbmpMenuLeft); hbmpMenuLeft = NULL;
- }
-
- /*--------------------------------------------------
- ü@âXâ^ü[âgâüâjâàü[é⌐é╟éñé⌐ö╗ò╩
- ----------------------------------------------------*/
- BOOL IsStartMenu(HMENU hmenu)
- {
- int i, count, id;
-
- count = GetMenuItemCount(hmenu);
- for(i = 0; i < count; i++)
- {
- id = GetMenuItemID(hmenu, i);
- // üuâwâïâvüvé¬éáéΩé╬âXâ^ü[âgâüâjâàü[
- if(id == 503) return TRUE;
- }
- return FALSE;
- }
-
- // ------------------------------------------------------
- // ê╚ë║üAIE4ùp
-
- LRESULT CALLBACK WndProcStartMenu(HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam);
- HWND hwndStartMenu = NULL; // âXâ^ü[âgâüâjâàü[é╠âEâBâôâhâEânâôâhâï
- WNDPROC oldWndProcStartMenu = NULL;
-
- /*--------------------------------------------------
- ü@âXâ^ü[âgâüâjâàü[âEâBâôâhâEé╠âTâuâNâëâXë╗
- ----------------------------------------------------*/
- void InitStartMenuIE4(HWND hwnd)
- {
- HWND hwndChild;
- RECT rc1, rc2;
-
- if(!bStartMenu) return;
- if(GetParent(hwnd)) return;
- hwndChild = GetTopWindow(hwnd);
- GetClientRect(hwnd, &rc1);
- GetClientRect(hwndChild, &rc2);
- if(rc1.right - rc2.right != 21) return;
-
- // âTâuâNâëâXë╗
- oldWndProcStartMenu = (WNDPROC)GetWindowLong(hwnd, GWL_WNDPROC);
- SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndProcStartMenu);
- hwndStartMenu = hwnd;
- }
-
- /*--------------------------------------------------
- ü@âXâ^ü[âgâüâjâàü[âEâBâôâhâEé≡î│é╔û▀é╖
- ----------------------------------------------------*/
- void ClearStartMenuIE4(void)
- {
- if(hwndStartMenu && IsWindow(hwndStartMenu) && oldWndProcStartMenu)
- SetWindowLong(hwndStartMenu, GWL_WNDPROC, (LONG)oldWndProcStartMenu);
- hwndStartMenu = NULL; oldWndProcStartMenu = NULL;
- }
-
- /*------------------------------------------------
- ü@âXâ^ü[âgâüâjâàü[é╠âTâuâNâëâXâvâìâVü[âWââ
- --------------------------------------------------*/
- LRESULT CALLBACK WndProcStartMenu(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch(message)
- {
- // âüâjâàü[é╠ò`ëµ
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc;
- RECT rc;
- COLORREF col;
- HBRUSH hbr;
- BITMAP bmp;
-
- hdc = BeginPaint(hwnd, &ps);
- GetClientRect(hwnd, &rc);
- rc.right = 21;
- //üuÉFüvé┼ôhéΦé┬é╘é╡
- col = colMenuLeft;
- if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
- hbr = CreateSolidBrush(col);
- FillRect(hdc, &rc, hbr);
- DeleteObject(hbr);
- if(hbmpMenuLeft)
- {
- GetObject(hbmpMenuLeft, sizeof(BITMAP), &bmp);
- // ârâbâgâ}âbâvò`ëµ
- BitBlt(hdc, 0, rc.bottom - bmp.bmHeight,
- rc.right, bmp.bmHeight,
- hdcMemMenuLeft, 0, 0, SRCCOPY);
- }
- EndPaint(hwnd, &ps);
- return 0;
- }
- // âVâXâeâÇÉFò╧ìX
- case WM_SYSCOLORCHANGE:
- break;
- }
- return CallWindowProc(oldWndProcStartMenu, hwnd, message, wParam, lParam);
- }
-