Annotation of pmsdk/samples/template/tempnres.c, revision 1.1.1.1

1.1       root        1: /****************************** Module Header ******************************\
                      2: * Module Name: tempnres.c
                      3: *
                      4: *   Non-resident portion of Presentation Manager Template Application
                      5: *
                      6: *   It illustrates the building of a class record, the registering of
                      7: *   that class record with Presentattion Manager and the creation of a window
                      8: *   of that class.  See TEMPLATE.DEF for the associated module definition
                      9: *   file
                     10: *
                     11: *   This is a MIDDLE model application, it has three code segments _RES, _INIT
                     12: *   and _NRES and one data segment _DATA.
                     13: *
                     14: *    For MIDDLE model, procedures that are accessed from another segment
                     15: *    must be declared FAR (see template.h).
                     16: *
                     17: *    Code that is NOT part of the template but is merely for demo purposes is
                     18: *    marked as being for demo purposes and should be replaced/removed when this
                     19: *    template is converted to a real application.
                     20: *
                     21: * Created by Microsoft Corp., 1988
                     22: *
                     23: \***************************************************************************/
                     24: 
                     25: #define INCL_GPI
                     26: #define INCL_WIN
                     27: 
                     28: #include <os2.h>
                     29: #include "template.h"
                     30: 
                     31: /* min and max macros */
                     32: #define max(a,b)    (((a) > (b)) ? (a) : (b))
                     33: #define min(a,b)    (((a) < (b)) ? (a) : (b))
                     34: 
                     35: HAB     hAB;
                     36: HMQ     hMsgQ;
                     37: HWND    hwndTemplate;
                     38: HWND    hwndTemplateFrame;
                     39: 
                     40: /************************************************************************\
                     41: *  The following following are variables and definitions that are part of
                     42: *  the template only for demo purposes and will be replaced when the
                     43: *  template is converted to an application
                     44: \************************************************************************/
                     45: 
                     46: #define RGBBLACK 0L
                     47: #define CCHSTR 15
                     48: #define CSTR    7
                     49: #define POSMIN  0
                     50: #define POSMAX  100
                     51: #define LINEINC 5
                     52: #define PAGEINC 25
                     53: 
                     54: CHAR    szContent[31];
                     55: CHAR    szStr[CCHSTR+1];
                     56: CHAR    szDefault[CCHSTR+1];
                     57: CHAR    szAppName[10];
                     58: BOOL    bCheckBox = TRUE;
                     59: BOOL    fDoAsync = FALSE;
                     60: BOOL    fDoFlash = FALSE;
                     61: SHORT   fDisplay = IDMCOLOR;
                     62: SHORT   cchContent;
                     63: SHORT   idRadioButton = IDDRBRIGHT;
                     64: SHORT   iSel = 2;
                     65: SHORT   posV = 50;
                     66: SHORT   posH = 50;
                     67: 
                     68: /*********** End of demo purpose variables and definitions ************/
                     69: 
                     70: /***********************************************************************\
                     71: *
                     72: *   Procedures in alphabetical order
                     73: *
                     74: \***********************************************************************/
                     75: 
                     76: 
                     77: /******* The code below is for demo purposes only *******/
                     78: VOID ShowAsyncMessage(hWnd)
                     79: HWND hWnd;
                     80: {
                     81:     CHAR    szOkAsync[CCHMAXSTRING];
                     82:     CHAR    szAsync[CCHMAXSTRING];
                     83: 
                     84:     /* we have an outstanding message for user */
                     85: 
                     86:     WinStopTimer( hAB, hWnd, IDTASYNC );
                     87:     WinFlashWindow( hWnd, FALSE );
                     88:     WinLoadString(hAB, NULL, IDSOKASYNC, CCHMAXSTRING, (PCH)szOkAsync);
                     89:     WinLoadString(hAB, NULL, IDSASYNC, CCHMAXSTRING, (PCH)szAsync);
                     90:     WinMessageBox(HWND_DESKTOP, hWnd, (PCH)szOkAsync, (PCH)szAsync, NULL, 
                     91:                    MB_OK|MB_ICONEXCLAMATION );
                     92: 
                     93:     if ( fDoAsync )                 /* restart timer to get another message */
                     94:         WinStartTimer( hAB, hWnd, IDTASYNC, CMSECASYNC );
                     95: 
                     96: }
                     97: /******* The code above is for demo purposes only *******/
                     98: 
                     99: 
                    100: MRESULT EXPENTRY TemplateAboutDlg( hWndDlg, message, mp1, mp2 )
                    101: HWND   hWndDlg;
                    102: USHORT message;
                    103: MPARAM mp1;
                    104: MPARAM mp2;
                    105: {
                    106:     switch( message )
                    107:     {
                    108:       case WM_COMMAND:                  /* the user has pressed a button */
                    109:         switch( SHORT1FROMMP( mp1 ) )   /* which button? */
                    110:         {
                    111:           case DID_OK:
                    112:           case DID_CANCEL:
                    113:             WinDismissDlg( hWndDlg, TRUE );
                    114:             break;
                    115: 
                    116:           default:
                    117:             return( FALSE );
                    118:         }
                    119:         break;
                    120: 
                    121:       default:
                    122:         return( WinDefDlgProc( hWndDlg, message, mp1, mp2 ) );
                    123:     }
                    124:     return( FALSE );
                    125: }
                    126: 
                    127: 
                    128: 
                    129: VOID TemplateCharInput( hWnd, ch, flags, cRepeat )
                    130: HWND  hWnd;
                    131: SHORT ch;
                    132: SHORT flags;
                    133: SHORT cRepeat;
                    134: {
                    135:     /* ignore cRepeat if you want to ignore auto-repeated keys */
                    136:     while (cRepeat-- != 0)
                    137:     {
                    138:     }
                    139: }
                    140: 
                    141: 
                    142: VOID TemplateCommand(hWnd, id, source, mouse)
                    143: HWND  hWnd;
                    144: SHORT id;
                    145: SHORT source;
                    146: BOOL  mouse;
                    147: {
                    148:     /******* The code below is for demo purposes only *******/
                    149: 
                    150:     RECTL   rect;
                    151:     HPS     hPS;
                    152: 
                    153:     switch( id )
                    154:     {
                    155:         case IDMFLASH:
                    156:             WinQueryWindowRect( hWnd, (PRECTL)&rect );
                    157:             hPS = WinGetPS(hWnd );
                    158:             WinInvertRect( hPS, (PRECTL)&rect );
                    159:             WinInvertRect( hPS, (PRECTL)&rect );
                    160:             WinReleasePS( hPS );
                    161:             break;
                    162: 
                    163:         case IDMABOUT:
                    164:             WinDlgBox( HWND_DESKTOP, hWnd, (PFNWP)TemplateAboutDlg, NULL,
                    165:                            IDD_ABOUT, NULL );
                    166:             break;
                    167: 
                    168:         case IDMCOLOR:
                    169:         case IDMBLACK:
                    170:             if ( fDisplay != id )
                    171:             {
                    172:                 fDisplay = id;
                    173:                 WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU, MM_SETITEMATTR,
                    174:                     MPFROM2SHORT(IDMCOLOR, TRUE),
                    175:                     MPFROM2SHORT(MIA_CHECKED, (id == IDMCOLOR ? MIA_CHECKED : NULL)) );
                    176:                 WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU, MM_SETITEMATTR,
                    177:                     MPFROM2SHORT(IDMBLACK, TRUE),
                    178:                     MPFROM2SHORT(MIA_CHECKED, (id != IDMCOLOR ? MIA_CHECKED : NULL)) );
                    179:                 /* this will cause repaint of entire window */
                    180:                 WinInvalidateRect(hWnd, (PRECTL)NULL, TRUE );
                    181:             }
                    182:             break;
                    183: 
                    184:         case IDMSTART:
                    185:           /************************************************************\
                    186:           *  start a timer, when it goes off:
                    187:           *  if window has focus then post message box
                    188:           *  else start flashing window/icon and wait until the
                    189:           *  window DOES have the focus before posting the message box,
                    190:           *  i.e, a template for an async message box
                    191:           \************************************************************/
                    192:             WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU,
                    193:                     MM_SETITEMATTR, MPFROM2SHORT(IDMSTART, TRUE),
                    194:                     MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED) );
                    195:             WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU,
                    196:                     MM_SETITEMATTR, MPFROM2SHORT(IDMEND, TRUE),
                    197:                     MPFROM2SHORT(MIA_DISABLED, NULL) );
                    198:             fDoAsync = TRUE;
                    199:             WinStartTimer( hAB, hWnd, IDTASYNC, CMSECASYNC );
                    200:             break;
                    201: 
                    202:         case IDMEND:
                    203:             WinStopTimer( hAB, hWnd, IDTASYNC );
                    204:             fDoAsync = FALSE;
                    205:             WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU,
                    206:                     MM_SETITEMATTR, MPFROM2SHORT(IDMSTART, TRUE),
                    207:                     MPFROM2SHORT(MIA_DISABLED, NULL) );
                    208:             WinSendDlgItemMsg( hwndTemplateFrame, FID_MENU,
                    209:                     MM_SETITEMATTR, MPFROM2SHORT(IDMEND, TRUE),
                    210:                     MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED) );
                    211:             break;
                    212: 
                    213:         case IDMDIALOG:
                    214:             WinDlgBox( HWND_DESKTOP, hWnd, (PFNWP)TemplateDlg, NULL,
                    215:                           IDD_TEMPLATE, NULL );
                    216:     }
                    217:     /******* The code above is for demo purposes only *******/
                    218: }
                    219: 
                    220: 
                    221: VOID TemplateCreate(hWnd, lParam)
                    222: HWND hWnd;
                    223: LONG lParam;
                    224: {
                    225:     char *pch1;
                    226:     char *pch2;
                    227: 
                    228:     /******* The code below is for demo purposes only *******/
                    229: 
                    230:     cchContent = WinLoadString(hAB, NULL, IDSCONTENT, sizeof(szContent),
                    231:                                  (PCH)szContent);
                    232: 
                    233:     WinLoadString(hAB, NULL, IDSDEFAULT, sizeof(szDefault), (PCH)szDefault);
                    234: 
                    235:     /* copy default string into szStr */
                    236:     for (pch1 = szStr, pch2 = szDefault; *pch1++ = *pch2++; )
                    237:         ;
                    238:     /******* The code above is for demo purposes only *******/
                    239: }
                    240: 
                    241: 
                    242: /******* The code below is for demo purposes only *******/
                    243: 
                    244: MRESULT EXPENTRY TemplateDlg( hWndDlg, message, mp1, mp2     )
                    245: HWND   hWndDlg;
                    246: USHORT message;
                    247: MPARAM mp1;
                    248: MPARAM mp2;
                    249: {
                    250:     CHAR    szWaters[12];
                    251:     SHORT   i;
                    252:     SHORT   pos;
                    253: 
                    254:     switch( message )
                    255:     {
                    256:       case WM_INITDLG:
                    257:         WinSetWindowText( WinWindowFromID( hWndDlg, IDDTEXT ), (PCH)szStr );
                    258:         WinSendDlgItemMsg( hWndDlg, IDDCHECKBOX, BM_SETCHECK,
                    259:                 MPFROM2SHORT(bCheckBox, 0), 0L );
                    260:         WinSendDlgItemMsg( hWndDlg, idRadioButton,
                    261:                 BM_SETCHECK, MPFROM2SHORT(TRUE, 0), 0L );
                    262: 
                    263:         for (i = 0; i < CSTR; i++) {
                    264:             WinLoadString(hAB, NULL, IDSSTR1+i, 12 , (PCH)szWaters);
                    265:             WinSendDlgItemMsg( hWndDlg, IDDLISTBOX, LM_INSERTITEM,
                    266:                     (MPARAM)-1L, (MPARAM)(PCH)szWaters );
                    267:             }
                    268:         WinSendDlgItemMsg( hWndDlg, IDDLISTBOX, LM_SELECTITEM, (MPARAM)iSel,
                    269:                     (MPARAM)TRUE );
                    270: 
                    271:         WinSendDlgItemMsg( hWndDlg, IDDSBH, SBM_SETSCROLLBAR,
                    272:                     MPFROM2SHORT(posH, 0), MPFROM2SHORT(POSMIN, POSMAX) );
                    273:         WinSendDlgItemMsg( hWndDlg, IDDSBV, SBM_SETSCROLLBAR,
                    274:                     MPFROM2SHORT(posV, 0), MPFROM2SHORT(POSMIN, POSMAX) );
                    275: 
                    276:         return( FALSE );
                    277: 
                    278:     case WM_COMMAND:
                    279:         switch( SHORT1FROMMP(mp1) )
                    280:         {
                    281:           case IDDDEFAULTS:
                    282:             WinSetWindowText( WinWindowFromID( hWndDlg, IDDTEXT ),
                    283:                     (PCH)szDefault );
                    284:             WinSendDlgItemMsg( hWndDlg, IDDCHECKBOX, BM_SETCHECK,
                    285:                     MPFROM2SHORT(TRUE, 0), 0L );
                    286: 
                    287:             i = IDDRBLEFT + (SHORT)WinSendDlgItemMsg(hWndDlg,
                    288:                                                   IDDRBLEFT,
                    289:                                                   BM_QUERYCHECKINDEX,
                    290:                                                   0L, 0L );
                    291:             WinSendDlgItemMsg( hWndDlg, i, BM_SETCHECK, MPFROMSHORT(FALSE), 0L);
                    292:             WinSendDlgItemMsg( hWndDlg, (idRadioButton=IDDRBRIGHT),
                    293:                                BM_SETCHECK, MPFROMSHORT(TRUE), 0L );
                    294: 
                    295:             WinSendDlgItemMsg( hWndDlg, IDDLISTBOX, LM_SELECTITEM, (MPARAM)2L,
                    296:                     (MPARAM)TRUE);
                    297:             WinSendDlgItemMsg( hWndDlg, IDDSBH, SBM_SETSCROLLBAR,
                    298:                         MPFROM2SHORT(50, 0), MPFROM2SHORT(POSMIN, POSMAX) );
                    299:             WinSendDlgItemMsg( hWndDlg, IDDSBV, SBM_SETSCROLLBAR,
                    300:                         MPFROM2SHORT(50, 0), MPFROM2SHORT(POSMIN, POSMAX) );
                    301:             break;
                    302: 
                    303:           case DID_OK:
                    304:             bCheckBox = (SHORT)WinSendDlgItemMsg( hWndDlg, IDDCHECKBOX, BM_QUERYCHECK,
                    305:                                 0L, 0L );
                    306:             idRadioButton = IDDRBLEFT + (SHORT)WinSendDlgItemMsg(hWndDlg,
                    307:                                                   IDDRBLEFT,
                    308:                                                   BM_QUERYCHECKINDEX,
                    309:                                                   0L, 0L );
                    310:             i = WinQueryWindowText(WinWindowFromID( hWndDlg, IDDTEXT ), CCHSTR, 
                    311:                     (PCH)szStr);
                    312:             iSel =  (SHORT)WinSendDlgItemMsg( hWndDlg, IDDLISTBOX, LM_QUERYSELECTION,
                    313:                             0L, 0L);
                    314:             iSel = max(0, min(CSTR-1, iSel));
                    315:             posH =  (USHORT)WinSendDlgItemMsg( hWndDlg, IDDSBH, SBM_QUERYPOS, 0L, 0L );
                    316:             posV =  (USHORT)WinSendDlgItemMsg( hWndDlg, IDDSBV, SBM_QUERYPOS, 0L, 0L );
                    317:             WinDismissDlg( hWndDlg, TRUE );
                    318:             break;
                    319: 
                    320:         case DID_CANCEL:
                    321:             WinDismissDlg( hWndDlg, TRUE );
                    322:             break;
                    323: 
                    324:         default:
                    325:             return( FALSE );
                    326:         }
                    327:         break;
                    328: 
                    329: 
                    330: /* scroll bar controls send messages here as WM_HSCROLL instead of WM_COMMAND */
                    331: 
                    332:     case WM_HSCROLL:
                    333:     case WM_VSCROLL:
                    334:         switch ( SHORT1FROMMP(mp1) )
                    335:         {
                    336:         case IDDSBH:
                    337:         case IDDSBV:
                    338:             pos = (USHORT)WinSendDlgItemMsg(hWndDlg, SHORT1FROMMP(mp1),
                    339:                           SBM_QUERYPOS, 0L, 0L );
                    340:             switch ( SHORT2FROMMP(mp2) )
                    341:             {
                    342:             case SB_LINEUP:         /* and SB_LINELEFT */
                    343:                 pos -=  LINEINC;
                    344:                 break;
                    345:             case SB_LINEDOWN:       /* and SB_LINERIGHT */
                    346:                 pos +=  LINEINC;
                    347:                 break;
                    348:             case SB_PAGEUP:         /* and SB_PAGELEFT */
                    349:                 pos -= PAGEINC;
                    350:                 break;
                    351:             case SB_PAGEDOWN:       /* and SB_PAGERIGHT */
                    352:                 pos += PAGEINC;
                    353:                 break;
                    354:             case SB_SLIDERPOSITION:
                    355:                 pos = SHORT1FROMMP(mp2);
                    356:                 break;
                    357:             }
                    358:             pos = max(POSMIN, min(POSMAX, pos));
                    359:             WinSendDlgItemMsg(hWndDlg, SHORT1FROMMP(mp1),
                    360:                     SBM_SETPOS, MPFROM2SHORT(pos, 0), 0L );
                    361:             break;
                    362: 
                    363:         default:
                    364:             return( FALSE );
                    365:         }
                    366: 
                    367:     default:
                    368:         return( WinDefDlgProc( hWndDlg, message, mp1, mp2     ) );
                    369: 
                    370:     }
                    371: 
                    372:     return( FALSE );
                    373: }
                    374: 
                    375: /******* The code above is for demo purposes only *******/
                    376: 
                    377: 
                    378: 
                    379: VOID TemplateSetFocus( hWnd )
                    380: HWND hWnd;
                    381: {
                    382: 
                    383:     if ( fDoFlash )
                    384:     {
                    385:         fDoFlash = FALSE;
                    386:         ShowAsyncMessage(hWnd);
                    387:     }
                    388: 
                    389: }
                    390: 
                    391: 
                    392: 
                    393: VOID TemplateHorzScroll( hWnd, code, posNew )
                    394: HWND  hWnd;
                    395: SHORT code;
                    396: SHORT posNew;
                    397: {
                    398:     switch( code )
                    399:     {
                    400:         case SB_LINEUP:             /* line left */
                    401:             break;
                    402:         case SB_LINEDOWN:           /* line right */
                    403:             break;
                    404:         case SB_PAGEUP:             /* page left */
                    405:             break;
                    406:         case SB_PAGEDOWN:           /* page right */
                    407:             break;
                    408:         case SB_SLIDERPOSITION:     /* position to posNew */
                    409:             break;
                    410:         case SB_SLIDERTRACK:
                    411:             break;
                    412:     }
                    413: }
                    414: 
                    415: VOID TemplatePaint( hWnd, hPS )
                    416: HWND hWnd;
                    417: HPS  hPS;
                    418: {
                    419:     /* Here the application paints its window. */
                    420: 
                    421:     /******* The code below is for demo purposes only *******/
                    422: 
                    423:     long    cx;
                    424:     long    cy;
                    425:     RECTL   rect;
                    426:     POINTL  pt;
                    427:     CHARBUNDLE cb;
                    428: 
                    429:     WinQueryWindowRect( hWnd, (PRECTL)&rect );
                    430:     cx  = (SHORT)(rect.xRight - rect.xLeft) >> 2;
                    431:     cy  = (SHORT)(rect.yTop - rect.yBottom) >> 2;
                    432:     pt.x = 0L;
                    433:     pt.y = rect.yTop - 12L;
                    434: 
                    435:     cb.lColor = CLR_BLACK;
                    436:     GpiSetAttrs(hPS, PRIM_CHAR, CBB_COLOR, 0L, (PBUNDLE)&cb);
                    437: 
                    438:     GpiCharStringAt( hPS, (PPOINTL)&pt, (long)cchContent, (PCH)szContent );
                    439: 
                    440:     /***********************************************************\
                    441:     *   The vertical and horizontal lines on this rectangle are
                    442:     *   "one" pixel wide and on displays that do NOT have a 1:1
                    443:     *   aspect ratio, the lines will NOT be the same thickness
                    444:     \***********************************************************/
                    445: 
                    446:     pt.x = rect.xLeft + cx;
                    447:     pt.y = rect.yTop  - cy;
                    448:     GpiSetCurrentPosition( hPS, (PPOINTL)&pt );
                    449:     pt.x = rect.xRight  - cx;
                    450:     pt.y = rect.yBottom + cy;
                    451:     GpiBox( hPS, 2L, (PPOINTL)&pt, 0L, 0L);
                    452: 
                    453:     /***********************************************************\
                    454:     *   Now we drawn a "rectangle" with uniformly thick lines
                    455:     \***********************************************************/
                    456:     cx = cx >> 1;
                    457:     cy = cy >> 1;
                    458: 
                    459:     GpiSetLineWidthGeom( hPS, 2L );
                    460:     pt.x = rect.xLeft + cx;
                    461:     pt.y = rect.yTop  - cy;
                    462:     GpiSetCurrentPosition( hPS, (PPOINTL)&pt );
                    463:     pt.x = rect.xRight - cx;
                    464:     GpiLine( hPS, (PPOINTL)&pt );
                    465:     pt.y = rect.yBottom + cy;
                    466:     GpiLine( hPS, (PPOINTL)&pt );
                    467:     pt.x = rect.xLeft + cx;
                    468:     GpiLine( hPS, (PPOINTL)&pt );
                    469:     pt.y = rect.yTop - cy;
                    470:     GpiLine( hPS, (PPOINTL)&pt );
                    471: 
                    472:     /******* The code above is for demo purposes only *******/
                    473: }
                    474: 
                    475: 
                    476: 
                    477: /******* The code below is for demo purposes only *******/
                    478: 
                    479: VOID TemplateQueryQuit( hWnd )
                    480: HWND hWnd;
                    481: {
                    482:     CHAR    szOkClose[CCHMAXSTRING];
                    483:     CHAR    szClose[CCHMAXSTRING];
                    484: 
                    485:     WinLoadString(hAB, NULL, IDSOKCLOSE, CCHMAXSTRING , (PCH)szOkClose);
                    486:     WinLoadString(hAB, NULL, IDSCLOSE, CCHMAXSTRING , (PCH)szClose  );
                    487:     WinAlarm( HWND_DESKTOP, WA_WARNING );
                    488:     if ( WinMessageBox(HWND_DESKTOP, hWnd, (PCH)szOkClose, (PCH)szClose,
                    489:                NULL, MB_OKCANCEL|MB_ICONQUESTION ) == DID_OK )
                    490:         WinPostMsg( hWnd, WM_QUIT, 0L, 0L );
                    491: }
                    492: 
                    493: /******* The code above is for demo purposes only *******/
                    494: 
                    495: 
                    496: /******* The code below is for demo purposes only *******/
                    497: 
                    498: VOID TemplateTimer( hWnd, id )
                    499: HWND   hWnd;
                    500: USHORT id;
                    501: {
                    502:     WinStopTimer( hAB, hWnd, IDTASYNC );
                    503:     if ( WinQueryFocus(HWND_DESKTOP, FALSE ) == hWnd )
                    504:         ShowAsyncMessage( hWnd );
                    505:     else
                    506:     {
                    507:         fDoFlash = TRUE;
                    508:         WinFlashWindow( hWnd, TRUE );
                    509:     }
                    510: }
                    511: 
                    512: /******* The code above is for demo purposes only *******/
                    513: 
                    514: 
                    515: 
                    516: VOID TemplateVertScroll( hWnd, code, posNew )
                    517: HWND   hWnd;
                    518: SHORT  code;
                    519: USHORT posNew;
                    520: {
                    521:     switch( code )
                    522:     {
                    523:         case SB_LINEUP:
                    524:             break;
                    525:         case SB_LINEDOWN:
                    526:             break;
                    527:         case SB_PAGEUP:
                    528:             break;
                    529:         case SB_PAGEDOWN:
                    530:             break;
                    531:         case SB_SLIDERPOSITION:
                    532:             break;
                    533:         case SB_SLIDERTRACK:
                    534:             break;
                    535:     }
                    536: }

unix.superglobalmegacorp.com

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