Annotation of q_a/samples/printer/printer.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************\
                      2: *
                      3: *  PROGRAM:     PRINTER.C
                      4: *
                      5: *  PURPOSE:     To demonstrate the printing of graphics & fonts in Win32.
                      6: *               Also allows a user to enumerate all system printers
                      7: *               (and graphically lists all info returned by EnumPrinters),
                      8: *               print various graphics & fonts to each one, and to query
                      9: *               the device capablities for each printer and the display.
                     10: *
                     11: *  FUNTIONS:    WinMain()          - register class, create windows,
                     12: *                                    msg loop
                     13: *               MainWndProc()      - processes main window msgs
                     14: *               InvalidateClient() - invalidates client area, excluding
                     15: *                                    toolbar
                     16: *
                     17: \******************************************************************************/
                     18: 
                     19: #include <windows.h>
                     20: #include "lookup.h"
                     21: #include "printer.h"
                     22: #include "paint.h"
                     23: #include "toolbar.h"
                     24: #include "vars.h"
                     25: 
                     26: 
                     27: 
                     28: /******************************************************************************\
                     29: *
                     30: *  FUNCTION:    WinMain (standard WinMain INPUTS/RETURNS)
                     31: *
                     32: *  GLOBAL VARS: hInst    - current program instance handle
                     33: *               hWndMain - handle of the main standard window
                     34: *
                     35: *  LOCAL VARS:  wc  - class initial;ization struct
                     36: *               msg - msg to get/dispatch
                     37: *
                     38: *  COMMENTS:    Standard WinMain: registers a class, creates a window,
                     39: *               creates a toolbar for the window, does a msg loop, then
                     40: *               terminates.
                     41: *
                     42: \******************************************************************************/
                     43: 
                     44: int APIENTRY WinMain (HANDLE hInstance, HANDLE hPrevInstance,
                     45:                      LPSTR  lpCmdLine, int    nCmdShow)
                     46: {
                     47:   WNDCLASS  wc;
                     48:   MSG msg;
                     49: 
                     50:   wc.style        = CS_HREDRAW | CS_VREDRAW;
                     51:   wc.lpfnWndProc   = (WNDPROC)MainWndProc;
                     52:   wc.cbClsExtra    = 0;
                     53:   wc.cbWndExtra    = 0;
                     54:   wc.hInstance    = hInstance;
                     55:   wc.hIcon        = LoadIcon(hInstance, "printericon");
                     56:   wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
                     57:   wc.hbrBackground = GetStockObject(WHITE_BRUSH);
                     58:   wc.lpszMenuName  = "PrinterMenu";
                     59:   wc.lpszClassName = "PrinterSampleClass";
                     60: 
                     61:   if (!RegisterClass(&wc))
                     62:     return 0;
                     63: 
                     64:   hInst = hInstance;
                     65:   CreateWindow ("PrinterSampleClass", "PRINTER Sample App",
                     66:                WS_OVERLAPPEDWINDOW,
                     67:                CW_USEDEFAULT, CW_USEDEFAULT,
                     68:                CW_USEDEFAULT, CW_USEDEFAULT,
                     69:                NULL, NULL, hInstance, NULL);
                     70: 
                     71:   if (!hWndMain)
                     72:       return 0;
                     73: 
                     74:   if (!CreateDialog (hInst, (LPTSTR)"PrinterToolbar", hWndMain,
                     75:                     (DLGPROC) ToolbarProc))
                     76:     MessageBox (NULL, "CreateDialog failed", "Err!", MB_OK);
                     77: 
                     78:   ShowWindow   (hWndMain, nCmdShow);
                     79:   UpdateWindow (hWndMain);
                     80: 
                     81:   while (GetMessage(&msg, NULL,NULL,NULL))
                     82:   {
                     83:     TranslateMessage(&msg);
                     84:     DispatchMessage(&msg);
                     85:   }
                     86:   return (msg.wParam);
                     87: }
                     88: 
                     89: 
                     90: 
                     91: /******************************************************************************\
                     92: *
                     93: *  FUNCTION:   MainWndProc (standard window procedure INPUTS/RETURNS)
                     94: *
                     95: *  GLOBAL VARS: hInst             - current program instance handle
                     96: *              iMapMode           - current map mode (eg. MM_TEXT)
                     97: *               dwGraphicsOptions - current graphics to draw in client
                     98: *                                   area
                     99: *
                    100: *  LOCAL VARS: hMenu            - handle of main menu
                    101: *              hMapModesSubMenu - handle of "Map modes" submenu
                    102: *              hGraphicsSubMenu - handle of "Graphics" submenu
                    103: *              wLastMapMode     - menu id corresponding to last map mode
                    104: *
                    105: *  COMMENTS:   The value of the iMapMode and dwGraphicsOptions variables
                    106: *               determines the output when the Paint() routine is called
                    107: *               in the WM_PAINT procedure.
                    108: *
                    109: \******************************************************************************/
                    110: 
                    111: LONG APIENTRY MainWndProc (HWND hWnd, UINT message,UINT wParam,LONG lParam)
                    112: {
                    113:   static HMENU hMenu, hMapModesSubMenu, hGraphicsSubMenu;
                    114:   static WORD  wLastMapMode;
                    115: 
                    116:   switch (message)
                    117:   {
                    118:     case WM_COMMAND:
                    119: 
                    120:       switch (LOWORD(wParam))
                    121:       {
                    122:        case IDM_HIENGLISH:
                    123:        case IDM_HIMETRIC:
                    124:        case IDM_LOENGLISH:
                    125:        case IDM_LOMETRIC:
                    126:        case IDM_TWIPS:
                    127:        case IDM_ISOTROPIC:
                    128:        case IDM_ANISOTROPIC:
                    129:        case IDM_TEXT:
                    130: 
                    131:          /********************************************************************\
                    132:           *  Uncheck the last map mode menuitem, check the new map mode
                    133:          *  menuitem, set iMapMode according to menu id, and invalidate
                    134:           *  the client area so it'll be redrawn.
                    135:          \********************************************************************/
                    136: 
                    137:           CheckMenuItem (hMapModesSubMenu, wLastMapMode,
                    138:                           MF_UNCHECKED | MF_BYCOMMAND);
                    139:           CheckMenuItem (hMapModesSubMenu, LOWORD(wParam),
                    140:                           MF_CHECKED | MF_BYCOMMAND);
                    141:          iMapMode = iLookupWord (iMapModesLkUpW, LOWORD(wParam),
                    142:                                  MAX_MAPMODES);
                    143:          InvalidateClient ();
                    144:          wLastMapMode = LOWORD(wParam);
                    145:          break;
                    146: 
                    147:        case IDM_ARC:
                    148:        case IDM_ELLIPSE:
                    149:        case IDM_LINETO:
                    150:        case IDM_PIE:
                    151:        case IDM_POLYBEZIER:
                    152:        case IDM_POLYGON:
                    153:        case IDM_POLYLINE:
                    154:        case IDM_POLYPOLYGON:
                    155:        case IDM_RECTANGLE:
                    156:        case IDM_ROUNDRECT:
                    157:        case IDM_STRETCHBLT:
                    158:        case IDM_TEXTOUT:
                    159:        {
                    160:          /********************************************************************\
                    161:           *  Retrieve the DWORD flag value for the particular menuitem,
                    162:           *  toggle (un/check) the menuitem, set/clear the flag in
                    163:           *  dwGraphicsOptions, and invalidate the client area so it'll
                    164:           *  be redrawn.
                    165:          \********************************************************************/
                    166: 
                    167:          DWORD dwGraphic = dwLookupWord (dwGraphicsLkUpW, LOWORD(wParam),
                    168:                                          MAX_GRAPHICS);
                    169: 
                    170:           if (GetMenuState (hGraphicsSubMenu, LOWORD(wParam),
                    171:                                         MF_BYCOMMAND) & MF_CHECKED)
                    172:           { dwGraphicsOptions &= ~dwGraphic;
                    173:             CheckMenuItem (hGraphicsSubMenu, LOWORD(wParam),
                    174:                             MF_UNCHECKED | MF_BYCOMMAND);
                    175:           }
                    176:           else
                    177:           {
                    178:            /******************************************************************\
                    179:             *  Clear/uncheck the ENUMFONTS flag/menuitem
                    180:            \******************************************************************/
                    181: 
                    182:             dwGraphicsOptions &= ~ENUMFONTS;
                    183:             CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS,
                    184:                            MF_UNCHECKED | MF_BYCOMMAND);
                    185: 
                    186:             dwGraphicsOptions |= dwGraphic;
                    187:             CheckMenuItem (hGraphicsSubMenu, LOWORD(wParam),
                    188:                             MF_CHECKED | MF_BYCOMMAND);
                    189:          }
                    190:          InvalidateClient ();
                    191:          break;
                    192:         }
                    193:        case IDM_ALLGRAPHICS:
                    194:        {
                    195:          UINT i;
                    196: 
                    197:           /********************************************************************\
                    198:           *  Clear/uncheck the ENUMFONTS flag/menuitem, set/check all
                    199:           *  other graphics flags/menuitems, and invalidate the client
                    200:           *  area so it'll be repainted.
                    201:           \********************************************************************/
                    202: 
                    203:           dwGraphicsOptions = 0;
                    204:           CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS,
                    205:                           MF_UNCHECKED | MF_BYCOMMAND);
                    206: 
                    207:          for (i = 0; i < MAX_GRAPHICS; i++)
                    208:           { CheckMenuItem (hGraphicsSubMenu, IDM_ARC + i,
                    209:                             MF_CHECKED | MF_BYCOMMAND);
                    210:            dwGraphicsOptions |= dwLookupWord (dwGraphicsLkUpW,
                    211:                                                (WORD) (IDM_ARC+i),
                    212:                                               MAX_GRAPHICS);
                    213:           }
                    214:          InvalidateClient ();
                    215:          break;
                    216:         }
                    217:        case IDM_NOGRAPHICS:
                    218:        {
                    219:          UINT i;
                    220: 
                    221:           /********************************************************************\
                    222:           *  Clear/uncheck all graphics flags/menuitems, and invalidate
                    223:           *  the client area so it'll be repainted.
                    224:           \********************************************************************/
                    225: 
                    226:          for (i = 0; i < MAX_GRAPHICS; i++)
                    227:             CheckMenuItem (hGraphicsSubMenu, IDM_ARC + i,
                    228:                            MF_UNCHECKED | MF_BYCOMMAND);
                    229: 
                    230:          dwGraphicsOptions = 0;
                    231: 
                    232:          InvalidateClient ();
                    233:          break;
                    234:         }
                    235:        case IDM_ENUMFONTS:
                    236:        {
                    237:           /********************************************************************\
                    238:           *  Set/clear ENUMFONTS flag, toggle (un/check) menuitem, if
                    239:           *  checking IDM_ENUMFONTS then uncheck all other items, and
                    240:           *  invalidate the client area so it'll be repainted.
                    241:           \********************************************************************/
                    242: 
                    243:           if (GetMenuState (hGraphicsSubMenu, IDM_ENUMFONTS,
                    244:                                         MF_BYCOMMAND) & MF_CHECKED)
                    245:           { dwGraphicsOptions = 0;
                    246:             CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS,
                    247:                             MF_UNCHECKED | MF_BYCOMMAND);
                    248:           }
                    249:           else
                    250:          { SendMessage (hWnd, WM_COMMAND, IDM_NOGRAPHICS, 0);
                    251: 
                    252:             dwGraphicsOptions = ENUMFONTS;
                    253:             CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS,
                    254:                             MF_CHECKED | MF_BYCOMMAND);
                    255:           }
                    256:          InvalidateClient ();
                    257:          break;
                    258:         }
                    259:       }
                    260:       break;
                    261: 
                    262:     case WM_PAINT:
                    263:     {
                    264:       PAINTSTRUCT ps;
                    265:       RECT rect;
                    266:       HDC  hdc = BeginPaint (hWnd, &ps);
                    267: 
                    268:       GetClientRect (hWnd, &rect);
                    269: 
                    270:       if (iMapMode == MM_TEXT || iMapMode == MM_ANISOTROPIC)
                    271: 
                    272:        SetViewportOrgEx (hdc, 0, TOOLBARHEIGHT, NULL);
                    273: 
                    274:       else
                    275: 
                    276:        SetViewportOrgEx (hdc, 0, rect.bottom, NULL);
                    277: 
                    278:       rect.bottom -= TOOLBARHEIGHT;
                    279:       SetMapMode (hdc, iMapMode);
                    280:       Paint (hdc, &rect);
                    281:       EndPaint (hWnd, &ps);
                    282:       break;
                    283:     }
                    284:     case WM_CREATE:
                    285: 
                    286:       hWndMain = hWnd;
                    287:       hMenu = GetMenu (hWnd);
                    288:       hMapModesSubMenu = GetSubMenu (hMenu, 0);
                    289:       hGraphicsSubMenu = GetSubMenu (hMenu, 1);
                    290:       SendMessage (hWnd, WM_COMMAND, (DWORD) MAKELONG (IDM_TEXT,0), 0);
                    291:       SendMessage (hWnd, WM_COMMAND,
                    292:                    (DWORD) MAKELONG (IDM_ALLGRAPHICS,0), 0);
                    293:       break;
                    294: 
                    295:     case WM_DESTROY:
                    296: 
                    297:       PostQuitMessage(0);
                    298:       break;
                    299: 
                    300:     default:
                    301: 
                    302:       return (DefWindowProc(hWnd, message, wParam, lParam));
                    303:   }
                    304:   return (NULL);
                    305: }
                    306: 
                    307: 
                    308: 
                    309: /******************************************************************************\
                    310: *
                    311: *  FUNCTION:    InvalidateClient
                    312: *
                    313: *  GLOBAL VARS: hWndMain - main app window handle
                    314: *
                    315: *  COMMENTS:    Eliminates the flashing of the toolbar when we redraw
                    316: *
                    317: \******************************************************************************/
                    318: 
                    319: void InvalidateClient ()
                    320: {
                    321:   RECT r;
                    322: 
                    323:   GetClientRect (hWndMain, &r);
                    324: 
                    325:   r.top += TOOLBARHEIGHT;
                    326: 
                    327:   InvalidateRect (hWndMain, &r, TRUE);
                    328: }

unix.superglobalmegacorp.com

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