Annotation of pmsdk/samples/bmap/bmap.c, revision 1.1

1.1     ! root        1: /****************************** Module Header *******************************/
        !             2: /* Name: bmap.c                                                             */
        !             3: /*                                                                          */
        !             4: /*   Presentation Manager Bit Map Sample Application : BMAP                 */
        !             5: /*                                                                          */
        !             6: /*   Created by Microsoft Corp., 1988                                       */
        !             7: /*                                                                          */
        !             8: /*   DYNAMIC LINK REFERENCES:                                               */
        !             9: /*                                                                          */
        !            10: /*       DevCloseDC                                                         */
        !            11: /*       DevOpenDC                                                          */
        !            12: /*       DosExit                                                            */
        !            13: /*       GpiAssociate                                                       */
        !            14: /*       GpiBitBlt                                                          */
        !            15: /*       GpiCreateBitmap                                                    */
        !            16: /*       GpiCreatePS                                                        */
        !            17: /*       GpiDeleteBitmap                                                    */
        !            18: /*       GpiDestroyPS                                                       */
        !            19: /*       GpiLine                                                            */
        !            20: /*       GpiLoadBitmap                                                      */
        !            21: /*       GpiMove                                                            */
        !            22: /*       GpiPolyLine                                                        */
        !            23: /*       GpiQueryBoundaryData                                               */
        !            24: /*       GpiRectVisible                                                     */
        !            25: /*       GpiResetBoundaryData                                               */
        !            26: /*       GpiSetBackColor                                                    */
        !            27: /*       GpiSetBitmap                                                       */
        !            28: /*       GpiSetColor                                                        */
        !            29: /*       GpiSetDrawControl                                                  */
        !            30: /*       WinBeginPaint                                                      */
        !            31: /*       WinCreateMsgQueue                                                  */
        !            32: /*       WinCreateStdWindow                                                 */
        !            33: /*       WinDefWindowProc                                                   */
        !            34: /*       WinDestroyMsgQueue                                                 */
        !            35: /*       WinDestroyWindow                                                   */
        !            36: /*       WinDispatchMsg                                                     */
        !            37: /*       WinDrawBitmap                                                      */
        !            38: /*       WinDrawText                                                        */
        !            39: /*       WinEndPaint                                                        */
        !            40: /*       WinFillRect                                                        */
        !            41: /*       WinGetMsg                                                          */
        !            42: /*       WinGetPS                                                           */
        !            43: /*       WinInitialize                                                      */
        !            44: /*       WinInvalidateRect                                                  */
        !            45: /*       WinLoadString                                                      */
        !            46: /*       WinMessageBox                                                      */
        !            47: /*       WinPostMsg                                                         */
        !            48: /*       WinQuerySysValue                                                   */
        !            49: /*       WinQueryWindowRect                                                 */
        !            50: /*       WinQueryWindowText                                                 */
        !            51: /*       WinRegisterClass                                                   */
        !            52: /*       WinReleasePS                                                       */
        !            53: /*       WinSendMsg                                                         */
        !            54: /*       WinSetPointer                                                      */
        !            55: /*       WinTerminate                                                       */
        !            56: /*                                                                          */
        !            57: /****************************************************************************/
        !            58:  
        !            59: /*         Defines to include relevant section of PM Header file            */
        !            60: #define INCL_GPI
        !            61: #define INCL_WIN
        !            62:  
        !            63: /*         PM Header File                                                   */
        !            64: #include <os2.h>
        !            65:  
        !            66: /*         C Library Header Files                                           */
        !            67: #include <string.h>
        !            68:  
        !            69: /*         Application Header File                                          */
        !            70: #include "bmap.h"
        !            71:  
        !            72: void cdecl far Int3();
        !            73:  
        !            74: /*             Global variable declarations                                 */
        !            75: HAB     hab;                       /* Appl anchor block handle              */
        !            76: HMQ     hmq;                       /* Appl queue handle                     */
        !            77:  
        !            78: /*                  various window dependant globals                        */
        !            79: HWND    hwndFrame;                 /* bmap window frame handle              */
        !            80: HWND    hwndClient;                /* client area handle                    */
        !            81:  
        !            82: HDC     hdcMem;                    /* memory device context handle          */
        !            83: HPS     hpsMem;                    /* memory presentation space handle      */
        !            84:  
        !            85: /*                Bit map related variables & data                          */
        !            86: HPOINTER hptrArrow; /* handle of the system arrow pointer                   */
        !            87: HPOINTER hptrWait ; /* handle of the system wait pointer                    */
        !            88: HBITMAP hbmMapQ = (HBITMAP)NULL; /* handles of previously generated bit     */
        !            89: HBITMAP hbmMapR = (HBITMAP)NULL; /* maps held in a resource file            */
        !            90: HBITMAP hbmMap0 = (HBITMAP)NULL; /* handle of bit map generated in bmap     */
        !            91: BITMAPINFOHEADER bmapinfo; /* details of the bitmap created each            */
        !            92:                            /* time 'Save Picture' is selected               */
        !            93: POINTL  bmarray[5];        /* structure specifying source and target        */
        !            94:                            /* rectangles for GpiBitBlt calls                */
        !            95:  
        !            96: /* parameter used when creating a device context for a memory device        */
        !            97: PSZ         dcdatablk[9] = {(PSZ)0
        !            98:                            ,(PSZ)"DISPLAY"
        !            99:                            ,(PSZ)0
        !           100:                            ,(PSZ)0
        !           101:                            ,(PSZ)0
        !           102:                            ,(PSZ)0
        !           103:                            ,(PSZ)0
        !           104:                            ,(PSZ)0
        !           105:                            ,(PSZ)0
        !           106:                            };
        !           107:  
        !           108: USHORT  Current_Selection = 0;   /* Initial value used in the paint routine */
        !           109:  
        !           110: LONG  fore_clr;                  /* fore & back colours used in the display */
        !           111: LONG  back_clr;                  /* of previously generated mono bit maps   */
        !           112:  
        !           113: /*                           string variables                               */
        !           114: CHAR    szText[CCHMAXSTRING];
        !           115: CHAR    szHelp[CCHMAXSTRING];
        !           116: CHAR    szVisible[CCHMAXSTRING];
        !           117: CHAR    szWindowTitle[CCHMAXSTRING];
        !           118:  
        !           119: /* Gobals to control selection, greying and ticking, in the Bitmap menu     */
        !           120: USHORT CurrentTick = 0;
        !           121: USHORT PreviousTick = 0;
        !           122: BOOL Saved = FALSE;
        !           123:  
        !           124: RECTL   BoundRect; /* bounding rectangle of the simple drawing              */
        !           125:  
        !           126: /****************************************************************************/
        !           127: /* MAIN:                                                                    */
        !           128: /* Main Procedure                                                           */
        !           129: /****************************************************************************/
        !           130: VOID cdecl main(  )
        !           131: {
        !           132:     QMSG   qmsg;
        !           133:  
        !           134:     hab = WinInitialize(NULL);
        !           135:     hmq = WinCreateMsgQueue( hab, 0 );
        !           136:     /************************************************************************/
        !           137:     /* Check to see if the queue handle is null. If it is creating the      */
        !           138:     /* message queue will fail and if you continue you will get invalid     */
        !           139:     /* selectors. So exit the application                                   */
        !           140:     /************************************************************************/
        !           141:     if ( !hmq == NULL )
        !           142:     {
        !           143:         if ( BmapInitApp() )
        !           144:         {
        !           145:             while( WinGetMsg( hab, (PQMSG)&qmsg, (HWND)NULL, 0, 0 ) )
        !           146:             {
        !           147:                 WinDispatchMsg( hab, (PQMSG)&qmsg );
        !           148:             }
        !           149:         }
        !           150:         WinDestroyWindow( hwndFrame );
        !           151:         WinDestroyMsgQueue( hmq );
        !           152:     }
        !           153:     WinTerminate( hab );
        !           154:     DosExit( 1, 0 );
        !           155: } /* MAIN */
        !           156:  
        !           157:  
        !           158: /****************************************************************************/
        !           159: /* BMAPWNDPROC:                                                             */
        !           160: /* Client Window Procedure                                                  */
        !           161: /****************************************************************************/
        !           162: MRESULT EXPENTRY BmapWndProc( hwnd, msg, mp1, mp2 )
        !           163: HWND    hwnd;
        !           164: USHORT  msg;
        !           165: MPARAM  mp1;
        !           166: MPARAM  mp2;
        !           167: {
        !           168:     RECTL view;
        !           169:     RECTL rc;
        !           170:     HPS   tmphps;
        !           171:     switch( msg )
        !           172:     {
        !           173:         case WM_CLOSE:
        !           174:             /****************************************************************/
        !           175:             /* message from system to close the Client window.              */
        !           176:             /****************************************************************/
        !           177:             BmapQueryQuit( hwnd );
        !           178:             return( FALSE );
        !           179:             break;
        !           180:  
        !           181:         case WM_COMMAND:
        !           182:             /****************************************************************/
        !           183:             /* A menu item has been selected, or a control is notifying     */
        !           184:             /* its parent.                                                  */
        !           185:             /****************************************************************/
        !           186:             switch (LOUSHORT(mp1))
        !           187:             {
        !           188:                 case IDMEXIT:
        !           189:                     /********************************************************/
        !           190:                     /* EXIT command, menu item or F3 key pressed.           */
        !           191:                     /********************************************************/
        !           192:                     BmapQueryQuit( hwnd );
        !           193:                     return( FALSE );
        !           194:                     break;
        !           195:  
        !           196:                 case IDMRESUME:
        !           197:                     return( FALSE );
        !           198:                     break;
        !           199:  
        !           200:                 case IDMEXTHELP:
        !           201:                     /********************************************************/
        !           202:                     /* Extended help menu item pressed.                     */
        !           203:                     /********************************************************/
        !           204:                     BmapHelp( hwnd, IDSEXTHELP );
        !           205:                     break;
        !           206:  
        !           207:                 case IDMHELPINDEX:
        !           208:                     /********************************************************/
        !           209:                     /* Help Index menu item pressed.                        */
        !           210:                     /********************************************************/
        !           211:                     BmapHelp( hwnd, IDSHELPINDEX );
        !           212:                     break;
        !           213:  
        !           214:                 case IDMKEYSHELP:
        !           215:                     /********************************************************/
        !           216:                     /* Keys help menu item pressed.                         */
        !           217:                     /********************************************************/
        !           218:                     BmapHelp( hwnd, IDSKEYSHELP );
        !           219:                     break;
        !           220:  
        !           221:                 case IDMDRAWPIC:
        !           222:                     /********************************************************/
        !           223:                     /* Draw Picture menu item pressed.                      */
        !           224:                     /* Using GPI drawing orders draw a simple picture on    */
        !           225:                     /* the screen                                           */
        !           226:                     /********************************************************/
        !           227:                     Current_Selection = IDMDRAWPIC;
        !           228:                     WinSetPointer( HWND_DESKTOP, hptrWait );
        !           229:                     WinInvalidateRect( hwnd
        !           230:                                      , (PRECTL)NULL
        !           231:                                      , FALSE
        !           232:                                      );
        !           233:                     /* set values used to set ticks in the menu */
        !           234:                     PreviousTick = CurrentTick;
        !           235:                     CurrentTick = IDMDRAWPIC;
        !           236:                     WinSetPointer( HWND_DESKTOP, hptrArrow );
        !           237:                     return ( FALSE );
        !           238:                     break;
        !           239:  
        !           240:                 case IDMSAVEPIC:
        !           241:                     /********************************************************/
        !           242:                     /* Save Picture menu item pressed.                      */
        !           243:                     /* The visible section of the GPI simple picture is     */
        !           244:                     /* saved as a bit map.  The pointer is set to timer     */
        !           245:                     /* while this is carried out.  Thus preventing the      */
        !           246:                     /* selection of other menu items before the bit blt     */
        !           247:                     /* save completes.                                      */
        !           248:                     /********************************************************/
        !           249:                     WinSetPointer( HWND_DESKTOP, hptrWait );
        !           250:  
        !           251:                     /* find the visible area of the ps */
        !           252:                     WinQueryWindowRect( hwnd, (PRECTL)&rc );
        !           253:  
        !           254:                     tmphps = WinGetPS( hwnd );
        !           255:  
        !           256:                     if ( GpiRectVisible( tmphps, (PRECTL)&BoundRect ) != RVIS_VISIBLE );
        !           257:                     {
        !           258:  
        !           259:                         view.xLeft   = (( BoundRect.xLeft   < rc.xLeft   ) ? rc.xLeft   : BoundRect.xLeft   );
        !           260:                         view.xRight  = (( BoundRect.xRight  > rc.xRight  ) ? rc.xRight  : (BoundRect.xRight + 1) );
        !           261:                         view.yBottom = (( BoundRect.yBottom < rc.yBottom ) ? rc.yBottom : BoundRect.yBottom );
        !           262:                         view.yTop    = (( BoundRect.yTop    > rc.yTop    ) ? rc.yTop    : (BoundRect.yTop + 1)   );
        !           263:  
        !           264:                     }
        !           265:                     /**********************************************************/
        !           266:                     /* Create a bitmap                                        */
        !           267:                     /**********************************************************/
        !           268:                     bmapinfo.cbFix     = 12;
        !           269:                     bmapinfo.cx        = (USHORT)(view.xRight - view.xLeft);
        !           270:                     bmapinfo.cy        = (USHORT)(view.yTop - view.yBottom);
        !           271:                     bmapinfo.cPlanes   = 1L;
        !           272:                     bmapinfo.cBitCount = 24L;
        !           273:  
        !           274:                     if ( hbmMap0 != NULL ) { GpiDeleteBitmap( hbmMap0 ); }
        !           275:                     hbmMap0 = GpiCreateBitmap( hpsMem
        !           276:                                              , (PBITMAPINFOHEADER)&bmapinfo
        !           277:                                              , 0L
        !           278:                                              , (PBYTE)NULL
        !           279:                                              , (PBITMAPINFO)NULL
        !           280:                                              );
        !           281:  
        !           282:                     /**********************************************************/
        !           283:                     /* Select the bit map into the memory device context      */
        !           284:                     /**********************************************************/
        !           285:                     GpiSetBitmap( hpsMem, hbmMap0 );
        !           286:  
        !           287:                     /***** TARGET ***********/
        !           288:                     bmarray[0].x = 0;
        !           289:                     bmarray[0].y = 0;
        !           290:                     bmarray[1].x = view.xRight - view.xLeft + 1;
        !           291:                     bmarray[1].y = view.yTop - view.yBottom + 1;
        !           292:  
        !           293:                     /***** SOURCE ***********/
        !           294:                     bmarray[2].x = view.xLeft;
        !           295:                     bmarray[2].y = view.yBottom;
        !           296:                     bmarray[3].x = view.xRight + 1;
        !           297:                     bmarray[3].y = view.yTop + 1;
        !           298:  
        !           299:                     GpiBitBlt( hpsMem
        !           300:                              , tmphps
        !           301:                              , 4L
        !           302:                              , (PPOINTL)bmarray
        !           303:                              , (LONG)ROP_SRCCOPY
        !           304:                              , (LONG)BBO_IGNORE
        !           305:                              );
        !           306:                     WinReleasePS( tmphps );
        !           307:                     GpiSetBitmap( hpsMem, (HBITMAP)NULL );
        !           308:  
        !           309:                     Current_Selection = IDMDRAWPIC;
        !           310:                     Saved = TRUE;
        !           311:                     PreviousTick = CurrentTick;
        !           312:                     WinSetPointer( HWND_DESKTOP, hptrArrow );
        !           313:                     return ( FALSE );
        !           314:                     break;
        !           315:  
        !           316:                 case IDMBLTPIC:
        !           317:                     WinSetPointer( HWND_DESKTOP, hptrWait );
        !           318:                     Current_Selection = IDMBLTPIC;
        !           319:                     WinInvalidateRect( hwnd
        !           320:                                      , (PRECTL)NULL
        !           321:                                      , FALSE
        !           322:                                      );
        !           323:                     PreviousTick = CurrentTick;
        !           324:                     CurrentTick = IDMBLTPIC;
        !           325:                     WinSetPointer( HWND_DESKTOP, hptrArrow );
        !           326:                     return ( FALSE );
        !           327:                     break;
        !           328:  
        !           329:                 case IDMWINDRAW:
        !           330:                     WinSetPointer( HWND_DESKTOP, hptrWait );
        !           331:                     Current_Selection = IDMWINDRAW;
        !           332:                     fore_clr = CLR_RED;
        !           333:                     back_clr = CLR_BLUE;
        !           334:                     /* trying out Presman */
        !           335:                     if ( hbmMapQ == NULL )
        !           336:                     {
        !           337:                         hbmMapQ = GpiLoadBitmap( hpsMem
        !           338:                                                , NULL
        !           339:                                                , ID_BITMAP2
        !           340:                                                , 0L
        !           341:                                                , 0L
        !           342:                                                );
        !           343:                     }
        !           344:                     WinInvalidateRect( hwnd
        !           345:                                      , (PRECTL)NULL
        !           346:                                      , FALSE
        !           347:                                      );
        !           348:  
        !           349:                     PreviousTick = CurrentTick;
        !           350:                     CurrentTick = IDMWINDRAW;
        !           351:                     WinSetPointer( HWND_DESKTOP, hptrArrow );
        !           352:                     return ( FALSE );
        !           353:                     break;
        !           354:  
        !           355:                 case IDMGPIBITBLT:
        !           356:                     WinSetPointer( HWND_DESKTOP, hptrWait );
        !           357:                     Current_Selection = IDMGPIBITBLT;
        !           358:                     if ( hbmMapR == NULL )
        !           359:                     {
        !           360:                         hbmMapR = GpiLoadBitmap( hpsMem
        !           361:                                                , NULL
        !           362:                                                , ID_BITMAP3
        !           363:                                                , 0L
        !           364:                                                , 0L
        !           365:                                                );
        !           366:                     }
        !           367:                     GpiSetBitmap( hpsMem, hbmMapR );
        !           368:                     WinInvalidateRect( hwnd
        !           369:                                      , (PRECTL)NULL
        !           370:                                      , FALSE
        !           371:                                      );
        !           372:                     PreviousTick = CurrentTick;
        !           373:                     CurrentTick = IDMGPIBITBLT;
        !           374:                     WinSetPointer( HWND_DESKTOP, hptrArrow );
        !           375:                     return ( FALSE );
        !           376:                     break;
        !           377:  
        !           378:                 /****************************************************************/
        !           379:                 /* Unrecognised WM_COMMAND ID's are processed in a default way  */
        !           380:                 /****************************************************************/
        !           381:                 default:
        !           382:                     return( WinDefWindowProc( hwnd, msg, mp1, mp2 ) );
        !           383:             } /* WM_COMMAND switch */
        !           384:             break; /* WM_COMMAND */
        !           385:  
        !           386:         case WM_CREATE:
        !           387:             /****************************************************************/
        !           388:             /* window is initialised                                        */
        !           389:             /****************************************************************/
        !           390:             WindowInitialization( hwnd );
        !           391:             return( FALSE );
        !           392:             break;
        !           393:  
        !           394:         case WM_DESTROY:
        !           395:             /****************************************************************/
        !           396:             /* Disassociate the two GPI PS's from their respctive DC's and  */
        !           397:             /* destroy the PS's. Finally destroy the memory DC.             */
        !           398:             /****************************************************************/
        !           399:             WindowDestroy();
        !           400:             return( FALSE );
        !           401:             break;
        !           402:  
        !           403:         case WM_ERASEBACKGROUND:
        !           404:             /****************************************************************/
        !           405:             /* Let frame control erase background for us                    */
        !           406:             /****************************************************************/
        !           407:             return ( TRUE );
        !           408:             break;
        !           409:  
        !           410:         case WM_HELP:
        !           411:             /****************************************************************/
        !           412:             /* F1 pressed help processing would go here.                               */
        !           413:             /****************************************************************/
        !           414:             BmapHelp( hwnd, IDSEXTHELP );
        !           415:             return ( FALSE );
        !           416:             break;
        !           417:  
        !           418:         case WM_INITMENU:
        !           419:             if ( LOUSHORT( mp1 ) == IDMBITMAP )
        !           420:             {
        !           421:                 /***********************************************************/
        !           422:                 /* selection of menu with no selections made previously    */
        !           423:                 /* grey out save and bitblt options                        *
        !           424:                 /***********************************************************/
        !           425:                 if ( CurrentTick == 0 )
        !           426:                 {
        !           427:                     MenuGrey( IDMSAVEPIC, TRUE );
        !           428:                     MenuGrey( IDMBLTPIC, TRUE );
        !           429:                 }
        !           430:  
        !           431:                 /* tick drawing method and reset previous method            */
        !           432:                 if ( PreviousTick != CurrentTick )
        !           433:                 {
        !           434:                     if ( CurrentTick != 0 )
        !           435:                     {
        !           436:                         MenuTick( PreviousTick, FALSE );
        !           437:                         MenuTick( CurrentTick, TRUE );
        !           438:                     }
        !           439:                 }
        !           440:  
        !           441:                 if ( CurrentTick == IDMDRAWPIC )
        !           442:                 {
        !           443:                     MenuGrey( IDMSAVEPIC, FALSE );
        !           444:                 }
        !           445:                 else
        !           446:                 {
        !           447:                     MenuGrey( IDMSAVEPIC, TRUE );
        !           448:                 }
        !           449:  
        !           450:                 if ( Saved )
        !           451:                 {
        !           452:                     MenuGrey( IDMBLTPIC, FALSE );
        !           453:                 }
        !           454:             } /* endif ( LOUSHORT( mp1 ) == IDMBITMAP ) */
        !           455:             return ( FALSE );
        !           456:             break;
        !           457:  
        !           458:         case WM_PAINT:
        !           459:             /****************************************************************/
        !           460:             /* Time for the window to draw itself.                          */
        !           461:             /****************************************************************/
        !           462:             BmapPaint( hwnd );
        !           463:  
        !           464:             return( FALSE );
        !           465:             break;
        !           466:  
        !           467:         default:
        !           468:             /****************************************************************/
        !           469:             /* Everything else comes here.  This call MUST exist            */
        !           470:             /* in your window proc.                                         */
        !           471:             /****************************************************************/
        !           472:             return(WinDefWindowProc(hwnd, msg, mp1, mp2));
        !           473:             break;
        !           474:    } /* switch */
        !           475: } /* BMAPWNDPROC */
        !           476:  
        !           477: /****************************************************************************/
        !           478: /*                                                                          */
        !           479: /*  Procedures in alphabetical order                                        */
        !           480: /*                                                                          */
        !           481: /****************************************************************************/
        !           482:  
        !           483: VOID BmapHelp( hwnd, HelpStr )
        !           484: HWND   hwnd;
        !           485: USHORT HelpStr;
        !           486: {
        !           487:     CHAR szHelpStr[CCHMAXSTRING];
        !           488:  
        !           489:     /************************************************************************/
        !           490:     /* Get the appropriate Help String.                                     */
        !           491:     /************************************************************************/
        !           492:     WinLoadString(hab, NULL, HelpStr, CCHMAXSTRING, (PSZ)szHelpStr);
        !           493:  
        !           494:     /************************************************************************/
        !           495:     /* Display the help string                                              */
        !           496:     /************************************************************************/
        !           497:     WinMessageBox( HWND_DESKTOP
        !           498:                  , hwnd
        !           499:                  , (PSZ)szHelpStr
        !           500:                  , (PSZ)szWindowTitle
        !           501:                  , 0
        !           502:                  , MB_CUANOTIFICATION | MB_CANCEL | MB_MOVEABLE
        !           503:                  );
        !           504:  
        !           505: } /* BMAPHELP */
        !           506:  
        !           507: /****************************************************************************/
        !           508: /* BMAPINITAPP:                                                             */
        !           509: /* Initialisation carried out when the window is created.                   */
        !           510: /*  - Register Application Window Class                                     */
        !           511: /*  - Creates Standard Window                                               */
        !           512: /*  - Loads various strings used by the application                         */
        !           513: /****************************************************************************/
        !           514: BOOL FAR BmapInitApp( VOID )
        !           515: {
        !           516:     CHAR szClassName[10];
        !           517:     ULONG ctlData;
        !           518:  
        !           519:     WinLoadString( hab, NULL, IDSNAME, sizeof(szClassName), (PSZ)szClassName );
        !           520:  
        !           521:     if ( !WinRegisterClass( hab
        !           522:                           , (PSZ)szClassName
        !           523:                           , (PFNWP)BmapWndProc
        !           524:                           , CS_SIZEREDRAW
        !           525:                           , 0 ) )
        !           526:         return( FALSE );
        !           527:  
        !           528:     ctlData = FCF_STANDARD;
        !           529:     hwndFrame = WinCreateStdWindow( HWND_DESKTOP
        !           530:                                   , WS_VISIBLE | FS_STANDARD
        !           531:                                   , &ctlData
        !           532:                                   , (PSZ)szClassName
        !           533:                                   , (PSZ)NULL
        !           534:                                   , 0L
        !           535:                                   , (HMODULE)NULL
        !           536:                                   , ID_BMAP
        !           537:                                   , (HWND FAR *)&hwndClient
        !           538:                                   );
        !           539:  
        !           540:     /************************************************************************/
        !           541:     /* Get the window title given to the window by the system               */
        !           542:     /************************************************************************/
        !           543:     WinQueryWindowText(hwndFrame, CCHMAXSTRING, (PSZ)szWindowTitle);
        !           544:  
        !           545:     /************************************************************************/
        !           546:     /* Initialise the arrow and wait system pointer handles                 */
        !           547:     /************************************************************************/
        !           548:     hptrArrow = WinQuerySysPointer( HWND_DESKTOP
        !           549:                                   , SPTR_ARROW
        !           550:                                   , FALSE
        !           551:                                   );
        !           552:     hptrWait = WinQuerySysPointer( HWND_DESKTOP
        !           553:                                  , SPTR_WAIT
        !           554:                                  , FALSE
        !           555:                                  );
        !           556:  
        !           557:     /************************************************************************/
        !           558:     /* Initialise global strings used in the application                    */
        !           559:     /************************************************************************/
        !           560:     WinLoadString(hab, NULL, IDSGENERALHELP,CCHMAXSTRING, (PSZ)szHelp);
        !           561:     WinLoadString(hab, NULL, IDSTEXTSTR,   CCHMAXSTRING, (PSZ)szText);
        !           562:     WinLoadString(hab, NULL, IDSVISIBLE,   CCHMAXSTRING, (PSZ)szVisible);
        !           563:  
        !           564:     return( TRUE );
        !           565: } /* BMAPINITAPP */
        !           566:  
        !           567:  
        !           568: /****************************************************************************/
        !           569: /* BMAPPAINT:                                                               */
        !           570: /* The application paints its window                                        */
        !           571: /****************************************************************************/
        !           572: VOID BmapPaint( hwnd )
        !           573: HWND hwnd;
        !           574: {
        !           575:     HPS     hps;
        !           576:     RECTL   rect;
        !           577:     RECTL   txtrect;
        !           578:     RECTL   PaintArea;
        !           579:     LONG    Visible;
        !           580:  
        !           581:     POINTL Pos;
        !           582:     POINTL Coords[3];
        !           583:     POINTL Straight[4];
        !           584:  
        !           585:     hps = WinBeginPaint( hwnd, (HPS)NULL, (PRECTL)&PaintArea );
        !           586:     WinFillRect( hps, (PRECTL)&PaintArea, SYSCLR_WINDOW );
        !           587:  
        !           588:     WinQueryWindowRect( hwnd, (PRECTL)&rect );
        !           589:     switch ( Current_Selection )
        !           590:     {
        !           591:         case IDMDRAWPIC:
        !           592:             /* draw a simple picture make up from gpi drawing orders        */
        !           593:             /* get bounding rectangle for the simple drawing                */
        !           594:             GpiResetBoundaryData( hps );
        !           595:             GpiSetDrawControl( hps
        !           596:                              , DCTL_BOUNDARY
        !           597:                              , DCTL_ON
        !           598:                              );
        !           599:  
        !           600:             /* do simple draw */
        !           601:             SimplePic( hps );
        !           602:             /* assimilate the boundary data */
        !           603:             GpiQueryBoundaryData( hps
        !           604:                                 , (PRECTL)&BoundRect
        !           605:                                 );
        !           606:  
        !           607:             GpiSetDrawControl( hps
        !           608:                              , DCTL_BOUNDARY
        !           609:                              , DCTL_OFF
        !           610:                              );
        !           611:  
        !           612:             Visible = GpiRectVisible( hps, (PRECTL)&BoundRect );
        !           613:             if ( Visible != RVIS_VISIBLE )
        !           614:             {
        !           615:                 WinMessageBox( HWND_DESKTOP
        !           616:                              , hwnd
        !           617:                              , (PSZ)szVisible
        !           618:                              , (PSZ)szWindowTitle
        !           619:                              , 0
        !           620:                              , MB_CUANOTIFICATION | MB_CANCEL | MB_MOVEABLE
        !           621:                              );
        !           622:             }
        !           623:             break;
        !           624:  
        !           625:         case IDMBLTPIC:
        !           626:             /* do redraw of simple picture  */
        !           627:             WinFillRect(hps, (PRECTL)&PaintArea, CLR_CYAN);
        !           628:             GpiSetBitmap( hpsMem, hbmMap0 );
        !           629:  
        !           630:             /****************************************************************/
        !           631:             /* Set up the source/target rectangle information needed for    */
        !           632:             /* the Bitblt operation.( in device coordinates )               */
        !           633:             /****************************************************************/
        !           634:             /***** TARGET ***********/
        !           635:             bmarray[0].x = rect.xLeft;
        !           636:             bmarray[0].y = rect.yBottom;
        !           637:             bmarray[1].x = rect.xRight + 2;
        !           638:             bmarray[1].y = rect.yTop + 2;
        !           639:  
        !           640:  
        !           641:  
        !           642:             /***** SOURCE ***********/
        !           643:             bmarray[2].x = 0;
        !           644:             bmarray[2].y = 0;
        !           645:  
        !           646:             /****************************************************************/
        !           647:             /* Bitblt from the memory device to the window on screen        */
        !           648:             /****************************************************************/
        !           649:             GpiBitBlt( hps
        !           650:                      , hpsMem
        !           651:                      , 3L
        !           652:                      , (PPOINTL)bmarray
        !           653:                      , (LONG)ROP_SRCCOPY
        !           654:                      , (LONG)BBO_IGNORE
        !           655:                      );
        !           656:  
        !           657:             GpiSetBitmap( hpsMem, (HBITMAP)NULL );
        !           658:             break;
        !           659:  
        !           660:         case IDMWINDRAW:
        !           661:             /* WinDrawBitmap a bitmap loaded using WinLoadBitmap            */
        !           662:             fore_clr = CLR_YELLOW;
        !           663:             back_clr = CLR_GREEN;
        !           664:             WinDrawBitmap( hps
        !           665:                          , hbmMapQ
        !           666:                          , (PRECTL)NULL    /* whole bit map is draw         */
        !           667:                          , (PPOINTL)&rect
        !           668:                          , fore_clr        /* required for mono bit maps    */
        !           669:                          , back_clr
        !           670:                          , DBM_STRETCH
        !           671:                          );
        !           672:             break;
        !           673:  
        !           674:         case IDMGPIBITBLT:
        !           675:             /* GpiBitBlt a bitmap loaded using WinLoadBitmap                */
        !           676:             /****************************************************************/
        !           677:             /* Set up the source/target rectangle information needed for    */
        !           678:             /* the Bitblt operation.( in device coordinates )               */
        !           679:             /****************************************************************/
        !           680:             /***** TARGET ***********/
        !           681:             bmarray[0].x = 0;
        !           682:             bmarray[0].y = 0;
        !           683:             bmarray[1].x = rect.xRight - rect.xLeft;
        !           684:             bmarray[1].y = rect.yTop - rect.yBottom;
        !           685:  
        !           686:  
        !           687:             /***** SOURCE ***********/
        !           688:             bmarray[2].x = 0;
        !           689:             bmarray[2].y = 0;
        !           690:  
        !           691:             /****************************************************************/
        !           692:             /* Bitblt from the memory device to the window on screen        */
        !           693:             /****************************************************************/
        !           694:             GpiBitBlt( hps
        !           695:                      , hpsMem
        !           696:                      , 3L
        !           697:                      , (PPOINTL)bmarray
        !           698:                      , (LONG)ROP_SRCCOPY
        !           699:                      , (LONG)BBO_OR
        !           700:                      );
        !           701:             break;
        !           702:  
        !           703:         case 0:
        !           704:             /* text always shown at the start of the application execution  */
        !           705:             WinDrawText(hps,
        !           706:                         strlen(szText),
        !           707:                         (PSZ)szText,
        !           708:                         &rect,
        !           709:                         SYSCLR_WINDOWTEXT,
        !           710:                         SYSCLR_WINDOW,
        !           711:                         DT_CENTER | DT_VCENTER);
        !           712:             break;
        !           713:  
        !           714:         default:
        !           715:             break;
        !           716:     } /* end of switch ( Current_Selection ) */
        !           717:  
        !           718:     WinEndPaint( hps );
        !           719: } /* BMAPPAINT */
        !           720:  
        !           721: /****************************************************************************/
        !           722: /* BMAPQUERYQUIT:                                                           */
        !           723: /* The user is required to confirm/dismiss the request to quit the program  */
        !           724: /****************************************************************************/
        !           725: VOID BmapQueryQuit( hwnd )
        !           726: HWND hwnd;
        !           727: {
        !           728:     CHAR    szTerminate[CCHMAXSTRING];
        !           729:  
        !           730:     WinLoadString(hab, NULL, IDSTERMINATE, CCHMAXSTRING , (PSZ)szTerminate);
        !           731:  
        !           732:     if ( WinMessageBox( HWND_DESKTOP
        !           733:                       , hwnd
        !           734:                       , (PSZ)szTerminate
        !           735:                       , (PSZ)szWindowTitle
        !           736:                       , 0
        !           737:                       , MB_CUAWARNING | MB_YESNO | MB_DEFBUTTON2 | MB_MOVEABLE
        !           738:                       ) == MBID_YES)
        !           739:     {
        !           740:         WinPostMsg( hwnd, WM_QUIT, (ULONG)0, (ULONG)0 );
        !           741:     }
        !           742: } /* BMAPQUERYQUIT */
        !           743:  
        !           744: /****************************************************************************/
        !           745: /* MENUGREY:                                                                */
        !           746: /* Enable/Disable menuitem according to option                              */
        !           747: /****************************************************************************/
        !           748: VOID MenuGrey( item, option )
        !           749: USHORT item;
        !           750: BOOL   option;
        !           751: {
        !           752:     WinSendMsg( WinWindowFromID( hwndFrame, FID_MENU )
        !           753:               , MM_SETITEMATTR
        !           754:               , MPFROM2SHORT( item, TRUE)
        !           755:               , MPFROM2SHORT( MIA_DISABLED, option ? MIA_DISABLED : ~MIA_DISABLED )
        !           756:               );
        !           757:     return;
        !           758: } /* MENUGREY */
        !           759:  
        !           760: /****************************************************************************/
        !           761: /* MENUTICK:                                                                */
        !           762: /* Tick/Untick menuitem according to option                                 */
        !           763: /****************************************************************************/
        !           764: VOID MenuTick( item, option )
        !           765: USHORT item;
        !           766: BOOL   option;
        !           767: {
        !           768:     WinSendMsg( WinWindowFromID( hwndFrame, FID_MENU )
        !           769:               , MM_SETITEMATTR
        !           770:               , MPFROM2SHORT( item, TRUE)
        !           771:               , MPFROM2SHORT( MIA_CHECKED, option ? MIA_CHECKED : ~MIA_CHECKED )
        !           772:               );
        !           773:  
        !           774:     return;
        !           775: } /* MENUTICK */
        !           776:  
        !           777: /****************************************************************************/
        !           778: /* SIMPLEPIC:                                                               */
        !           779: /* A selection of GPI drawing commands exercised when 'Draw - Picture'      */
        !           780: /* option is selected.                                                      */
        !           781: /****************************************************************************/
        !           782: VOID SimplePic( hps )
        !           783: HPS hps;
        !           784: {
        !           785:     POINTL Pos;
        !           786:     POINTL Coords[4];
        !           787:  
        !           788:     /* draw a rhomboid */
        !           789:     Pos.x = 100;
        !           790:     Pos.y = 50;
        !           791:     GpiMove( hps
        !           792:             , &Pos
        !           793:             );
        !           794:  
        !           795:     Coords[0].x =  50;
        !           796:     Coords[0].y =  100;
        !           797:     Coords[1].x =  100;
        !           798:     Coords[1].y =  150;
        !           799:     Coords[2].x =  150;
        !           800:     Coords[2].y =  100;
        !           801:     /* three green sides */
        !           802:     GpiSetColor( hps, CLR_GREEN );
        !           803:     GpiPolyLine( hps
        !           804:                , 3L
        !           805:                , Coords
        !           806:                );
        !           807:     /* one blue edge */
        !           808:     GpiSetColor( hps, CLR_BLUE );
        !           809:     GpiLine( hps
        !           810:            , &Pos
        !           811:            );
        !           812:  
        !           813:     /* draw a rectangle */
        !           814:     Pos.x = 200;
        !           815:     Pos.y = 200;
        !           816:     GpiMove( hps
        !           817:            , &Pos
        !           818:            );
        !           819:  
        !           820:     Coords[0].x =  200;
        !           821:     Coords[0].y =  250;
        !           822:     Coords[1].x =  250;
        !           823:     Coords[1].y =  250;
        !           824:     Coords[2].x =  250;
        !           825:     Coords[2].y =  200;
        !           826:     Coords[3].x =  200;
        !           827:     Coords[3].y =  200;
        !           828:     /* four red sides */
        !           829:     GpiSetColor( hps, CLR_RED );
        !           830:     GpiPolyLine( hps
        !           831:                , 4L
        !           832:                , Coords
        !           833:                );
        !           834: } /* SIMPLEPIC */
        !           835:  
        !           836: VOID WindowDestroy()
        !           837: {
        !           838:     GpiAssociate( hpsMem, (HDC)NULL );
        !           839:     GpiDestroyPS( hpsMem );
        !           840:     DevCloseDC( hdcMem );
        !           841: }
        !           842:  
        !           843: /****************************************************************************/
        !           844: /* Initialisation to be carried out when the window is created.             */
        !           845: /****************************************************************************/
        !           846: VOID WindowInitialization(hwnd)
        !           847: HWND hwnd;
        !           848: {
        !           849:     SIZEL   size;
        !           850:  
        !           851:     /************************************************************************/
        !           852:     /* Get the maximum client area size. Create a window DC for the client  */
        !           853:     /* area and a normal GPI Presentation Space and associate the two.      */
        !           854:     /* The GPI PS will be the maximum client area size and be in pels.      */
        !           855:     /* Create a memory DC compatible with the screen.                       */
        !           856:     /************************************************************************/
        !           857:     size.cx = WinQuerySysValue(HWND_DESKTOP, SV_CXFULLSCREEN);
        !           858:     size.cy = WinQuerySysValue(HWND_DESKTOP, SV_CYFULLSCREEN);
        !           859:  
        !           860:     /************************************************************************/
        !           861:     /*    THE MEMORY DEVICE                                                 */
        !           862:     /* Get a dc for the memory device                                       */
        !           863:     /************************************************************************/
        !           864:     hdcMem = DevOpenDC( hab
        !           865:                       , OD_MEMORY
        !           866:                       , (PSZ)"*"
        !           867:                       , 8L
        !           868:                       , (PDEVOPENDATA)dcdatablk
        !           869:                       , (HDC)NULL
        !           870:                       );
        !           871:     /************************************************************************/
        !           872:     /* NB DO THE DC/PS ASSOCIATE HERE                                       */
        !           873:     /* create the memory ps to the dimensions of the full screen            */
        !           874:     /************************************************************************/
        !           875:  
        !           876:     hpsMem = GpiCreatePS( hab
        !           877:                         , hdcMem
        !           878:                         , (PSIZEL)&size
        !           879:                         , (LONG)PU_PELS | GPIT_NORMAL | GPIA_ASSOC
        !           880:                         );
        !           881: } /* WINDOWINITIALIZATION */

unix.superglobalmegacorp.com

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