home *** CD-ROM | disk | FTP | other *** search
/ CD Loisirs 18 / cd.iso / PLANETE / MUDWIN / SOURCE.ZIP / ABOUT.C next >
C/C++ Source or Header  |  1994-10-01  |  12KB  |  464 lines

  1. //
  2. //  MODULE    About.c
  3. //
  4. //  PURPOSE    Displays the "About" box
  5. //
  6. //  EXPORTS    AboutDialog
  7. //
  8.  
  9. #include "defcon.h"
  10. #include "global.h"
  11. #pragma hdrstop
  12. #include <ver.h>
  13. #include <string.h>
  14.  
  15. /* note when we were last compiled */
  16. TS(About)
  17.  
  18. short FAR CDECL MsgBox2(WORD, LPCSTR,...);
  19.  
  20. /* local info for marquee animation */
  21. static BOOL    fAnimate;
  22.  
  23. static BITMAP bm;
  24. static RECT    rCredits, rScroll;
  25. static HBITMAP    hbmpScroll, hbmpCredits;
  26.  
  27. static HRSRC    hResource;
  28. static HGLOBAL    hDedicate;
  29. static LPSTR    lpszDedicate, lpszMsg;
  30. static int    nScan = 0;
  31.  
  32. static BOOL Marquee_Create(HWND, LPCSTR);
  33. static VOID Marquee_Destroy(VOID);
  34. static VOID Marquee_Paint(HDC);
  35. static VOID Marquee_Animate(HWND);
  36.  
  37. BOOL
  38. Marquee_Create(HWND hwnd, LPCSTR lpszRsrc)
  39. {
  40.     HDC    hdc = GetDC(hwnd);
  41.     HDC    hdcMem = CreateCompatibleDC(hdc);
  42.     HWND    h;
  43.  
  44.         /* fetch the picture of myself */
  45.     hbmpCredits = LoadBitmap(hInst, lpszRsrc);
  46.     if (!hbmpCredits) return FALSE;
  47.     GetObject(hbmpCredits, sizeof(BITMAP), &bm);
  48.  
  49.         /* figure out where the picture frame goes */
  50.     h = GetDlgItem(hwnd, IDD_ABOUT_COMPANY);
  51.     GetClientRect(h, &rCredits);
  52.     rCredits.bottom = bm.bmHeight;
  53.     MapWindowPoints(h, hwnd, (POINT FAR *) &rCredits, 2);
  54.  
  55.         /* figure out where the text goes */
  56.     rScroll.left   = rCredits.left + bm.bmWidth - CREDIT_BORDER;
  57.     rScroll.top    = rCredits.top + CREDIT_BORDER;
  58.     rScroll.right  = rCredits.right - CREDIT_BORDER;
  59.     rScroll.bottom = rCredits.bottom - CREDIT_BORDER;
  60.  
  61.         /* create a (monochrome) place to draw */
  62.     hdcMem = CreateCompatibleDC(hdc);
  63.     hbmpScroll = CreateCompatibleBitmap(hdcMem,
  64.             rScroll.right - rScroll.left,
  65.             rScroll.bottom - rScroll.top);
  66.     DeleteDC(hdcMem);
  67.     if (!hbmpScroll) {
  68.         Marquee_Destroy();
  69.         return FALSE;
  70.         }
  71.  
  72.         /* now get the words */
  73.     hResource = FindResource(hInst, lpszRsrc, RT_RCDATA);
  74.     hDedicate = LoadResource(hInst, hResource);
  75.     lpszDedicate = (LPSTR)LockResource(hDedicate);
  76.     if (!lpszDedicate) {
  77.         Marquee_Destroy();
  78.         return FALSE;
  79.         }
  80.  
  81.     /* hide existing comments */
  82.     ShowWindow(GetDlgItem(hwnd, IDD_ABOUT_COMPANY), SW_HIDE);
  83.     ShowWindow(GetDlgItem(hwnd, IDD_ABOUT_PRODUCT), SW_HIDE);
  84.     ShowWindow(GetDlgItem(hwnd, IDD_ABOUT_VERSION), SW_HIDE);
  85.     ShowWindow(GetDlgItem(hwnd, IDD_ABOUT_COPYRITE), SW_HIDE);
  86.         Marquee_Paint(hdc);
  87.  
  88.     /* where are we in the animation loop */
  89.     lpszMsg = lpszDedicate;
  90.     nScan = 0;
  91.  
  92.     fAnimate = TRUE;
  93.     SetTimer(hwnd, 0, 111, NULL);
  94.     ReleaseDC(hwnd, hdc);
  95.         return TRUE;
  96. }
  97.  
  98. VOID
  99. Marquee_Destroy(VOID)
  100. {
  101.     fAnimate = FALSE;
  102.     if (hbmpScroll) {
  103.         DeleteObject(hbmpScroll);
  104.         hbmpScroll = 0;
  105.     }
  106.     if (hbmpCredits) {
  107.         DeleteObject(hbmpCredits);
  108.         hbmpCredits = 0;
  109.     }
  110.     if (hDedicate) {
  111.         UnlockResource(hDedicate);
  112.         hDedicate = 0;
  113.     }
  114.     if (hResource) {
  115.         FreeResource(hResource);
  116.         hResource = 0;
  117.     }
  118. }
  119.  
  120. VOID
  121. Marquee_Paint(HDC hdc)
  122. {
  123.     HDC    hdcMem = CreateCompatibleDC(hdc);
  124.     RECT    r;
  125.     HBRUSH    hbr, hbrOld;
  126.     HBITMAP    hbmpOld;
  127.  
  128.     hbmpOld = SelectObject(hdcMem, hbmpCredits);
  129.  
  130.     BitBlt(hdc, rCredits.left, rCredits.top,
  131.         bm.bmWidth-CREDIT_BORDER, bm.bmHeight,
  132.         hdcMem, 0, 0, SRCCOPY);
  133.     BitBlt(hdc, rCredits.right-CREDIT_BORDER, rCredits.top,
  134.         CREDIT_BORDER, bm.bmHeight,
  135.         hdcMem, bm.bmWidth-CREDIT_BORDER, 0, SRCCOPY);
  136.  
  137.     /* establish common width */
  138.     r.left   = rScroll.left;
  139.     r.right  = rScroll.right;
  140.  
  141.     /* draw black lines at top and bottom of the frame */
  142.     hbr = CreateSolidBrush(RGB(0,0,0));
  143.     hbrOld = SelectObject(hdc, hbr);
  144.     r.top    = rCredits.top;
  145.     r.bottom = rCredits.top + 1;
  146.     FillRect(hdc, &r, hbr);
  147.     r.top    = rCredits.bottom - 1;
  148.     r.bottom = rCredits.bottom;
  149.     FillRect(hdc, &r, hbr);
  150.  
  151.     /* upper part of frame is in shadow */
  152.     hbr = CreateSolidBrush(CREDIT_SHADOW);
  153.     DeleteObject(SelectObject(hdc, hbr));
  154.     r.top    = rCredits.top + 1;
  155.     r.bottom = rCredits.top + CREDIT_BORDER;
  156.     FillRect(hdc, &r, hbr);
  157.  
  158.     /* lower part of frame is illuminated */
  159.     hbr = CreateSolidBrush(CREDIT_HIGHLIGHT);
  160.     DeleteObject(SelectObject(hdc, hbr));
  161.     r.top    = rCredits.bottom - CREDIT_BORDER;
  162.     r.bottom = rCredits.bottom - 1;
  163.     FillRect(hdc, &r, hbr);
  164.  
  165.     /* scrollable region starts off as blank background */
  166.     hbr = CreateSolidBrush(CREDIT_BACKGROUND);
  167.     DeleteObject(SelectObject(hdc, hbr));
  168.     FillRect(hdc, &rScroll, hbr);
  169.  
  170.     DeleteObject(SelectObject(hdc, hbrOld));
  171.     DeleteObject(SelectObject(hdcMem, hbmpOld));
  172.     DeleteDC(hdcMem);
  173. }
  174.  
  175. VOID
  176. Marquee_Animate(HWND hwnd)
  177. {
  178.     HDC    hdc, hdcMem;
  179.         RECT    r;
  180.     int    len;
  181.         static int nMaxScan;
  182.  
  183.         if (!fAnimate) return;
  184.     hdc = GetDC(hwnd);
  185.     hdcMem = CreateCompatibleDC(hdc);
  186.     SelectObject(hdcMem, hbmpScroll);
  187.     SelectObject(hdcMem, GetStockObject(ANSI_VAR_FONT));
  188.     SetRect(&r, 0, 0,
  189.         rScroll.right - rScroll.left,
  190.         rScroll.bottom - rScroll.top);
  191.  
  192.     BitBlt(hdc, rScroll.left, rScroll.top, r.right, r.bottom - 1,
  193.         hdc, rScroll.left, rScroll.top + 1, SRCCOPY);
  194.  
  195.     len = _fstrcspn(lpszMsg, "\r\n");
  196.  
  197.     if (nScan == 0) {
  198.         int x;
  199.         DWORD    dw;
  200.  
  201.         dw = GetTextExtent(hdcMem, lpszMsg, len);
  202.         nMaxScan = HIWORD(dw);
  203.         if (*lpszMsg == '\\') {
  204.             lpszMsg++;
  205.                         len -= 2;
  206.                     switch (*lpszMsg++) {
  207.             case 'l':
  208.                         case 'L':
  209.                                 x = 0;
  210.                             break;
  211.             case 'r':
  212.             case 'R':
  213.                 x = r.right - LOWORD(dw);
  214.                             break;
  215.             default:
  216.                 goto center;
  217.             }
  218.                 } else {
  219. center:
  220.             x = (r.right - LOWORD(dw)) / 2;
  221.         }
  222.         ExtTextOut(hdcMem, x, 0, ETO_OPAQUE, &r,
  223.             lpszMsg, len, NULL);
  224.     }
  225.  
  226.     SetBkColor(hdc, CREDIT_BACKGROUND);
  227.     BitBlt(hdc, rScroll.left, rScroll.bottom - 1, r.right, 1,
  228.         hdcMem, 0, nScan, SRCCOPY);
  229.  
  230.     if (++nScan >= nMaxScan) {
  231.         nScan = 0;
  232.         lpszMsg += len + 2;
  233.         if (*lpszMsg == 26) lpszMsg = lpszDedicate;
  234.     }
  235.  
  236.     DeleteDC(hdcMem);
  237.     ReleaseDC(hwnd, hdc);
  238. }
  239.  
  240. //  FUNCTION    About_OnCommand
  241. //
  242. //  PURPOSE    Handles WM_COMMAND messages sent to the window
  243. //
  244. //  PARAMETERS    hwnd - Window handle
  245. //        id - Identifies the menu/control/accelerator
  246. //        hwndCtl - Identifies the control sending the command
  247. //        codeNotify - Zero if from menu, one if from accelerator
  248. //
  249. //  RETURNS    Nothing
  250.  
  251. #pragma argsused
  252. VOID 
  253. About_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  254. {
  255.     if ((id == IDOK) || (id == IDCANCEL)) {
  256. #ifdef ABOUT_IS_MODAL
  257.         EndDialog(hwnd, TRUE);
  258. #else 
  259.         DestroyWindow(hwnd);
  260. #endif
  261.     }
  262. }
  263.  
  264. //  FUNCTION    About_OnDestroy
  265. //
  266. //  PURPOSE    Handles WM_DESTROY messages sent to the window
  267. //
  268. //  PARAMETERS    hwnd - Window handle
  269. //        id - Identifies the menu/control/accelerator
  270. //        hwndCtl - Identifies the control sending the command
  271. //        codeNotify - Zero if from menu, one if from accelerator
  272. //
  273. //  RETURNS    Nothing
  274.  
  275. #pragma argsused
  276. VOID 
  277. About_OnDestroy(HWND hwnd)
  278. {
  279.     hAbout = 0;
  280.     Marquee_Destroy();
  281. }
  282.  
  283. //  FUNCTION    About_OnInitDialog
  284. //
  285. //  PURPOSE    Handles WM_... messages sent to the window
  286. //
  287. //  PARAMETERS    hwnd - Window handle
  288. //        hwndFocus - Handle of control to receive focus
  289. //        lParam - Initalization data
  290. //
  291. //  RETURNS    TRUE if Windows should set focus to default,
  292. //        FALSE if we issued SetFocus outselves
  293.  
  294. #pragma argsused
  295. BOOL 
  296. About_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
  297. {
  298.     static   void FAR *lpData;
  299.     static   HGLOBAL hg;
  300.     char     szName[512], *cp;
  301.     UINT     uLen;
  302.     VOID FAR *lpXlate;
  303.     VOID FAR *lpBuffer;
  304.  
  305.     if (!lpData) {
  306.         //DWORD dwHandle, dwSize;
  307.         //GetModuleFileName(hInst, szName, sizeof szName);
  308.         //dwSize = GetFileVersionInfoSize(szName, &dwHandle);
  309.         //lpData = GlobalAllocPtr(0, dwSize);
  310.         //GetFileVersionInfo(szName, dwHandle, dwSize, lpData);
  311.         hg = LoadResource(hInst,
  312.             FindResource(hInst, (LPCSTR)1L, (LPCSTR)16L) );
  313.         lpData = LockResource(hg);
  314.     }
  315.     VerQueryValue(lpData, "\\VarFileInfo\\Translation", &lpXlate, &uLen);
  316.     if (uLen != 0) {
  317.         wsprintf(szName, "\\StringFileInfo\\%04x%04x\\",
  318.              *(WORD FAR *) lpXlate, *((WORD FAR *) lpXlate + 1));
  319.         cp = strchr(szName, 0);
  320.  
  321.         strcpy(cp, "CompanyName");
  322.         VerQueryValue(lpData, szName, &lpBuffer, &uLen);
  323.         SetDlgItemText(hwnd