|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.