Annotation of pmsdk/samples/petzold/chap10/digclock.c, revision 1.1

1.1     ! root        1: /*-----------------------------
        !             2:    DIGCLOCK.C -- Digital Clock 
        !             3:   -----------------------------*/
        !             4: 
        !             5: #define INCL_WIN
        !             6: #define INCL_GPI
        !             7: #define INCL_DOS
        !             8: #include <os2.h>
        !             9: #include <stdio.h>
        !            10: 
        !            11: #define ID_TIMER 1
        !            12: 
        !            13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
        !            14: VOID    SizeTheWindow (HWND) ;
        !            15: 
        !            16: int main (void)
        !            17:      {
        !            18:      static CHAR  szClientClass[] = "DigClock" ;
        !            19:      static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU  |
        !            20:                                  FCF_BORDER   | FCF_TASKLIST ;
        !            21:      HAB          hab ;
        !            22:      HMQ          hmq ;
        !            23:      HWND         hwndFrame, hwndClient ;
        !            24:      QMSG         qmsg ;
        !            25: 
        !            26:      hab = WinInitialize (0) ;
        !            27:      hmq = WinCreateMsgQueue (hab, 0) ;
        !            28: 
        !            29:      WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
        !            30: 
        !            31:      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
        !            32:                                      &flFrameFlags, szClientClass, NULL,
        !            33:                                     0L, NULL, 0, &hwndClient) ;
        !            34:      SizeTheWindow (hwndFrame) ;
        !            35: 
        !            36:      if (WinStartTimer (hab, hwndClient, ID_TIMER, 1000))
        !            37:           {
        !            38:           while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
        !            39:                WinDispatchMsg (hab, &qmsg) ;
        !            40: 
        !            41:           WinStopTimer (hab, hwndClient, ID_TIMER) ;
        !            42:           }
        !            43:      else
        !            44:           WinMessageBox (HWND_DESKTOP, hwndClient,
        !            45:                          "Too many clocks or timers",
        !            46:                          szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
        !            47: 
        !            48:      WinDestroyWindow (hwndFrame) ;
        !            49:      WinDestroyMsgQueue (hmq) ;
        !            50:      WinTerminate (hab) ;
        !            51:      return 0 ;
        !            52:      }
        !            53: 
        !            54: VOID SizeTheWindow (HWND hwndFrame)
        !            55:      {
        !            56:      FONTMETRICS fm ;
        !            57:      HPS         hps ;
        !            58:      RECTL       rcl ;
        !            59: 
        !            60:      hps = WinGetPS (hwndFrame) ;
        !            61:      GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
        !            62:      WinReleasePS (hps) ;
        !            63: 
        !            64:      rcl.yBottom = 0 ;
        !            65:      rcl.yTop    = 11 * fm.lMaxBaselineExt / 4 ;
        !            66:      rcl.xRight  = WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) ;
        !            67:      rcl.xLeft   = rcl.xRight - 16 * fm.lEmInc ;
        !            68: 
        !            69:      WinCalcFrameRect (hwndFrame, &rcl, FALSE) ;
        !            70: 
        !            71:      WinSetWindowPos (hwndFrame, NULL, (SHORT) rcl.xLeft, (SHORT) rcl.yBottom,
        !            72:                       (SHORT) (rcl.xRight - rcl.xLeft),
        !            73:                       (SHORT) (rcl.yTop - rcl.yBottom), SWP_SIZE | SWP_MOVE) ;
        !            74:      }
        !            75: 
        !            76: VOID UpdateTime (HWND hwnd, HPS hps)
        !            77:      {
        !            78:      static BOOL        fHaveCtryInfo = FALSE ;
        !            79:      static CHAR        *szDayName [] = { "Sun", "Mon", "Tue", "Wed",
        !            80:                                           "Thu", "Fri", "Sat" } ;
        !            81:      static CHAR        szDateFormat [] = " %s  %d%s%02d%s%02d " ;
        !            82:      static COUNTRYCODE ctryc = { 0, 0 } ;
        !            83:      static COUNTRYINFO ctryi ;
        !            84:      CHAR               szBuffer [20] ;
        !            85:      DATETIME           dt ;
        !            86:      RECTL              rcl ;
        !            87:      USHORT             usDataLength ;
        !            88: 
        !            89:                /*----------------------------------------
        !            90:                   Get Country Information, Date and Time
        !            91:                  ----------------------------------------*/
        !            92: 
        !            93:      if (!fHaveCtryInfo)
        !            94:           {
        !            95:           DosGetCtryInfo (sizeof ctryi, &ctryc, &ctryi, &usDataLength) ;
        !            96:           fHaveCtryInfo = TRUE ;
        !            97:           }
        !            98:      DosGetDateTime (&dt) ;
        !            99:      dt.year %= 100 ;
        !           100: 
        !           101:                /*------------- 
        !           102:                   Format Date
        !           103:                  -------------*/
        !           104:                                    /*-----------------
        !           105:                                       mm/dd/yy format
        !           106:                                      -----------------*/
        !           107:      if (ctryi.fsDateFmt == 0)
        !           108: 
        !           109:           sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
        !           110:                              dt.month, ctryi.szDateSeparator,
        !           111:                              dt.day,   ctryi.szDateSeparator, dt.year) ;
        !           112: 
        !           113:                                    /*-----------------
        !           114:                                       dd/mm/yy format
        !           115:                                      -----------------*/
        !           116:      else if (ctryi.fsDateFmt == 1)
        !           117: 
        !           118:           sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
        !           119:                              dt.day,   ctryi.szDateSeparator,
        !           120:                              dt.month, ctryi.szDateSeparator, dt.year) ;
        !           121: 
        !           122:                                    /*-----------------
        !           123:                                       yy/mm/dd format
        !           124:                                      -----------------*/
        !           125:      else
        !           126:           sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
        !           127:                              dt.year,  ctryi.szDateSeparator,
        !           128:                              dt.month, ctryi.szDateSeparator, dt.day) ;
        !           129: 
        !           130:                /*-------------- 
        !           131:                   Display Date
        !           132:                  --------------*/
        !           133: 
        !           134:      WinQueryWindowRect (hwnd, &rcl) ;
        !           135:      rcl.yBottom += 5 * rcl.yTop / 11 ;
        !           136:      WinDrawText (hps, -1, szBuffer, &rcl, CLR_NEUTRAL, CLR_BACKGROUND,
        !           137:                   DT_CENTER | DT_VCENTER) ;
        !           138: 
        !           139:                /*------------- 
        !           140:                   Format Time
        !           141:                  -------------*/
        !           142:                                    /*----------------
        !           143:                                       12-hour format
        !           144:                                      ----------------*/
        !           145:      if ((ctryi.fsTimeFmt & 1) == 0)
        !           146: 
        !           147:           sprintf (szBuffer, " %d%s%02d%s%02d %cm ",
        !           148:                              (dt.hours + 11) % 12 + 1, ctryi.szTimeSeparator,
        !           149:                              dt.minutes, ctryi.szTimeSeparator,
        !           150:                              dt.seconds, dt.hours / 12 ? 'p' : 'a') ;
        !           151: 
        !           152:                                    /*----------------
        !           153:                                       24-hour format
        !           154:                                      ----------------*/
        !           155:      else
        !           156:           sprintf (szBuffer, " %02d%s%02d%s%02d ",
        !           157:                              dt.hours,   ctryi.szTimeSeparator,
        !           158:                              dt.minutes, ctryi.szTimeSeparator, dt.seconds) ;
        !           159: 
        !           160:                /*-------------- 
        !           161:                   Display Time
        !           162:                  --------------*/
        !           163: 
        !           164:      WinQueryWindowRect (hwnd, &rcl) ;
        !           165:      rcl.yTop -= 5 * rcl.yTop / 11 ;
        !           166:      WinDrawText (hps, -1, szBuffer, &rcl, CLR_NEUTRAL, CLR_BACKGROUND,
        !           167:                   DT_CENTER | DT_VCENTER) ;
        !           168:      }
        !           169: 
        !           170: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
        !           171:      {
        !           172:      HPS  hps;
        !           173: 
        !           174:      switch (msg)
        !           175:           {
        !           176:           case WM_TIMER:
        !           177:                hps = WinGetPS (hwnd) ;
        !           178:                GpiSetBackMix (hps, BM_OVERPAINT) ;
        !           179: 
        !           180:                UpdateTime (hwnd, hps) ;
        !           181: 
        !           182:                WinReleasePS (hps) ;
        !           183:                return 0 ;
        !           184: 
        !           185:           case WM_PAINT:
        !           186:                hps = WinBeginPaint (hwnd, NULL, NULL) ;
        !           187:                GpiErase (hps) ;
        !           188: 
        !           189:                UpdateTime (hwnd, hps) ;
        !           190: 
        !           191:                WinEndPaint (hps) ;
        !           192:                return 0 ;
        !           193:           }
        !           194:      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
        !           195:      }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.