Annotation of q_a/samples/printer/toolbar.c, revision 1.1

1.1     ! root        1: /******************************************************************************\
        !             2: *
        !             3: *  MODULE:      TOOLBAR.C
        !             4: *
        !             5: *  PURPOSE:     Implements toobar for PRINTER sample
        !             6: *
        !             7: *  FUNTIONS:    ToolbarProc()           - toolbar dlg proc
        !             8: *               UpdateToolbarCombobox() - inserts printers in toolbar combobox
        !             9: *               vDrawBitmap()           - draws toolbar buttons
        !            10: *               iGetBtn()               - retrieves button index
        !            11: *               vDoBtnCmd()             - implements button-specific code
        !            12: *               PrintThread()           - printing thread
        !            13: *
        !            14: \******************************************************************************/
        !            15: 
        !            16: #include <windows.h>
        !            17: #include <commdlg.h>
        !            18: #include <cderr.h>
        !            19: #include <winspool.h>
        !            20: #include <string.h>
        !            21: #include "lookup.h"
        !            22: #include "printer.h"
        !            23: #include "paint.h"
        !            24: #include "toolbar.h"
        !            25: #include "vars.h"
        !            26: 
        !            27: 
        !            28: 
        !            29: /************************************************************************\
        !            30: *
        !            31: *  FUNCTION:   ToolbarProc (standard dialog procedure INPUTS/RETURNS)
        !            32: *
        !            33: *  GLOBAL VARS: hWndToolbar - toolbar window handle
        !            34: *               DriverName - of current printer
        !            35: *               DeviceName - of current printer
        !            36: *               Port       - of current printer
        !            37: *
        !            38: \************************************************************************/
        !            39: 
        !            40: BOOL APIENTRY ToolbarProc (HWND hDlg,UINT message,UINT wParam,LONG lParam)
        !            41: {
        !            42:   static HBITMAP ahbmUpBtn[MAXBUTTONS], ahbmDnBtn[MAXBUTTONS];
        !            43: 
        !            44:   static int    iCurrBtn, iLastBtn;
        !            45: 
        !            46:   int i;
        !            47: 
        !            48:   switch (message)
        !            49:   {
        !            50:     case WM_INITDIALOG:
        !            51: 
        !            52:       hWndToolbar = hDlg;
        !            53: 
        !            54:       ahbmUpBtn[DID_PRTDLG] = LoadBitmap (hInst, "prtdlgup");
        !            55:       ahbmUpBtn[DID_PRINT]  = LoadBitmap (hInst, "printup");
        !            56:       ahbmUpBtn[DID_ENUM]   = LoadBitmap (hInst, "enumup");
        !            57:       ahbmUpBtn[DID_DEVCAP] = LoadBitmap (hInst, "devcapup");
        !            58:       ahbmUpBtn[DID_DELTA]  = LoadBitmap (hInst, "deltaup");
        !            59: 
        !            60:       ahbmDnBtn[DID_PRTDLG] = LoadBitmap (hInst, "prtdlgdn");
        !            61:       ahbmDnBtn[DID_PRINT]  = LoadBitmap (hInst, "printdn");
        !            62:       ahbmDnBtn[DID_ENUM]   = LoadBitmap (hInst, "enumdn");
        !            63:       ahbmDnBtn[DID_DEVCAP] = LoadBitmap (hInst, "devcapdn");
        !            64:       ahbmDnBtn[DID_DELTA]  = LoadBitmap (hInst, "deltadn");
        !            65: 
        !            66:       SetWindowPos (hDlg, HWND_TOP, -1, 0,
        !            67:                    GetSystemMetrics (SM_CXFULLSCREEN) + 2,
        !            68:                    TOOLBARHEIGHT, SWP_SHOWWINDOW);
        !            69:       SetWindowPos (GetDlgItem (hDlg, DID_TOOLBARCOMBO),
        !            70:                    HWND_TOP, 11*BUTTONWIDTH/2, 6, BUTTONWIDTH*8,
        !            71:                    BUTTONWIDTH*4, SWP_SHOWWINDOW);
        !            72: 
        !            73:       UpdateToolbarCombobox (hDlg);
        !            74: 
        !            75:       break;
        !            76: 
        !            77:     case WM_PAINT:
        !            78:     {
        !            79:       PAINTSTRUCT ps;
        !            80: 
        !            81:       BeginPaint (hDlg, &ps);
        !            82:       FillRect (ps.hdc, &ps.rcPaint, GetStockObject (GRAY_BRUSH));
        !            83: 
        !            84:       for (i = 0; i < MAXBUTTONS; i++)
        !            85:        vDrawBitmap (ps.hdc, ahbmUpBtn[i], i*BUTTONWIDTH, 0);
        !            86: 
        !            87:       MoveToEx (ps.hdc, BUTTONWIDTH*5, 0, NULL);
        !            88:       LineTo   (ps.hdc, BUTTONWIDTH*5, TOOLBARHEIGHT);
        !            89:       EndPaint (hDlg, &ps);
        !            90:       break;
        !            91:     }
        !            92: 
        !            93:     case WM_LBUTTONDOWN:
        !            94: 
        !            95:       if ((iCurrBtn = iGetBtn (lParam)) >= 0)
        !            96:       {
        !            97:        HDC hdc = GetDC (hDlg);
        !            98:        iLastBtn = iCurrBtn;
        !            99:        vDrawBitmap (hdc, ahbmDnBtn[iCurrBtn], iCurrBtn*BUTTONWIDTH, 0);
        !           100:        ReleaseDC (hDlg, hdc);
        !           101:        SetCapture (hDlg);
        !           102:       }
        !           103:       break;
        !           104: 
        !           105:     case WM_MOUSEMOVE:
        !           106: 
        !           107:       if (GetCapture() == hDlg)
        !           108:       {
        !           109:        HDC hdc = GetDC (hDlg);
        !           110: 
        !           111:        if ((iCurrBtn = iGetBtn (lParam)) >= 0 && iCurrBtn != iLastBtn)
        !           112: 
        !           113:          vDrawBitmap (hdc, ahbmDnBtn[iCurrBtn], iCurrBtn*BUTTONWIDTH, 0);
        !           114: 
        !           115:        if ((iCurrBtn != iLastBtn) && (iLastBtn >= 0))
        !           116: 
        !           117:          vDrawBitmap (hdc, ahbmUpBtn[iLastBtn], iLastBtn*BUTTONWIDTH, 0);
        !           118: 
        !           119:        ReleaseDC (hDlg, hdc);
        !           120:        iLastBtn = iCurrBtn;
        !           121:       }
        !           122:       break;
        !           123: 
        !           124:     case WM_LBUTTONUP:
        !           125: 
        !           126:       if (GetCapture() == hDlg)
        !           127:       {
        !           128:        if ((iCurrBtn = iGetBtn (lParam)) >= 0)
        !           129:        {
        !           130:          HDC hdc = GetDC (hDlg);
        !           131: 
        !           132:          vDrawBitmap (hdc, ahbmUpBtn[iCurrBtn], iCurrBtn*BUTTONWIDTH, 0);
        !           133: 
        !           134:          ReleaseDC (hDlg, hdc);
        !           135: 
        !           136:          vDoBtnCmd (iCurrBtn);
        !           137:        }
        !           138:        ReleaseCapture ();
        !           139:       }
        !           140:       break;
        !           141: 
        !           142:     case WM_COMMAND:
        !           143: 
        !           144:       switch (LOWORD(wParam))
        !           145:       {
        !           146:        case DID_TOOLBARCOMBO:
        !           147: 
        !           148:           switch (HIWORD(wParam))
        !           149:          {
        !           150:            case CBN_SELCHANGE:
        !           151:            {
        !           152:              DWORD dwIndex;
        !           153:              char  buf[256];
        !           154: 
        !           155:              /****************************************************************\
        !           156:               *  User clicked on one of the items in the toolbar combobox;
        !           157:               *  figure out which item, then parse the text apart and
        !           158:               *  copy it to the DriverName, DeviceName, and Port
        !           159:               *  variables.
        !           160:              \****************************************************************/
        !           161: 
        !           162:               dwIndex = (DWORD) SendMessage ((HWND) lParam,
        !           163:                                              CB_GETCURSEL, 0, 0);
        !           164:               SendMessage ((HWND) lParam, CB_GETLBTEXT, dwIndex,
        !           165:                            (LONG) buf);
        !           166: 
        !           167:               if (!strcmp (buf, "Display"))
        !           168:               {
        !           169:                 strcpy (DeviceName, "Display");
        !           170:                 EnableWindow (GetDlgItem (hDlg, DID_PRINT), FALSE);
        !           171:               }
        !           172:               else
        !           173:               { int i = -1, j = 0;
        !           174: 
        !           175:                 while (buf[++i] != ';') DeviceName[i] = buf[i];
        !           176:                 DeviceName[i] = '\0';
        !           177:                 while (buf[++i] != ';') Port[j++] = buf[i];
        !           178:                 Port[j] = '\0';
        !           179:                 j = 0;
        !           180:                 while (buf[++i] != '\0') DriverName[j++] = buf[i];
        !           181:                 DriverName[j] = '\0';
        !           182:                 EnableWindow (GetDlgItem (hDlg, DID_PRINT),    TRUE);
        !           183:               }
        !           184:               break;
        !           185:             }
        !           186:           }
        !           187:           break;
        !           188:       }
        !           189:       break;
        !           190: 
        !           191:     default:
        !           192: 
        !           193:       return FALSE;
        !           194:   }
        !           195:   return (TRUE);
        !           196: }
        !           197: 
        !           198: 
        !           199: 
        !           200: /******************************************************************************\
        !           201: *
        !           202: *  FUNCTION:    UpdateToolbarCombobox
        !           203: *
        !           204: *  GLOBAL VARS: hWndToolbar - toolbar window handle
        !           205: *
        !           206: *  LOCAL VARS:  dwEnumFlags   - which printers to enumerate
        !           207: *               dwBytesNeeded - # of bytes required to contain
        !           208: *                               PRINTER_INFO_2 info for all printers
        !           209: *               pwPrtRet      - number of printers (info) returned
        !           210: *               pPrtInfo2     - pointer to PRINTER_INFO_2 structs
        !           211: *               i             - loop variable
        !           212: *
        !           213: *  COMMENTS:    The idea here is to enumerate all printers & list them in
        !           214: *               then combobox in the form: "DEVICE_NAME;PORT;DRIVER_NAME".
        !           215: *               Then later, when a user selects one of these, we just
        !           216: *               query out the string & parse it apart, sticking the
        !           217: *               appropriate parts into the DriverName, DeviceName, and
        !           218: *               Port variables.
        !           219: *
        !           220: *               Also, the "Display" option is added to the combobox so
        !           221: *               that user can get DevCaps info about it.
        !           222: *
        !           223: \******************************************************************************/
        !           224: 
        !           225: void UpdateToolbarCombobox (HWND hDlg)
        !           226: {
        !           227:   DWORD            dwFlags = PRINTER_ENUM_FAVORITE | PRINTER_ENUM_LOCAL;
        !           228:   LPPRINTER_INFO_2 pPrinters;
        !           229:   DWORD                   cbPrinters;
        !           230:   DWORD                   cReturned, i;
        !           231:   char            buf[256];
        !           232: 
        !           233:   EnumPrinters (dwFlags, NULL, 2, NULL, 0, &cbPrinters,
        !           234:                 &cReturned);
        !           235: 
        !           236:   pPrinters = (LPPRINTER_INFO_2) LocalAlloc (LPTR, cbPrinters + 4);
        !           237: 
        !           238:   EnumPrinters (dwFlags, NULL, 2, (LPBYTE) pPrinters,
        !           239:                 cbPrinters, &cbPrinters, &cReturned);
        !           240: 
        !           241:   SendDlgItemMessage (hDlg, DID_TOOLBARCOMBO, CB_RESETCONTENT, 0, 0);
        !           242: 
        !           243:   for (i = 0; i < cReturned; i++)
        !           244:   {
        !           245:     /**************************************************************************\
        !           246:     * for each printer in the PRINTER_INFO_2 array: build a string that
        !           247:     * looks like "DEVICE_NAME;PORT;DRIVER_NAME"
        !           248:     \**************************************************************************/
        !           249: 
        !           250:     strcpy (buf, (pPrinters + i)->pPrinterName);
        !           251:     strcat (buf, ";");
        !           252:     strcat (buf, (pPrinters + i)->pPortName);
        !           253:     strcat (buf, ";");
        !           254:     strcat (buf, (pPrinters + i)->pDriverName);
        !           255: 
        !           256:     SendDlgItemMessage (hDlg, DID_TOOLBARCOMBO, CB_INSERTSTRING, (UINT)-1,
        !           257:                         (LONG) buf);
        !           258:   }
        !           259: 
        !           260:   SendDlgItemMessage (hDlg, DID_TOOLBARCOMBO, CB_INSERTSTRING, (UINT)-1,
        !           261:                       (LONG) "Display");
        !           262: 
        !           263:   SendDlgItemMessage (hDlg, DID_TOOLBARCOMBO, CB_SELECTSTRING, (UINT)-1,
        !           264:                      (LONG) buf);
        !           265: 
        !           266:   SendMessage (hDlg, WM_COMMAND,
        !           267:                (UINT) MAKELONG (DID_TOOLBARCOMBO, CBN_SELCHANGE),
        !           268:                (LONG) GetDlgItem (hDlg, DID_TOOLBARCOMBO));
        !           269: }
        !           270: 
        !           271: 
        !           272: 
        !           273: /******************************************************************************\
        !           274: *
        !           275: *  FUNCTION:   vDrawBitmap
        !           276: *
        !           277: *  INPUTS:      hdc    - device context in which to draw bitmap
        !           278: *               hbm    - handle of bitmap to draw
        !           279: *               xStart - x-coordinate of upper-left corner of destination
        !           280: *                        rectangle
        !           281: *               yStart - y-coordinate of upper-left corner of destination
        !           282: *                        rectangle
        !           283: *
        !           284: *  LOCAL VARS:  bm     - BITMAP info of "hbm"
        !           285: *               hdcMem - a memory DC used for blt-ing
        !           286: *
        !           287: *  COMMENTS:    Draws a bitmap "hbm" in a DC "hdc" given the upper-left
        !           288: *               corner "xStart,yStart" of a destination rectangle.
        !           289: *
        !           290: \******************************************************************************/
        !           291: 
        !           292: void vDrawBitmap (HDC hdc, HBITMAP hbm, int xStart, int yStart)
        !           293: {
        !           294:   BITMAP bm;
        !           295:   HDC    hdcMem;
        !           296: 
        !           297:   hdcMem = CreateCompatibleDC (hdc);
        !           298:   SelectObject (hdcMem, hbm);
        !           299:   SetMapMode (hdcMem, GetMapMode(hdc));
        !           300: 
        !           301:   GetObject (hbm, sizeof(BITMAP), (LPSTR)&bm);
        !           302:   BitBlt (hdc, xStart, yStart, bm.bmWidth, bm.bmHeight,
        !           303:           hdcMem, 0, 0, SRCCOPY);
        !           304: 
        !           305:   DeleteDC(hdcMem);
        !           306: }
        !           307: 
        !           308: 
        !           309: 
        !           310: /******************************************************************************\
        !           311: *
        !           312: *  FUNCTION:    iGetBtn
        !           313: *
        !           314: *  INPUTS:      lParam - lParam of a WM_MOUSEMOVE/WM_LBUTTON* msg
        !           315: *
        !           316: *  RETURNS:     Index of button, or
        !           317: *               -1 if no button in specified position
        !           318: *
        !           319: *  LOCAL VARS:  xPos - x position of mouse
        !           320: *
        !           321: *  COMMENTS:    Given an x,y position (in an lParam) finds the corresponding
        !           322: *               toolbar button
        !           323: *
        !           324: \******************************************************************************/
        !           325: 
        !           326: int iGetBtn (LONG lParam)
        !           327: {
        !           328:   int xPos = (int) LOWORD (lParam), i;
        !           329: 
        !           330:   for (i = 1; i <= MAXBUTTONS; i++)
        !           331: 
        !           332:     if (xPos <= i*BUTTONWIDTH)
        !           333: 
        !           334:       return i-1;
        !           335: 
        !           336:   return -1;
        !           337: }
        !           338: 
        !           339: 
        !           340: 
        !           341: /******************************************************************************\
        !           342: *
        !           343: *  FUNCTION:    vDoBtnCmd
        !           344: *
        !           345: *  INPUTS:      cmd - index of which button pressed
        !           346: *
        !           347: *  GLOBAL VARS: hWndMain - main app window handle
        !           348: *               hInst    - app instance
        !           349: *
        !           350: *  COMMENTS:    Implements button-specific code
        !           351: *
        !           352: \******************************************************************************/
        !           353: 
        !           354: void vDoBtnCmd (int cmd)
        !           355: {
        !           356:   switch (cmd)
        !           357:   {
        !           358:     case DID_PRTDLG:
        !           359:     case DID_PRINT:
        !           360:     {
        !           361:       LPVOID lpArg;
        !           362:       DWORD  threadId;
        !           363: 
        !           364:       /************************************************************************\
        !           365:       *  Start a print thread, passing it either NULL or 0xffffffff
        !           366:       *  if we want to call PrintDlg or do a CreateDC, respectively.
        !           367:       \************************************************************************/
        !           368: 
        !           369:       if (cmd == DID_PRINT)
        !           370:        lpArg = (LPVOID) 0xffffffff;
        !           371:       else
        !           372:        lpArg = NULL;
        !           373: 
        !           374:       if (!CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) PrintThread,
        !           375:                         lpArg, NULL, &threadId))
        !           376:        MessageBox (hWndMain,
        !           377:                    "MainWndProc(): Error creating print thread",
        !           378:                    "Err! - PRINTX", MB_OK | MB_ICONHAND);
        !           379:       break;
        !           380:     }
        !           381:     case DID_ENUM:
        !           382: 
        !           383:       DialogBox (hInst, "AboutBox", hWndMain, (DLGPROC)EnumDlgProc);
        !           384:       break;
        !           385: 
        !           386:     case DID_DEVCAP:
        !           387: 
        !           388:       DialogBox (hInst, "AboutBox", hWndMain, (DLGPROC)DevCapDlgProc);
        !           389:       break;
        !           390: 
        !           391:     case DID_DELTA:
        !           392: 
        !           393:       UpdateToolbarCombobox (hWndToolbar);
        !           394:       break;
        !           395:   }
        !           396: }
        !           397: 
        !           398: 
        !           399: 
        !           400: /******************************************************************************\
        !           401: *
        !           402: *  FUNCTION:    PrintThread
        !           403: *
        !           404: *  INPUTS:      arg - if nonzero then open a printer DC using CreateDC,
        !           405: *                     else call PRintDlg() to get a printer DC.
        !           406: *
        !           407: *  GLOBAL VARS: DriverName - of current printer
        !           408: *               DeviceName - of current printer
        !           409: *               Port       - of current printer
        !           410: *               hwndMain   - main app window handle
        !           411: *               iMapMode   - current map mode
        !           412: *
        !           413: *  LOCAL VARS:  hdc  - printer DC
        !           414: *               di   - required struct for calling PrintDlg()
        !           415: *               rect - scratch rectangle
        !           416: *
        !           417: \******************************************************************************/
        !           418: 
        !           419: void PrintThread (LPVOID arg)
        !           420: {
        !           421:   HDC    hdc;
        !           422:   DOCINFO di;
        !           423:   RECT    rect;
        !           424: 
        !           425:   if (arg)
        !           426:   {
        !           427:     if (!strcmp (DeviceName, "Display"))
        !           428:     {
        !           429:       MessageBox (hWndMain, "You must select a printer",
        !           430:                   "PRINTER.EXE: Error creating DC", MB_OK);
        !           431:       return;
        !           432:     }
        !           433:     else if (!(hdc = CreateDC (DriverName, DeviceName, Port, NULL)))
        !           434:     {
        !           435:       MessageBox (hWndMain, "PrintThread(): CreateDC() failed",
        !           436:                   "Err! - PRINTX", MB_OK);
        !           437:       return;
        !           438:     }
        !           439:   }
        !           440:   else
        !           441:   {
        !           442:     PRINTDLG  pd;
        !           443: 
        !           444:     /**************************************************************************\
        !           445:     *  Initialize a PRINTDLG struct and call PrintDlg to allow user to
        !           446:     *  specify various printing options...
        !           447:     \**************************************************************************/
        !           448: 
        !           449:     memset (&pd, 0, sizeof(PRINTDLG));
        !           450: 
        !           451:     pd.lStructSize = sizeof(PRINTDLG);
        !           452:     pd.hwndOwner   = hWndMain;
        !           453:     pd.Flags      = PD_RETURNDC | PD_PRINTSETUP;
        !           454:     pd.hInstance   = NULL;
        !           455: 
        !           456:     PrintDlg(&pd);
        !           457:     hdc = pd.hDC;
        !           458:     if (pd.hDevMode)
        !           459:       GlobalFree (pd.hDevMode);
        !           460:     if (pd.hDevNames)
        !           461:       GlobalFree (pd.hDevNames);
        !           462:     if (!hdc)
        !           463:       return;
        !           464:   }
        !           465: 
        !           466:   SetMapMode (hdc, iMapMode);
        !           467:   rect.right  = GetDeviceCaps (hdc, HORZRES);
        !           468:   rect.bottom = GetDeviceCaps (hdc, VERTRES);
        !           469:   di.cbSize = sizeof(DOCINFO);
        !           470:   di.lpszDocName = "print test";
        !           471:   di.lpszOutput  = NULL;
        !           472: 
        !           473:   StartDoc  (hdc, &di);
        !           474:   StartPage (hdc);
        !           475:     Paint   (hdc, &rect);
        !           476:   EndPage   (hdc);
        !           477:   EndDoc    (hdc);
        !           478:   DeleteDC  (hdc);
        !           479: }

unix.superglobalmegacorp.com

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