Annotation of pmsdk/samples/clock/wndproc.c, revision 1.1.1.1

1.1       root        1: /*
                      2:     wndproc.c -- Window Procedure for Clock Client Window
                      3:     Created by Microsoft Corporation, 1989
                      4: */
                      5: #define INCL_WIN
                      6: #define INCL_GPI
                      7: #include <os2.h>
                      8: #include "clock.h"
                      9: #include "res.h"
                     10: 
                     11: MRESULT CALLBACK ClkAboutDlgProc ( HWND , USHORT , MPARAM , MPARAM ) ;
                     12: MRESULT CALLBACK ClkTicksDlgProc ( HWND , USHORT , MPARAM , MPARAM ) ;
                     13: MRESULT CALLBACK ClkColorsDlgProc ( HWND , USHORT , MPARAM , MPARAM ) ;
                     14: 
                     15: extern HAB hab ;
                     16: extern HWND hwndFrame ;
                     17: extern BOOL fStartAsIcon ;
                     18: extern VOID ClkDrawFace( HPS );
                     19: extern VOID ClkDrawHand( HPS, SHORT, SHORT );
                     20: 
                     21: VOID ClkPaint ( HWND ) ;
                     22: VOID ClkCreate ( HWND ) ;
                     23: VOID ClkSize ( HWND ) ;
                     24: VOID ClkTimer ( VOID ) ;
                     25: VOID ClkCommand ( HWND , MPARAM ) ;
                     26: 
                     27: VOID ClkHideFrameControls ( HWND ) ;
                     28: VOID ClkShowFrameControls ( HWND ) ;
                     29: 
                     30: SWP swp ;
                     31: HPS hps ;
                     32: HDC hdc ;
                     33: RECTL rclPage ;
                     34: DATETIME dt ;
                     35: BOOL f ;
                     36: BOOL fIconic , fShowSecondHand ;
                     37: BOOL fControlsHidden = FALSE ;
                     38: SIZEL sizl = { 200 , 200 } ;
                     39: ULONG cxRes , cyRes ;
                     40: 
                     41: HWND hwndTitleBar , hwndSysMenu , hwndMinMax , hwndMenu ;
                     42: 
                     43: 
                     44: /*
                     45:     ClkWndProc() -- Window Procedure for Clock Client Window
                     46:     Returns:  MRESULT (Message Result)
                     47: */
                     48: MRESULT CALLBACK ClkWndProc ( HWND hwnd , USHORT usMsg ,
                     49:                                MPARAM mp1 , MPARAM mp2 )
                     50: {
                     51: 
                     52:     switch ( usMsg ) {
                     53: 
                     54:        case WM_TIMER :
                     55:            ClkTimer ( ) ;
                     56:            return NULL ;
                     57: 
                     58:        case WM_PAINT :
                     59:            ClkPaint ( hwnd ) ;
                     60:            return NULL ;
                     61: 
                     62:         case WM_SIZE :
                     63:            ClkSize ( hwnd ) ;
                     64:            return NULL ;
                     65: 
                     66:        case WM_COMMAND :
                     67:            ClkCommand ( hwnd , mp1 ) ;
                     68:            return NULL ;
                     69: 
                     70:        case WM_BUTTON1DOWN :
                     71:            return WinSendMsg ( hwndFrame , WM_TRACKFRAME ,
                     72:                    ( MPARAM ) ( LOUSHORT ( mp2 ) | TF_MOVE ) , NULL ) ;
                     73: 
                     74:        case WM_CHAR:
                     75:            if ( fControlsHidden )
                     76:                ClkShowFrameControls ( hwndFrame ) ;
                     77:            return NULL ;
                     78: 
                     79:        case WM_BUTTON1DBLCLK :
                     80:            if ( fControlsHidden )
                     81:                ClkShowFrameControls ( hwndFrame ) ;
                     82:            else
                     83:                ClkHideFrameControls ( hwndFrame ) ;
                     84:            return NULL ;
                     85: 
                     86:        case WM_CREATE :
                     87:            ClkCreate ( hwnd ) ;
                     88:            return NULL ;
                     89: 
                     90:        default :
                     91:            /* let default window procedure handle it. */
                     92:            return ( WinDefWindowProc ( hwnd , usMsg , mp1 , mp2 ) ) ;
                     93:     }
                     94: }
                     95: 
                     96: 
                     97: /*
                     98:     ClkCreate() -- Initialize newly created client window
                     99: */
                    100: VOID ClkCreate ( HWND hwnd )
                    101: {
                    102:     LONG cxScreen , cyScreen ; /* screen dimensions */
                    103:     LONG xLeft , yBottom ;     /* frame window location */
                    104:     LONG cxWidth , cyHeight ;  /* frame window size */
                    105:     HWND hwndFrame , hwndMenu ;
                    106: 
                    107:     /* we are called before the global hwndFrame is valid */
                    108:     hwndFrame = WinQueryWindow ( hwnd , QW_PARENT , FALSE ) ;
                    109: 
                    110:     /* load our menus */
                    111:     hwndMenu = WinLoadMenu ( hwndFrame , NULL , ID_RESOURCE ) ;
                    112: 
                    113:     /* open a device context and create a presentation space */
                    114:     hdc = WinOpenWindowDC ( hwnd ) ;
                    115:     hps = GpiCreatePS ( hab , hdc , & sizl ,
                    116:                        PU_ARBITRARY | GPIT_MICRO | GPIA_ASSOC ) ;
                    117: 
                    118:     /* determine screen dimensions */
                    119:     cxScreen = WinQuerySysValue (HWND_DESKTOP , SV_CXSCREEN ) ;
                    120:     cyScreen = WinQuerySysValue (HWND_DESKTOP , SV_CYSCREEN ) ;
                    121: 
                    122:     /* calculate an initial window position and size */
                    123:     xLeft = cxScreen / 8 ;
                    124:     yBottom = cyScreen / 2 ;
                    125:     cxWidth = cxScreen / 3 ;
                    126:     cyHeight = cyScreen / 2 ;
                    127: 
                    128:     /* get the device resolutions so we can make the face appear circular */
                    129:     DevQueryCaps ( hdc , CAPS_VERTICAL_RESOLUTION , 1L , & cyRes ) ;
                    130:     DevQueryCaps ( hdc , CAPS_HORIZONTAL_RESOLUTION , 1L , & cxRes ) ;
                    131: 
                    132:     /* position the window and make it visible */
                    133:     WinSetWindowPos ( hwndFrame , HWND_TOP ,
                    134:                      (SHORT) xLeft , (SHORT) yBottom ,
                    135:                      (SHORT) cxWidth , (SHORT) cyHeight ,
                    136:                      SWP_SIZE | SWP_MOVE | SWP_ACTIVATE ) ;
                    137: 
                    138:     /* have we been asked to start as an icon? */
                    139:     if ( fStartAsIcon )
                    140:        WinSetWindowPos ( hwndFrame , NULL , 0 , 0 , 0 , 0 , SWP_MINIMIZE ) ;
                    141: 
                    142:     WinShowWindow ( hwndFrame , TRUE ) ;
                    143: 
                    144:     /* get the time in a format for dislaying */
                    145:     DosGetDateTime ( & dt ) ;
                    146:     dt . hours = ( dt . hours * 5 ) % 60 + dt . minutes / 12 ;
                    147: 
                    148:     /* start a timer */
                    149:     WinStartTimer ( hab , hwnd , ID_RESOURCE , 1000 ) ;
                    150: }
                    151: 
                    152: 
                    153: /*
                    154:     ClkSize() -- Window Sizing Processing
                    155: 
                    156:     When the window has been sized, we calculate a page
                    157:     rectangle which:  (a) fills the window rectangle in
                    158:     either the x or y dimension, (b) appears square, and
                    159:     (c) is centered in the window rectangle.
                    160: */
                    161: VOID ClkSize ( HWND hwnd )
                    162: {
                    163:     HWND hwndFrame ;
                    164:     RECTL rclWindow ;
                    165:     LONG cxWidth , cyHeight ;
                    166:     ULONG cxSquare , cySquare , cxEdge , cyEdge ;
                    167: 
                    168:     /* get the width and height of the window rectangle */
                    169:     WinQueryWindowRect ( hwnd , & rclWindow ) ;
                    170:     cxWidth = rclWindow . xRight - rclWindow . xLeft ;
                    171:     cyHeight = rclWindow . yTop - rclWindow . yBottom ;
                    172: 
                    173:     /* assume the size of the page rectangle is constrained in the y dimension,
                    174:      * compute the x size which would make the rectangle appear square, then
                    175:      * check the assumption and do the reverse calculation if necessary */
                    176: 
                    177:     cySquare = cyHeight ;
                    178:     cxSquare = ( cyHeight * cxRes ) / cyRes ;
                    179:     if ( cxWidth < cxSquare ) {
                    180:        cxSquare = cxWidth ;
                    181:        cySquare = ( cxWidth * cyRes ) / cxRes ;
                    182:     }
                    183: 
                    184:     /* fill in the page rectangle and set the page viewport */
                    185:     cxEdge = ( cxWidth - cxSquare ) / 2 ;
                    186:     cyEdge = ( cyHeight - cySquare ) / 2 ;
                    187:     rclPage . xLeft = cxEdge ;
                    188:     rclPage . xRight = cxWidth - cxEdge ;
                    189:     rclPage . yBottom = cyEdge ;
                    190:     rclPage . yTop = cyHeight - cyEdge ;
                    191:     f = GpiSetPageViewport ( hps , & rclPage ) ;
                    192: 
                    193:     /* are we iconic? */
                    194:     hwndFrame = WinQueryWindow ( hwnd , QW_PARENT , FALSE ) ;
                    195:     f = WinQueryWindowPos ( hwndFrame , & swp ) ;
                    196:     fIconic = swp . fs & SWP_MINIMIZE ;
                    197:     fShowSecondHand = ! fIconic ;
                    198: }
                    199: 
                    200: 
                    201: /*
                    202:     ClkTimer() -- Handles timer events
                    203: */
                    204: VOID ClkTimer ( VOID )
                    205: {
                    206:     DATETIME dtNew ;
                    207: 
                    208:     /* get the new time */
                    209:     DosGetDateTime ( & dtNew ) ;
                    210: 
                    211:     /* adjust the hour hand */
                    212:     dtNew . hours = ( dtNew . hours * 5 ) % 60 + dtNew . minutes / 12 ;
                    213: 
                    214:     /* if we must move the hour and minute hands, redraw it all */
                    215:     if ( dtNew . minutes != dt . minutes ) {
                    216: 
                    217:        ClkDrawFace ( hps ) ;
                    218:        ClkDrawHand ( hps , HT_HOUR , dtNew . hours ) ;
                    219:        ClkDrawHand ( hps , HT_MINUTE , dtNew . minutes ) ;
                    220: 
                    221:        if ( fShowSecondHand ) {
                    222:            GpiSetMix ( hps , FM_INVERT ) ;
                    223:            ClkDrawHand ( hps , HT_SECOND , dtNew . seconds ) ;
                    224:        }
                    225:     }
                    226: 
                    227:     /* otherwise just undraw the old second hand and draw the new */
                    228:     else if ( fShowSecondHand ) {
                    229:        GpiSetMix ( hps , FM_INVERT ) ;
                    230:        ClkDrawHand ( hps , HT_SECOND , dt . seconds ) ;
                    231:        ClkDrawHand ( hps , HT_SECOND , dtNew . seconds ) ;
                    232:     }
                    233: 
                    234:     dt = dtNew ;
                    235: }
                    236: 
                    237: 
                    238: /*
                    239:     ClkCommand() -- Handle WM_COMMAND events
                    240: */
                    241: VOID ClkCommand ( HWND hwnd , MPARAM mp1 )
                    242: {
                    243:     switch ( SHORT1FROMMP ( mp1 ) ) {
                    244: 
                    245:        case IDM_ABOUT :
                    246:            WinDlgBox ( HWND_DESKTOP , hwnd , ClkAboutDlgProc , NULL ,
                    247:                        IDD_ABOUT , NULL ) ;
                    248:            break ;
                    249: 
                    250:        case IDM_TICKS :
                    251:            WinDlgBox ( HWND_DESKTOP , hwnd , ClkTicksDlgProc , NULL ,
                    252:                        IDD_TICKS , NULL ) ;
                    253:            break ;
                    254: 
                    255:        case IDM_COLORS :
                    256:            WinDlgBox ( HWND_DESKTOP , hwnd , ClkColorsDlgProc , NULL ,
                    257:                        IDD_COLORS , NULL ) ;
                    258:            break ;
                    259: 
                    260:        case IDM_HIDECONTROLS :
                    261:            ClkHideFrameControls ( hwndFrame ) ;
                    262:            break ;
                    263:     }
                    264: }
                    265: 
                    266: 
                    267: /*
                    268:     ClkHideFrameControls() -- Hide the title bar and associated controls
                    269: */
                    270: VOID ClkHideFrameControls ( HWND hwndFrame )
                    271: {
                    272: 
                    273:     hwndTitleBar = WinWindowFromID ( hwndFrame , FID_TITLEBAR ) ;
                    274:     hwndSysMenu = WinWindowFromID ( hwndFrame , FID_SYSMENU ) ;
                    275:     hwndMinMax = WinWindowFromID ( hwndFrame , FID_MINMAX ) ;
                    276:     hwndMenu = WinWindowFromID ( hwndFrame , FID_MENU ) ;
                    277: 
                    278:     WinSetParent ( hwndTitleBar , HWND_OBJECT , FALSE ) ;
                    279:     WinSetParent ( hwndSysMenu , HWND_OBJECT , FALSE ) ;
                    280:     WinSetParent ( hwndMinMax , HWND_OBJECT , FALSE ) ;
                    281:     WinSetParent ( hwndMenu , HWND_OBJECT , FALSE ) ;
                    282: 
                    283:     WinSendMsg ( hwndFrame , WM_UPDATEFRAME ,
                    284:        ( MPARAM ) ( FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_MENU ) ,
                    285:        NULL ) ;
                    286: 
                    287:     fControlsHidden = TRUE ;
                    288: }
                    289: 
                    290: 
                    291: /*
                    292:     ClkShowFrameControls() -- Show the title bar and associated controls
                    293: */
                    294: VOID ClkShowFrameControls ( HWND hwndFrame )
                    295: {
                    296: 
                    297:     WinSetParent ( hwndTitleBar , hwndFrame , FALSE ) ;
                    298:     WinSetParent ( hwndSysMenu , hwndFrame , FALSE ) ;
                    299:     WinSetParent ( hwndMinMax , hwndFrame , FALSE ) ;
                    300:     WinSetParent ( hwndMenu , hwndFrame , FALSE ) ;
                    301: 
                    302:     WinSendMsg ( hwndFrame , WM_UPDATEFRAME ,
                    303:        ( MPARAM ) ( FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_MENU ) ,
                    304:        NULL ) ;
                    305:     WinInvalidateRect ( hwndFrame , NULL , TRUE ) ;
                    306: 
                    307:     fControlsHidden = FALSE ;
                    308: }

unix.superglobalmegacorp.com

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