Annotation of mstools/samples/sdktools/dlgedit/toolbox.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /****************************** Module Header *******************************
                     13: * Module Name: toolbox.c
                     14: *
                     15: * Contains routines that handle the toolbox.
                     16: *
                     17: * Functions:
                     18: *
                     19: *    ToolboxShow()
                     20: *    ToolboxOnTop()
                     21: *    ToolboxWndProc()
                     22: *    ToolBtnWndProc()
                     23: *    ToolboxSelectTool()
                     24: *    ToolboxCreate()
                     25: *    ToolboxDrawBitmap()
                     26: *
                     27: * Comments:
                     28: *
                     29: ****************************************************************************/
                     30: 
                     31: #include "dlgedit.h"
                     32: #include "dlgfuncs.h"
                     33: #include "dlgextrn.h"
                     34: 
                     35: #include "dialogs.h"
                     36: 
                     37: 
                     38: #define TOOLBOXMARGIN   2       // Pixels around the buttons in the Toolbox.
                     39: #define TOOLBOXCOLUMNS  2       // Columns in the Toolbox.
                     40: 
                     41: /*
                     42:  * Style of the toolbox window.
                     43:  */
                     44: #define TOOLBOXSTYLE    (WS_POPUP | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU)
                     45: 
                     46: STATICFN VOID ToolboxCreate(VOID);
                     47: STATICFN VOID ToolboxDrawBitmap(HDC hDC, INT type);
                     48: 
                     49: /*
                     50:  * Dimensions of a tool button bitmap.
                     51:  */
                     52: static INT cxToolBtn;
                     53: static INT cyToolBtn;
                     54: 
                     55: 
                     56: 
                     57: /****************************************************************************
                     58: * ToolboxShow
                     59: *
                     60: * This function shows or hides the toolbox window.  It will create
                     61: * the Toolbox if necessary.
                     62: *
                     63: * Arguments:
                     64: *   BOOL fShow - whether to show or hide the toolbox window.
                     65: *
                     66: ****************************************************************************/
                     67: 
                     68: VOID ToolboxShow(
                     69:     BOOL fShow)
                     70: {
                     71:     if (fShow) {
                     72:         /*
                     73:          * Don't allow a toolbox to be shown in Translate mode.
                     74:          */
                     75:         if (gfTranslateMode)
                     76:             return;
                     77: 
                     78:         /*
                     79:          * Create it if it doesn't exist yet.
                     80:          */
                     81:         if (!ghwndToolbox)
                     82:             ToolboxCreate();
                     83: 
                     84:         if (ghwndToolbox)
                     85:             ShowWindow(ghwndToolbox, SW_SHOWNA);
                     86:     }
                     87:     else {
                     88:         if (ghwndToolbox)
                     89:             ShowWindow(ghwndToolbox, SW_HIDE);
                     90:     }
                     91: }
                     92: 
                     93: 
                     94: 
                     95: /****************************************************************************
                     96: * ToolboxOnTop
                     97: *
                     98: * This function positions the toolbox window on top.  It needs to be
                     99: * called any time that a new dialog window is created to be sure the
                    100: * dialog does not cover the toolbox.
                    101: *
                    102: * It can be called even if the toolbox is not created yet (it will
                    103: * be a noop in that case).
                    104: *
                    105: ****************************************************************************/
                    106: 
                    107: VOID ToolboxOnTop(VOID)
                    108: {
                    109:    if (ghwndToolbox) {
                    110:        SetWindowPos(ghwndToolbox, NULL, 0, 0, 0, 0,
                    111:                SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
                    112:    }
                    113: }
                    114: 
                    115: 
                    116: 
                    117: /****************************************************************************
                    118: * ToolboxCreate
                    119: *
                    120: * This function creates the toolbox window.
                    121: *
                    122: ****************************************************************************/
                    123: 
                    124: STATICFN VOID ToolboxCreate(VOID)
                    125: {
                    126:     BITMAP bmp;
                    127:     INT i;
                    128:     INT x;
                    129:     INT y;
                    130:     INT cx;
                    131:     INT cy;
                    132:     INT cxDummy;
                    133:     INT cyDummy;
                    134:     RECT rc;
                    135:     RECT rcSubClient;
                    136:     BOOL fMaximized;
                    137: 
                    138:     /*
                    139:      * Load the bitmaps.
                    140:      */
                    141:     if (!(ghbmPointerToolUp = LoadBitmap(ghInst,
                    142:             MAKEINTRESOURCE(IDBM_TUPOINTR))) ||
                    143:             !(ghbmPointerToolDown = LoadBitmap(ghInst,
                    144:             MAKEINTRESOURCE(IDBM_TDPOINTR))))
                    145:         return;
                    146: 
                    147:     for (i = 0; i < CCONTROLS; i++) {
                    148:         if (!(awcd[i].hbmToolBtnUp = LoadBitmap(ghInst,
                    149:                 MAKEINTRESOURCE(awcd[i].idbmToolBtnUp))))
                    150:             return;
                    151: 
                    152:         if (!(awcd[i].hbmToolBtnDown = LoadBitmap(ghInst,
                    153:                 MAKEINTRESOURCE(awcd[i].idbmToolBtnDown))))
                    154:             return;
                    155:     }
                    156: 
                    157:     /*
                    158:      * Get the dimensions of the tool button bitmaps.
                    159:      */
                    160:     GetObject(awcd[0].hbmToolBtnUp, sizeof(BITMAP), &bmp);
                    161:     cxToolBtn = bmp.bmWidth;
                    162:     cyToolBtn = bmp.bmHeight;
                    163: 
                    164:     /*
                    165:      * Calculate the required window size for the client area
                    166:      * size we want.  The size leaves room for a margin, and
                    167:      * assumes that adjacent buttons overlap their borders by
                    168:      * one pixel.
                    169:      */
                    170:     rc.left = 0;
                    171:     rc.top = 0;
                    172:     rc.right = TOOLBOXMARGIN + ((cxToolBtn - 1) * 2) + 1 + TOOLBOXMARGIN;
                    173:     rc.bottom = TOOLBOXMARGIN + ((cyToolBtn - 1) *
                    174:             ((CCONTROLS / 2) + 1)) + 1 + TOOLBOXMARGIN;
                    175:     AdjustWindowRect(&rc, TOOLBOXSTYLE, FALSE);
                    176:     cx = rc.right - rc.left;
                    177:     cy = rc.bottom - rc.top;
                    178: 
                    179:     /*
                    180:      * Get the saved position of the Toolbox.  Note that we throw away
                    181:      * the size fields, because we just calculated the required size.
                    182:      */
                    183:     if (!ReadWindowPos(szTBPos, &x, &y, &cxDummy, &cyDummy, &fMaximized)) {
                    184:         /*
                    185:          * The previous position of the Toolbox  couldn't be found.
                    186:          * Position the toolbox to the upper right corner of the
                    187:          * "client" area of the editor, but make sure it is completely
                    188:          * visible.
                    189:          */
                    190:         GetWindowRect(ghwndSubClient, &rcSubClient);
                    191:         x = rcSubClient.right - cx - (2 * TOOLBOXMARGIN);
                    192:         y = rcSubClient.top + (2 * TOOLBOXMARGIN);
                    193:         SetRect(&rc, x, y, x + cx, y + cy);
                    194:         FitRectToScreen(&rc);
                    195:         x = rc.left;
                    196:         y = rc.top;
                    197:     }
                    198: 
                    199:     /*
                    200:      * Create the toolbox window.
                    201:      */
                    202:     if (!(ghwndToolbox = CreateWindow(szToolboxClass, NULL, TOOLBOXSTYLE,
                    203:             x, y, cx, cy, ghwndMain, NULL, ghInst, NULL)))
                    204:         return;
                    205: 
                    206:     /*
                    207:      * Create the Pointer (W_NOTHING) button.
                    208:      */
                    209:     CreateWindow(szToolBtnClass, NULL,
                    210:             WS_CHILD | WS_VISIBLE,
                    211:             TOOLBOXMARGIN, TOOLBOXMARGIN, (cxToolBtn * 2) - 1, cyToolBtn,
                    212:             ghwndToolbox, (HMENU)W_NOTHING, ghInst, NULL);
                    213: 
                    214:     /*
                    215:      * Create the other buttons.
                    216:      */
                    217:     x = TOOLBOXMARGIN;
                    218:     y = TOOLBOXMARGIN + cyToolBtn - 1;
                    219:     for (i = 0; i < CCONTROLS; i++) {
                    220:         CreateWindow(szToolBtnClass, NULL,
                    221:                 WS_CHILD | WS_VISIBLE,
                    222:                 x, y, cxToolBtn, cyToolBtn,
                    223:                 ghwndToolbox, (HMENU)i, ghInst, NULL);
                    224: 
                    225:         if (x == TOOLBOXMARGIN) {
                    226:             x += cxToolBtn - 1;
                    227:         }
                    228:         else {
                    229:             x = TOOLBOXMARGIN;
                    230:             y += cyToolBtn - 1;
                    231:         }
                    232:     }
                    233: }
                    234: 
                    235: 
                    236: 
                    237: /****************************************************************************
                    238: * ToolboxWndProc
                    239: *
                    240: * This is the window procedure for the toolbox window.
                    241: *
                    242: ****************************************************************************/
                    243: 
                    244: WINDOWPROC ToolboxWndProc(
                    245:     HWND hwnd,
                    246:     UINT msg,
                    247:     WPARAM wParam,
                    248:     LPARAM lParam)
                    249: {
                    250:     switch (msg) {
                    251:         case WM_CREATE:
                    252:             {
                    253:                 HMENU hmenu = GetSystemMenu(hwnd, FALSE);
                    254: 
                    255:                 RemoveMenu(hmenu, 7, MF_BYPOSITION);    // Second separator.
                    256:                 RemoveMenu(hmenu, 5, MF_BYPOSITION);    // First separator.
                    257: 
                    258:                 RemoveMenu(hmenu, SC_RESTORE, MF_BYCOMMAND);
                    259:                 RemoveMenu(hmenu, SC_SIZE, MF_BYCOMMAND);
                    260:                 RemoveMenu(hmenu, SC_MINIMIZE, MF_BYCOMMAND);
                    261:                 RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND);
                    262:                 RemoveMenu(hmenu, SC_TASKLIST, MF_BYCOMMAND);
                    263:             }
                    264: 
                    265:             return 0;
                    266: 
                    267:         case WM_KEYDOWN:
                    268:             {
                    269:                 INT iToolNext;
                    270: 
                    271:                 switch (wParam) {
                    272:                     case VK_UP:
                    273:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    274:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    275:                             break;
                    276: 
                    277:                         /*
                    278:                          * Go up a row, but don't go beyond the top.
                    279:                          */
                    280:                         iToolNext = gCurTool - TOOLBOXCOLUMNS;
                    281:                         if (iToolNext < 0)
                    282:                             iToolNext = W_NOTHING;
                    283: 
                    284:                         ToolboxSelectTool(iToolNext, FALSE);
                    285: 
                    286:                         break;
                    287: 
                    288:                     case VK_DOWN:
                    289:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    290:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    291:                             break;
                    292: 
                    293:                         if (gCurTool == W_NOTHING) {
                    294:                             iToolNext = 0;
                    295:                         }
                    296:                         else {
                    297:                             /*
                    298:                              * Go down a row, but don't go beyond the bottom.
                    299:                              */
                    300:                             iToolNext = gCurTool + TOOLBOXCOLUMNS;
                    301:                             if (iToolNext >= CCONTROLS)
                    302:                                 break;
                    303:                         }
                    304: 
                    305:                         ToolboxSelectTool(iToolNext, FALSE);
                    306: 
                    307:                         break;
                    308: 
                    309:                     case VK_LEFT:
                    310:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    311:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    312:                             break;
                    313: 
                    314:                         if (gCurTool == W_NOTHING ||
                    315:                                 !(gCurTool % TOOLBOXCOLUMNS))
                    316:                             break;
                    317: 
                    318:                         /*
                    319:                          * Go left a column.
                    320:                          */
                    321:                         ToolboxSelectTool(gCurTool - 1, FALSE);
                    322: 
                    323:                         break;
                    324: 
                    325:                     case VK_RIGHT:
                    326:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    327:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    328:                             break;
                    329: 
                    330:                         if (gCurTool == W_NOTHING ||
                    331:                                 (gCurTool % TOOLBOXCOLUMNS) ==
                    332:                                 TOOLBOXCOLUMNS - 1)
                    333:                             break;
                    334: 
                    335:                         /*
                    336:                          * Go right a column.
                    337:                          */
                    338:                         ToolboxSelectTool(gCurTool + 1, FALSE);
                    339: 
                    340:                         break;
                    341: 
                    342:                     case VK_TAB:
                    343:                         if (GetKeyState(VK_CONTROL) & 0x8000)
                    344:                             break;
                    345: 
                    346:                         /*
                    347:                          * Is the shift key pressed also?
                    348:                          */
                    349:                         if (GetKeyState(VK_SHIFT) & 0x8000) {
                    350:                             if (gCurTool == W_NOTHING)
                    351:                                 iToolNext = CCONTROLS - 1;
                    352:                             else if (gCurTool == 0)
                    353:                                 iToolNext = W_NOTHING;
                    354:                             else
                    355:                                 iToolNext = gCurTool - 1;
                    356:                         }
                    357:                         else {
                    358:                             if (gCurTool == W_NOTHING)
                    359:                                 iToolNext = 0;
                    360:                             else if (gCurTool == CCONTROLS - 1)
                    361:                                 iToolNext = W_NOTHING;
                    362:                             else
                    363:                                 iToolNext = gCurTool + 1;
                    364:                         }
                    365: 
                    366:                         ToolboxSelectTool(iToolNext, FALSE);
                    367: 
                    368:                         break;
                    369: 
                    370:                     case VK_END:
                    371:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    372:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    373:                             break;
                    374: 
                    375:                         ToolboxSelectTool(CCONTROLS - 1, FALSE);
                    376: 
                    377:                         break;
                    378: 
                    379:                     case VK_HOME:
                    380:                     case VK_ESCAPE:
                    381:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    382:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    383:                             break;
                    384: 
                    385:                         ToolboxSelectTool(W_NOTHING, FALSE);
                    386: 
                    387:                         break;
                    388:                 }
                    389:             }
                    390: 
                    391:             break;
                    392: 
                    393:         case WM_ACTIVATE:
                    394:             if (LOWORD(wParam))
                    395:                 gidCurrentDlg = DID_TOOLBOX;
                    396: 
                    397:             break;
                    398: 
                    399:         case WM_CLOSE:
                    400:             /*
                    401:              * The user closed the toolbox from the system menu.
                    402:              * Hide the toolbox (we don't actually destroy it so
                    403:              * that it will appear in the same spot when they show
                    404:              * it again).
                    405:              */
                    406:             ToolboxShow(FALSE);
                    407:             gfShowToolbox = FALSE;
                    408:             break;
                    409: 
                    410:         case WM_DESTROY:
                    411:             {
                    412:                 INT i;
                    413:                 RECT rc;
                    414: 
                    415:                 DeleteObject(ghbmPointerToolUp);
                    416:                 ghbmPointerToolUp = NULL;
                    417:                 DeleteObject(ghbmPointerToolDown);
                    418:                 ghbmPointerToolDown = NULL;
                    419: 
                    420:                 for (i = 0; i < CCONTROLS; i++) {
                    421:                     DeleteObject(awcd[i].hbmToolBtnUp);
                    422:                     awcd[i].hbmToolBtnUp = NULL;
                    423:                     DeleteObject(awcd[i].hbmToolBtnDown);
                    424:                     awcd[i].hbmToolBtnDown = NULL;
                    425:                 }
                    426: 
                    427:                 /*
                    428:                  * Save the position of the toolbox.
                    429:                  */
                    430:                 GetWindowRect(hwnd, &rc);
                    431:                 WriteWindowPos(&rc, FALSE, szTBPos);
                    432: 
                    433:                 /*
                    434:                  * Null out the global window handle for the toolbox
                    435:                  * for safety's sake.
                    436:                  */
                    437:                 ghwndToolbox = NULL;
                    438:             }
                    439: 
                    440:             break;
                    441: 
                    442:         default:
                    443:             return DefWindowProc(hwnd, msg, wParam, lParam);
                    444:     }
                    445: 
                    446:     return 0;
                    447: }
                    448: 
                    449: 
                    450: 
                    451: /****************************************************************************
                    452: * ToolBtnWndProc
                    453: *
                    454: * This is the window procedure for the buttons in the toolbox window.
                    455: *
                    456: ****************************************************************************/
                    457: 
                    458: WINDOWPROC ToolBtnWndProc(
                    459:     HWND hwnd,
                    460:     UINT msg,
                    461:     WPARAM wParam,
                    462:     LPARAM lParam)
                    463: {
                    464:     switch (msg) {
                    465:         case WM_LBUTTONDOWN:
                    466:             /*
                    467:              * Be sure any outstanding changes get applied
                    468:              * without errors.
                    469:              */
                    470:             if (!StatusApplyChanges())
                    471:                 return TRUE;
                    472: 
                    473:             /*
                    474:              * Select the tool that was clicked on.  If the Ctrl
                    475:              * key is down, lock the tool also.
                    476:              */
                    477:             ToolboxSelectTool((UINT)GetWindowLong((hwnd), GWL_ID),
                    478:                     (GetKeyState(VK_CONTROL) & 0x8000) ? TRUE : FALSE);
                    479: 
                    480:             break;
                    481: 
                    482:         case WM_PAINT:
                    483:             {
                    484:                 HDC hDC;
                    485:                 PAINTSTRUCT ps;
                    486: 
                    487:                 hDC = BeginPaint(hwnd, &ps);
                    488:                 ToolboxDrawBitmap(hDC, (UINT)GetWindowLong((hwnd), GWL_ID));
                    489:                 EndPaint(hwnd, &ps);
                    490:             }
                    491: 
                    492:             break;
                    493: 
                    494:         default:
                    495:             return DefWindowProc(hwnd, msg, wParam, lParam);
                    496:     }
                    497: 
                    498:     return 0;
                    499: }
                    500: 
                    501: 
                    502: 
                    503: /****************************************************************************
                    504: * ToolboxDrawBitmap
                    505: *
                    506: * Draws the current tool bitmap.
                    507: *
                    508: * Arguments:
                    509: *   HDC hDC - handle to the DC for the toolbox window.
                    510: *   INR type - type of bitmap to draw.
                    511: *
                    512: ****************************************************************************/
                    513: 
                    514: STATICFN VOID ToolboxDrawBitmap(
                    515:     HDC hDC,
                    516:     INT type)
                    517: {
                    518:     HDC hMemDC;
                    519:     HBITMAP hbm;
                    520:     HBITMAP hbmOld;
                    521:     INT cxBitmap;
                    522: 
                    523:     if (type == W_NOTHING) {
                    524:         hbm = (type == gCurTool) ? ghbmPointerToolDown : ghbmPointerToolUp;
                    525: 
                    526:         /*
                    527:          * Note that the size of the Pointer tool is twice the width
                    528:          * of the other bitmaps, but less one pixel.  This is because
                    529:          * the other tools overlap their adjacent borders.
                    530:          */
                    531:         cxBitmap = (cxToolBtn * 2) - 1;
                    532:     }
                    533:     else {
                    534:         hbm = (type == gCurTool) ?
                    535:                 awcd[type].hbmToolBtnDown : awcd[type].hbmToolBtnUp;
                    536:         cxBitmap = cxToolBtn;
                    537:     }
                    538: 
                    539:     /*
                    540:      * Draw the image.
                    541:      */
                    542:     hMemDC = CreateCompatibleDC(hDC);
                    543:     hbmOld = SelectObject(hMemDC, hbm);
                    544:     BitBlt(hDC, 0, 0, cxBitmap, cyToolBtn, hMemDC, 0, 0, SRCCOPY);
                    545:     SelectObject(hMemDC, hbmOld);
                    546:     DeleteDC(hMemDC);
                    547: }
                    548: 
                    549: 
                    550: 
                    551: /****************************************************************************
                    552: * ToolboxSelectTool
                    553: *
                    554: * This function selects a tool to be the current tool.
                    555: *
                    556: * Arguments:
                    557: *   INT type   - Type of control (one of the W_* defines).
                    558: *   BOOL fLock - TRUE if the tool should be locked down.
                    559: *
                    560: ****************************************************************************/
                    561: 
                    562: VOID ToolboxSelectTool(
                    563:     INT type,
                    564:     BOOL fLock)
                    565: {
                    566:     PWINDOWCLASSDESC pwcd;
                    567: 
                    568:     if (gCurTool != type) {
                    569:         /*
                    570:          * Set the current wcd global for the current tool type.
                    571:          * This will point to the WINDOWCLASSDESC structure of the
                    572:          * current tool.  If the Custom tool was selected, the user
                    573:          * is asked which of the installed custom controls that they
                    574:          * really want.
                    575:          */
                    576:         if (type == W_CUSTOM) {
                    577:             /*
                    578:              * There are no custom controls installed.  Beep and
                    579:              * return without doing anything.
                    580:              */
                    581:             if (!gpclHead) {
                    582:                 MessageBeep(0);
                    583:                 return;
                    584:             }
                    585: 
                    586:             /*
                    587:              * If there are multiple custom controls installed,
                    588:              * ask the user which one they want.  Note that they
                    589:              * can press Cancel and return NULL!
                    590:              */
                    591:             if (gpclHead->pclNext) {
                    592:                 if (!(pwcd = SelCustDialog()))
                    593:                     return;
                    594: 
                    595:                 gpwcdCurTool = pwcd;
                    596:             }
                    597:             else {
                    598:                 /*
                    599:                  * Since there is only one type of custom control
                    600:                  * installed, there is no need to ask the user
                    601:                  * which one they want.
                    602:                  */
                    603:                 gpwcdCurTool = gpclHead->pwcd;
                    604:             }
                    605:         }
                    606:         else {
                    607:             gpwcdCurTool = (type == W_NOTHING) ? NULL : &awcd[type];
                    608:         }
                    609: 
                    610:         /*
                    611:          * Force the previous and current buttons to repaint.
                    612:          */
                    613:         if (ghwndToolbox) {
                    614:             InvalidateRect(GetDlgItem(ghwndToolbox, gCurTool), NULL, FALSE);
                    615:             InvalidateRect(GetDlgItem(ghwndToolbox, type), NULL, FALSE);
                    616:         }
                    617: 
                    618:         /*
                    619:          * Set the current tool type global.  This will be W_CUSTOM for
                    620:          * all custom controls.
                    621:          */
                    622:         gCurTool = type;
                    623:     }
                    624: 
                    625:     gfToolLocked = fLock;
                    626: }

unix.superglobalmegacorp.com

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