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

  1. /*-----------------------------------------------------
  2. ü@MAIN.C
  3. ü@ü@TCDLLé╠APIüAâtâbâNâvâìâVü[âWââüAÄ₧îvé╠âTâuâNâëâXë╗
  4. ü@ü@Copyright (C) KAZUBON 1997
  5. -------------------------------------------------------*/
  6.  
  7. #include "tcdll.h"
  8.  
  9. LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
  10. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  11. void InitClock(HWND hwnd);
  12. void EndClock(void);
  13. BOOL IsIE4(HWND hwnd);
  14. HMENU CreateClockMenu(void);
  15. void CreateTip(HWND hwnd);
  16. void CreateClockDC(HWND hwnd);
  17. void ReadData(HWND hwnd);
  18. void OnTimer(HWND hwnd);
  19. void DrawClockSub(HWND hwnd, HDC hdc, SYSTEMTIME* pt);
  20. void DrawClock(HWND hwnd, HDC hdc);
  21. LRESULT OnCalcRect(HWND hwnd);
  22.  
  23. /*------------------------------------------------
  24. ü@èeâvâìâZâXé┼ïñÆ╩é╠âfü[â^
  25. --------------------------------------------------*/
  26. #pragma data_seg(".MYDATA")
  27. HANDLE hmod = 0;
  28. HHOOK hhook = 0;
  29. HWND hwndTClockMain = NULL;
  30. HWND hwndClock = NULL;
  31. #pragma data_seg()
  32.  
  33. /*------------------------------------------------
  34. ü@Globals
  35. --------------------------------------------------*/
  36. WNDPROC oldWndProc = NULL;
  37. HDC hdcClock = NULL;
  38. HBITMAP hbmpClock = NULL;
  39. HFONT hFon = NULL;
  40. HMENU hMenu = NULL;
  41. HWND hwndTip = NULL;
  42. COLORREF colback, colfore;
  43. char format[1024];
  44. char sDate, sTime;
  45. char sAM[11], sPM[11];
  46. BOOL bHour12;
  47. int hourLast = -1, minuteLast = -1;
  48. BOOL bNoClock = FALSE;
  49. int nBlink = 0;
  50. int buttondown = 0;
  51. BOOL bStartMenuClock = FALSE;
  52. BOOL bIE4 = FALSE;
  53.  
  54. extern HWND hwndStart;
  55. extern HWND hwndStartMenu;
  56.  
  57. /*------------------------------------------------
  58. ü@DLLé╠âGâôâgâèâ|âCâôâg
  59. --------------------------------------------------*/
  60. BOOL WINAPI DllMain(HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
  61. {
  62.     hmod = hModule;
  63.     switch (dwFunction)
  64.     {
  65.         case DLL_PROCESS_ATTACH:
  66.         case DLL_PROCESS_DETACH:
  67.         default:
  68.         break;
  69.     }
  70.     return TRUE;
  71. }
  72.  
  73. /*------------------------------------------------
  74. ü@APIüFâtâbâNé╠âCâôâXâgü[âï
  75. --------------------------------------------------*/
  76. void WINAPI HookStart(HWND hwndMain)
  77. {
  78.     hwndTClockMain = hwndMain;
  79.     
  80.     hhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, hmod, 0);
  81.     
  82.     //â^âXâNâoü[é╠ìXÉV
  83.     PostMessage(FindWindow("Shell_TrayWnd", NULL), WM_SIZE,
  84.         SIZE_RESTORED, 0);
  85. }
  86.  
  87. /*------------------------------------------------
  88. ü@APIüFâtâbâNé╠âAâôâCâôâXâgü[âï
  89. --------------------------------------------------*/
  90. void WINAPI HookEnd(void)
  91. {
  92.     HWND hwnd;
  93.  
  94.     //Ä₧îvâEâBâôâhâEé╔ÅIù╣Åêù¥é≡é│é╣éΘ
  95.     if(hwndClock && IsWindow(hwndClock))
  96.         SendMessage(hwndClock, WM_COMMAND, 102, 0);
  97.     hwndClock = NULL;
  98.     //âtâbâNé╠âAâôâCâôâXâgü[âï
  99.     if(hhook != NULL)
  100.         UnhookWindowsHookEx(hhook); hhook = NULL;
  101.     
  102.     //â^âXâNâoü[é╠ìXÉV
  103.     hwnd = FindWindow("Shell_TrayWnd", NULL);
  104.     if(hwnd)
  105.         PostMessage(hwnd, WM_SIZE, SIZE_RESTORED, 0);
  106. }
  107.  
  108. /*------------------------------------------------
  109. ü@APIüFÄ₧îvé╠ìXÉV
  110. --------------------------------------------------*/
  111. void WINAPI RefreshTClock(void)
  112. {
  113.     if(hwndClock != NULL)
  114.         PostMessage(hwndClock, WM_USER+1, 0, 0);
  115. }
  116.  
  117. /*------------------------------------------------
  118. ü@APIüFô_û┼èJÄn
  119. --------------------------------------------------*/
  120. void WINAPI BlinkTClock(BOOL b)
  121. {
  122.     if(hwndClock != NULL)
  123.         PostMessage(hwndClock, WM_USER+2, (WPARAM)b, 0);
  124. }
  125.  
  126. /*------------------------------------------------
  127. ü@âtâbâNâvâìâVü[âWââ
  128. --------------------------------------------------*/
  129. LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
  130. {
  131.     LPCWPSTRUCT pcwps;
  132.     char classname[80];
  133.  
  134.     pcwps = (LPCWPSTRUCT)lParam;
  135.  
  136.     if(nCode >= 0 && pcwps && pcwps->hwnd)
  137.     {
  138.         if(hwndClock == NULL &&
  139.             oldWndProc == NULL &&
  140.             GetClassName(pcwps->hwnd, classname, 80) > 0 &&
  141.             strcmp(classname, "TrayClockWClass") == 0)
  142.         {
  143.             // Ä₧îvé╠Åëè·ë╗
  144.             InitClock(pcwps->hwnd);
  145.         }
  146.         if(bIE4 &&
  147.             hwndStartMenu == NULL &&
  148.             GetClassName(pcwps->hwnd, classname, 80) > 0 &&
  149.             strcmp(classname, "BaseBar") == 0)
  150.         {
  151.             // IE4é╠âXâ^ü[âgâüâjâàü[é╠Åëè·ë╗
  152.             InitStartMenuIE4(pcwps->hwnd);
  153.         }
  154.     }
  155.     
  156.     return CallNextHookEx(hhook, nCode, wParam, lParam);
  157. }
  158.  
  159. /*------------------------------------------------
  160. ü@Ä₧îvé╠Åëè·ë╗
  161. --------------------------------------------------*/
  162. void InitClock(HWND hwnd)
  163. {
  164.     BOOL b;
  165.  
  166.     hwndClock = hwnd;
  167.     //âîâWâXâgâèô╟é▌ì₧é▌
  168.     ReadData(hwndClock);
  169.     //âüâjâàü[ì∞ɼ
  170.     hMenu = CreateClockMenu();
  171.     //âTâuâNâëâXë╗
  172.     oldWndProc = (WNDPROC)GetWindowLong(hwndClock, GWL_WNDPROC);
  173.     SetWindowLong(hwndClock, GWL_WNDPROC, (LONG)WndProc);
  174.     //â_âuâïâNâèâbâNÄ≤é»òté»éΘ
  175.     SetClassLong(hwndClock, GCL_STYLE,
  176.         GetClassLong(hwndClock, GCL_STYLE) | CS_DBLCLKS);
  177.     //âXâ^ü[âgâ{â^âôé╠Åëè·ë╗
  178.     SetStartButton(hwndClock);
  179.     //âXâ^ü[âgâüâjâàü[é╠Åëè·ë╗
  180.     SetStartMenu(hwndClock);
  181.     
  182.     //éPòbé¿é½é╔â^âCâ}é≡é⌐é»éΘ
  183.     SetTimer(hwndClock, 1, 1000, NULL);
  184.     //âcü[âïâ`âbâvì∞ɼ
  185.     CreateTip(hwndClock);
  186.  
  187.     if(!GetMyRegLong("DropFiles", &b)) b = FALSE;
  188.     DragAcceptFiles(hwnd, b);
  189.     
  190.     bIE4 = IsIE4(hwndClock);
  191.  
  192.     //â^âXâNâoü[é╠ìXÉV
  193.     PostMessage(GetParent(GetParent(hwndClock)), WM_SIZE,
  194.         SIZE_RESTORED, 0);
  195.     InvalidateRect(GetParent(GetParent(hwndClock)), NULL, TRUE);
  196. }
  197.  
  198. /*------------------------------------------------
  199. ü@Ä₧îvé╠ÅIù╣Åêù¥
  200. --------------------------------------------------*/
  201. void EndClock(void)
  202. {
  203.     DragAcceptFiles(hwndClock, FALSE);
  204.     
  205.     if(hwndTip) DestroyWindow(hwndTip); hwndTip = NULL;
  206.     EndStartButton();
  207.     EndStartMenu();
  208.     ClearStartMenuIE4();
  209.     if(hFon) DeleteObject(hFon); hFon = NULL;
  210.     if(hMenu) DestroyMenu(hMenu); hMenu = NULL;
  211.     if(hdcClock) DeleteDC(hdcClock); hdcClock = NULL;
  212.     if(hbmpClock) DeleteObject(hbmpClock); hbmpClock = NULL;
  213.     if(hwndClock && IsWindow(hwndClock))
  214.     {
  215.         KillTimer(hwndClock, 1);
  216.         SetWindowLong(hwndClock, GWL_WNDPROC, (LONG)oldWndProc);
  217.         oldWndProc = NULL;
  218.     }
  219.     //TClockâEâBâôâhâEé≡ÅIù╣é│é╣éΘ
  220.     if(IsWindow(hwndTClockMain))
  221.         PostMessage(hwndTClockMain, WM_USER+2, 0, 0);
  222. }
  223.  
  224. /*------------------------------------------------
  225. ü@IE4é⌐é╟éñé⌐
  226. --------------------------------------------------*/
  227. BOOL IsIE4(HWND hwnd)
  228. {
  229.     char classname[80];
  230.  
  231.     hwnd = GetParent(GetParent(hwnd));
  232.     if(hwnd == NULL) return FALSE;
  233.     hwnd = GetWindow(hwnd, GW_CHILD);
  234.     while(hwnd)
  235.     {
  236.         GetClassName(hwnd, classname, 80);
  237.         if(_stricmp(classname, "ReBarWindow32") == 0)
  238.             return TRUE;
  239.         hwnd = GetWindow(hwnd, GW_HWNDNEXT);
  240.     }
  241.     return FALSE;
  242. }
  243.  
  244. /*------------------------------------------------
  245. ü@Ä₧îvâEâBâôâhâEé╠âTâuâNâëâXâvâìâVü[âWââ
  246. --------------------------------------------------*/
  247. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  248. {
  249.     switch(message) // âcü[âïâ`âbâvæ╬ë₧
  250.     {
  251.         case WM_LBUTTONDOWN:
  252.         case WM_RBUTTONDOWN:
  253.         case WM_MBUTTONDOWN:
  254.         case WM_LBUTTONUP:
  255.         case WM_RBUTTONUP:
  256.         case WM_MBUTTONUP:
  257.         case WM_MOUSEMOVE:
  258.         {
  259.             MSG msg;
  260.             msg.hwnd = hwnd;
  261.             msg.message = message;
  262.             msg.wParam = wParam;
  263.             msg.lParam = lParam;
  264.             msg.time = GetMessageTime();
  265.             msg.pt.x = LOWORD(GetMessagePos());
  266.             msg.pt.y = HIWORD(GetMessagePos());
  267.             if(hwndTip)
  268.                 SendMessage(hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
  269.         }
  270.     }
  271.     
  272.     switch(message)
  273.     {
  274.         // ÉeâEâBâôâhâEé⌐éτæùéτéΩüAâTâCâYé≡ò╘é╖âüâbâZü[âW
  275.         case (WM_USER+100):
  276.             if(bNoClock) break;
  277.             return OnCalcRect(hwnd);
  278.         // âVâXâeâÇé╠É▌ÆΦé≡ö╜ëfé╖éΘ
  279.         case WM_SYSCOLORCHANGE:
  280.             CreateClockDC(hwnd); //hdcClockì∞éΦÆ╝é╡
  281.         case WM_WININICHANGE:
  282.         case WM_TIMECHANGE:
  283.         // ÉeâEâBâôâhâEé⌐éτæùéτéΩéΘ
  284.         case (WM_USER+101):
  285.         {
  286.             HDC hdc;
  287.             if(bNoClock) break;
  288.             hdc = GetDC(hwnd);
  289.             DrawClock(hwnd, hdc);
  290.             ReleaseDC(hwnd, hdc);
  291.             return 0;
  292.         }
  293.         case WM_SIZE:
  294.             CreateClockDC(hwnd); //hdcClockì∞éΦÆ╝é╡
  295.             break;
  296.         case WM_ERASEBKGND:
  297.             break;
  298.         case WM_PAINT:
  299.         {
  300.             PAINTSTRUCT ps;
  301.             HDC hdc;
  302.             if(bNoClock) break;
  303.             hdc = BeginPaint(hwnd, &ps);
  304.             DrawClock(hwnd, hdc);
  305.             EndPaint(hwnd, &ps);
  306.             return 0;
  307.         }
  308.         case WM_TIMER:
  309.             if(wParam == 1) OnTimer(hwnd);
  310.             return 0;
  311.         // â}âEâXâ_âEâô
  312.         case WM_LBUTTONDOWN:
  313.         case WM_RBUTTONDOWN:
  314.         case WM_MBUTTONDOWN:
  315.             if(nBlink)
  316.             {
  317.                 nBlink = 0; InvalidateRect(hwnd, NULL, TRUE);
  318.             }
  319.             if(message == WM_LBUTTONDOWN && bStartMenuClock &&
  320.                 hwndStart && IsWindow(hwndStart))
  321.             {
  322.                 // âXâ^ü[âgâüâjâàü[
  323.                 PostMessage(hwndStart, WM_LBUTTONDOWN, 0, 0);
  324.             }
  325.             buttondown = message;
  326.             return 0;
  327.         // â}âEâXâAâbâv
  328.         case WM_LBUTTONUP:
  329.             if(buttondown == WM_LBUTTONDOWN)
  330.                 PostMessage(hwndTClockMain, buttondown, wParam, lParam);
  331.             buttondown = 0;
  332.             return 0;
  333.         case WM_RBUTTONUP:
  334.             if(buttondown == WM_RBUTTONDOWN)
  335.                 PostMessage(hwndTClockMain, buttondown, wParam, lParam);
  336.             buttondown = 0;
  337.             break;
  338.         case WM_MBUTTONUP:
  339.             if(buttondown == WM_MBUTTONDOWN)
  340.                 PostMessage(hwndTClockMain, buttondown, wParam, lParam);
  341.             buttondown = 0;
  342.             return 0;
  343.         // â_âuâïâNâèâbâN
  344.         case WM_LBUTTONDBLCLK:
  345.             if(bStartMenuClock) return 0;
  346.         case WM_RBUTTONDBLCLK:
  347.         case WM_MBUTTONDBLCLK:
  348.             PostMessage(hwndTClockMain, message, wParam, lParam);
  349.             return 0;
  350.         case WM_CONTEXTMENU:   // ëEâNâèâbâNâüâjâàü[
  351.             if(hMenu)
  352.                 TrackPopupMenu(hMenu, TPM_LEFTALIGN, LOWORD(lParam), HIWORD(lParam),
  353.                     0, hwnd, NULL);
  354.             return 0;
  355.         case WM_NCHITTEST: // oldWndProcé╔Åêù¥é│é╣é╚éó
  356.             return DefWindowProc(hwnd, message, wParam, lParam);
  357.         // âtâ@âCâïé╠âhâìâbâv
  358.         case WM_DROPFILES:
  359.             PostMessage(hwndTClockMain, WM_DROPFILES, wParam, lParam);
  360.             return 0;
  361.         case WM_COMMAND:
  362.         {
  363.             WORD wID;
  364.             wID = LOWORD(wParam);
  365.             switch (wID)
  366.             {
  367.                 case 100: // TClocké╠╠▀█╩▀├¿
  368.                     PostMessage(hwndTClockMain, WM_USER+1, 0, 0);
  369.                     return 0;
  370.                 case 101: // TClocké╠═┘╠▀
  371.                     PostMessage(hwndTClockMain, WM_USER+5, 0, 0);
  372.                     return 0;
  373.                 case 102: // TClocké╠ÅIù╣
  374.                     EndClock();
  375.                     return 0;
  376.                 default:
  377.                     // â^âXâNâoü[é╔Åêù¥é│é╣éΘ
  378.                     PostMessage(GetParent(GetParent(hwnd)), message,
  379.                         wParam, lParam);
  380.                     return 0;
  381.             }
  382.             break;
  383.         }
  384.         case WM_NOTIFY: //âcü[âïâ`âbâvé╠âeâLâXâgò\Ī
  385.             if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT)
  386.             {
  387.                 strcpy(((LPTOOLTIPTEXT)lParam)->szText, "TClock ");
  388.                 GetDateFormat(LOCALE_USER_DEFAULT,
  389.                     DATE_LONGDATE, NULL, NULL,
  390.                     ((LPTOOLTIPTEXT)lParam)->szText + 7,
  391.                     80 - 7);
  392.                 SetWindowPos(hwndTip, HWND_TOPMOST, 0, 0, 0, 0,
  393.                     SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
  394.             }
  395.             break;
  396.         case (WM_USER+1): // RefreshTClock() é⌐éτæùéτéΩéΘ
  397.         {
  398.             BOOL b;
  399.             ReadData(hwnd);
  400.             SetStartButton(hwnd);
  401.             SetStartMenu(hwnd);
  402.             ClearStartMenuIE4();
  403.             CreateClockDC(hwnd);
  404.             if(!GetMyRegLong("DropFiles", &b)) b = FALSE;
  405.             DragAcceptFiles(hwnd, b);
  406.             InvalidateRect(hwnd, NULL, FALSE);
  407.             PostMessage(GetParent(GetParent(hwnd)), WM_SIZE,
  408.                 SIZE_RESTORED, 0);
  409.             InvalidateRect(GetParent(GetParent(hwndClock)), NULL, TRUE);
  410.             return 0;
  411.         }
  412.         case (WM_USER+2): // BlinkTClock() é⌐éτæùéτéΩéΘ
  413.         {
  414.             if(wParam) { if(nBlink == 0) nBlink = 4; }
  415.             else nBlink = 2;
  416.             return 0;
  417.         }
  418.         case WM_DESTROY:
  419.             //EndClock(); ver1.6.4é┼é╞éΦéáéªé╕ìφÅ£
  420.             break;
  421.     }
  422.     return CallWindowProc(oldWndProc, hwnd, message, wParam, lParam);
  423. }
  424.  
  425. /*------------------------------------------------
  426. ü@É▌ÆΦé╠ô╟é▌ì₧é▌é╞âfü[â^é╠Åëè·ë╗
  427. --------------------------------------------------*/
  428. void ReadData(HWND hwnd)
  429. {
  430.     char s[1024];
  431.     char fontname[1024];
  432.     int fontsize;
  433.     LONG weight, italic;
  434.     BOOL b;
  435.  
  436.     if(!GetMyRegLong("ForeColor", &colfore))
  437.         colfore = 0x80000000 | COLOR_BTNTEXT;
  438.     if(!GetMyRegLong("BackColor", &colback))
  439.         colback = 0x80000000 | COLOR_3DFACE;
  440.     
  441.     if(!GetMyRegStr("Font", fontname))
  442.         strcpy(fontname, "élér éoâSâVâbâN");
  443.     if(!GetMyRegLong("FontSize", &fontsize))
  444.         fontsize = 9;
  445.     if(!GetMyRegLong("Bold", &weight))
  446.         weight = 0;
  447.     if(weight) weight = FW_BOLD;
  448.     else weight = FW_NORMAL;
  449.     if(!GetMyRegLong("Italic", &italic))
  450.         italic = 0;
  451.     
  452.     if(hFon) DeleteObject(hFon);
  453.     hFon = CreateMyFont(fontname, fontsize, weight, italic);
  454.  
  455.     if(!GetMyRegStr("Format", format))
  456.     {
  457.         RECT rc;
  458.         strcpy(format, "yy/mm/dd ddd");
  459.         GetClientRect(GetParent(GetParent(hwndClock)), &rc);
  460.         if(rc.right > rc.bottom)
  461.             strcat(format, " ");
  462.         else
  463.             strcat(format, "\\n");
  464.         strcat(format, "hh:nn:ss");
  465.     }
  466.     
  467.     if(!GetMyRegLong("Hour12", &bHour12))
  468.         bHour12 = 0;
  469.     if(GetRegStr(HKEY_CURRENT_USER, "Control Panel\\International",
  470.         "sDate", s)) sDate = s[0];
  471.     else sDate = '/';
  472.     if(GetRegStr(HKEY_CURRENT_USER, "Control Panel\\International",
  473.         "sTime", s)) sTime = s[0];
  474.     else sTime = ':';
  475.     
  476.     if(GetRegStr(HKEY_CURRENT_USER, "Control Panel\\International",
  477.         "s1159", s)) { strncpy(sAM, s, 10); sAM[10] = 0; }
  478.     else strcpy(sAM, "î▀æO");
  479.     if(GetRegStr(HKEY_CURRENT_USER, "Control Panel\\International",
  480.         "s2359", s)) { strncpy(sPM, s, 10); sPM[10] = 0; }
  481.     else strcpy(sPM, "î▀îπ");
  482.     
  483.     if(!GetMyRegLong("NoClock", &bNoClock))
  484.         bNoClock = FALSE;
  485.  
  486.     if(!GetMyRegLong("StartButtonHide", &bStartMenuClock))
  487.         bStartMenuClock = FALSE;
  488.     if(bStartMenuClock &&
  489.         !GetMyRegLong("StartMenuClock", &bStartMenuClock))
  490.         bStartMenuClock = FALSE;
  491. }
  492.  
  493. /*------------------------------------------------
  494. ü@ëEâNâèâbâNÄ₧é╠â|âbâvâAâbâvâüâjâàü[é╠ì∞ɼ
  495. --------------------------------------------------*/
  496. HMENU CreateClockMenu(void)
  497. {
  498.     HMENU hm;
  499.  
  500.     hm = CreatePopupMenu();
  501.  
  502.     AppendMenu(hm, MF_STRING, 408, "ô·òté╞Ä₧ìÅé╠Æ▓É«(&A)");
  503.     AppendMenu(hm, MF_STRING, 403, "Ådé╦é─ò\Ī(&C)");
  504.     AppendMenu(hm, MF_STRING, 404, "Åπë║é╔ò└é╫é─ò\Ī(&H)");
  505.     AppendMenu(hm, MF_STRING, 405, "ì╢ëEé╔ò└é╫é─ò\Ī(&V)");
  506.     AppendMenu(hm, MF_SEPARATOR, 0, 0);
  507.     AppendMenu(hm, MF_STRING, 415, "æS│¿▌─▐│é≡ì┼żë╗(&M)");
  508.     AppendMenu(hm, MF_SEPARATOR, 0, 0);
  509.     if(!(GetVersion() & 0x80000000))
  510.     {
  511.         AppendMenu(hm, MF_STRING, 420, "└╜╕ ╧╚░╝▐¼(&T)...");
  512.         AppendMenu(hm, MF_SEPARATOR, 0, 0);
  513.     }
  514.     AppendMenu(hm, MF_STRING, 413, "└╜╕╩▐░é╠╠▀█╩▀├¿(&R)");
  515.     AppendMenu(hm, MF_SEPARATOR, 0, 0);
  516.     AppendMenu(hm, MF_STRING, 100, "TClocké╠╠▀█╩▀├¿(&K)");
  517.     AppendMenu(hm, MF_STRING, 101, "TClocké╠═┘╠▀(&L)");
  518.     AppendMenu(hm, MF_STRING, 102, "TClocké╠ÅIù╣(&X)");
  519.     SetMenuDefaultItem(hm, 408, FALSE);
  520.     return hm;
  521. }
  522.  
  523. /*------------------------------------------------
  524. ü@âcü[âïâ`âbâvâEâBâôâhâEé╠ì∞ɼ
  525. --------------------------------------------------*/
  526. void CreateTip(HWND hwnd)
  527. {
  528.     TOOLINFO ti;
  529.  
  530.     hwndTip = CreateWindow(TOOLTIPS_CLASS, (LPSTR)NULL,
  531.         TTS_ALWAYSTIP,
  532.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  533.         NULL, NULL, hmod, NULL); 
  534.     if(!hwndTip) return;
  535.  
  536.     ti.cbSize = sizeof(TOOLINFO); 
  537.     ti.uFlags = 0;
  538.     ti.hwnd = hwnd;
  539.     ti.hinst = 0;
  540.     ti.uId = 1;
  541.     ti.lpszText = LPSTR_TEXTCALLBACK;
  542.     ti.rect.left = 0;
  543.     ti.rect.top = 0;
  544.     ti.rect.right = 480; 
  545.     ti.rect.bottom = 480;
  546.     
  547.     SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO)&ti);
  548.     SendMessage(hwndTip, TTM_ACTIVATE, TRUE, 0);
  549. }
  550.  
  551. /*------------------------------------------------
  552. ü@ò`ëµùpâüâéâèDCé╠ì∞ɼ
  553. --------------------------------------------------*/
  554. void CreateClockDC(HWND hwnd)
  555. {
  556.     RECT rc;
  557.     COLORREF col;
  558.     HDC hdc;
  559.     
  560.     if(hdcClock) DeleteDC(hdcClock); hdcClock = NULL;
  561.     if(hbmpClock) DeleteObject(hbmpClock); hbmpClock = NULL;
  562.     
  563.     if(bNoClock) return;
  564.  
  565.     GetClientRect(hwnd, &rc);
  566.     
  567.     hdc = GetDC(NULL);
  568.     
  569.     hdcClock = CreateCompatibleDC(hdc);
  570.     if(!hdcClock) return;
  571.     hbmpClock = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
  572.     if(!hbmpClock) return;
  573.     SelectObject(hdcClock, hbmpClock);
  574.     
  575.     SelectObject(hdcClock, hFon);
  576.     SetBkMode(hdcClock, TRANSPARENT);
  577.     SetTextAlign(hdcClock, TA_CENTER|TA_TOP);
  578.     col = colfore;
  579.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  580.     SetTextColor(hdcClock, col);
  581.     
  582.     ReleaseDC(NULL, hdc);
  583. }
  584.  
  585. /*------------------------------------------------
  586. ü@WM_TIMER é╠Åêù¥
  587. --------------------------------------------------*/
  588. void OnTimer(HWND hwnd)
  589. {
  590.     SYSTEMTIME t;
  591.     HDC hdc;
  592.  
  593.     GetLocalTime(&t);
  594.     if(bNoClock) hdc = NULL;
  595.     else if(!IsDispSecond(format) && // òbò\Īé╚é╡é╠é╞é½
  596.         nBlink == 0 &&
  597.         hourLast == (int)t.wHour && minuteLast == (int)t.wMinute)
  598.          hdc = NULL;
  599.     else hdc = GetDC(hwnd);
  600.     
  601.     // TClockâEâBâôâhâEé╔âAâëü[âÇÅêù¥é│é╣éΘ
  602.     if(hourLast != (int)t.wHour || minuteLast != (int)t.wMinute)
  603.         PostMessage(hwndTClockMain, WM_USER+4,
  604.             t.wMinute, MAKELONG(t.wHour, t.wDay));
  605.     
  606.     hourLast = t.wHour;
  607.     minuteLast = t.wMinute;
  608.     
  609.     if(nBlink >= 3 && t.wMinute == 1) nBlink = 0;
  610.     
  611.     if(hdc)
  612.     {
  613.         DrawClockSub(hwnd, hdc, &t); //ò`ëµ
  614.         ReleaseDC(hwnd, hdc);
  615.     }
  616.     
  617.     if(nBlink)
  618.     {
  619.         if(nBlink % 2) nBlink++;
  620.         else nBlink--;
  621.     }
  622. }
  623.  
  624. /*------------------------------------------------
  625. ü@Ä₧îvé╠ò`ëµ
  626. --------------------------------------------------*/
  627. void DrawClock(HWND hwnd, HDC hdc)
  628. {
  629.     SYSTEMTIME t;
  630.     GetLocalTime(&t);
  631.     DrawClockSub(hwnd, hdc, &t);
  632. }
  633. void DrawClockSub(HWND hwnd, HDC hdc, SYSTEMTIME* pt)
  634. {
  635.     COLORREF col;
  636.     HBRUSH hbr;
  637.     RECT rc;
  638.     TEXTMETRIC tm;
  639.     int hf, y;
  640.     char s[1024], *p, *sp;
  641.     
  642.     if(!hdcClock) CreateClockDC(hwnd);
  643.     
  644.     if(!hdcClock || !hbmpClock) return;
  645.     
  646.     MakeFormat(s, pt, format);
  647.     
  648.     GetClientRect(hwnd, &rc);
  649.     GetTextMetrics(hdcClock, &tm);
  650.     
  651.     if(nBlink == 0 || (nBlink % 2)) col = colfore;
  652.     else col = colback;
  653.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  654.     SetTextColor(hdcClock, col);
  655.     
  656.     if(nBlink == 0 || (nBlink % 2)) col = colback;
  657.     else col = colfore;
  658.     if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff);
  659.     hbr = CreateSolidBrush(col);
  660.     FillRect(hdcClock, &rc, hbr);
  661.     DeleteObject(hbr);
  662.     
  663.     hf = tm.tmHeight - tm.tmInternalLeading;
  664.     p = s;
  665.     y = hf / 4 - tm.tmInternalLeading / 2;
  666.     while(*p)
  667.     {
  668.         sp = p;
  669.         while(*p && *p != 0x0d) p++;
  670.         if(*p == 0x0d) { *p = 0; p += 2; }
  671.         if(*p == 0 && sp == s)
  672.             y = (rc.bottom - tm.tmHeight) / 2  - tm.tmInternalLeading / 4;
  673.         TextOut(hdcClock, rc.right/2, y, sp, strlen(sp));
  674.         y += hf; if(*p) y += 2;
  675.     }
  676.     BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcClock, 0, 0, SRCCOPY);
  677. }
  678.  
  679. /*------------------------------------------------
  680. ü@Ä₧îvé╔òKùvé╚âTâCâYé≡ò╘é╖
  681. ü@û▀éΦÆlüFÅπê╩WORD ìéé│ü@ë║ê╩WORD ò¥
  682. --------------------------------------------------*/
  683. LRESULT OnCalcRect(HWND hwnd)
  684. {
  685.     SYSTEMTIME t;
  686.     LRESULT w, h;
  687.     HDC hdc;
  688.     TEXTMETRIC tm;
  689.     char s[1024], *p, *sp;
  690.     SIZE sz;
  691.     int hf;
  692.  
  693.     if(!IsWindowVisible(hwnd)) return 0;
  694.     
  695.     hdc = GetDC(hwnd);
  696.     
  697.     if(hFon) SelectObject(hdc, hFon);
  698.     GetTextMetrics(hdc, &tm);
  699.     
  700.     t.wYear = 1996; t.wMonth = 12; t.wDay = 31;
  701.     t.wDayOfWeek = 1; t.wHour = 11; t.wMinute = 30;
  702.     t.wSecond = 30; t.wMilliseconds = 0;
  703.     MakeFormat(s, &t, format);
  704.     
  705.     p = s; w = 0; h = 0;
  706.     hf = tm.tmHeight - tm.tmInternalLeading;
  707.     while(*p)
  708.     {
  709.         sp = p;
  710.         while(*p && *p != 0x0d) p++;
  711.         if(*p == 0x0d) { *p = 0; p += 2; }
  712.         GetTextExtentPoint32(hdc, sp, strlen(sp), &sz);
  713.         if(w < sz.cx) w = sz.cx;
  714.         h += hf; if(*p) h += 2;
  715.     }
  716.     w += tm.tmAveCharWidth * 2;
  717.     h += hf / 2;
  718.     
  719.     ReleaseDC(hwnd, hdc);
  720.     
  721.     return (h << 16) + w;
  722. }
  723.