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

1.1       root        1: /****************************************************************************/
                      2: /*                                                                          */
                      3: /*                         Microsoft Confidential                           */
                      4: /*                                                                          */
                      5: /*                 Copyright (c) Microsoft Corp.  1987, 1990                */
                      6: /*                           All Rights Reserved                            */
                      7: /*                                                                          */
                      8: /****************************************************************************/
                      9: /****************************** Module Header *******************************
                     10: * Module Name: toolbox.c
                     11: *
                     12: * Contains routines that handle the toolbox.
                     13: *
                     14: * History:
                     15: *
                     16: * 04/30/91 - Copied from DlgEdit.
                     17: *
                     18: ****************************************************************************/
                     19: 
                     20: #include "imagedit.h"
                     21: #include "dialogs.h"
                     22: 
                     23: 
                     24: #define TOOLBOXCOLUMNS  2       // Columns in the Toolbox.
                     25: 
                     26: /*
                     27:  * Style of the toolbox window.
                     28:  */
                     29: #define TOOLBOXSTYLE    (WS_POPUP | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU)
                     30: 
                     31: 
                     32: STATICFN VOID NEAR ToolboxDrawBitmap(HDC hDC, INT tool);
                     33: 
                     34: 
                     35: /*
                     36:  * Dimensions of a tool button bitmap.
                     37:  */
                     38: static INT cxToolBtn;
                     39: static INT cyToolBtn;
                     40: 
                     41: /*
                     42:  * Index to the last available tool.  If tools at the end of the
                     43:  * toolbox are disabled, this number gets lowered.
                     44:  */
                     45: static INT iToolLast = CTOOLS - 1;
                     46: 
                     47: 
                     48: 
                     49: /****************************************************************************
                     50: * ToolboxCreate
                     51: *
                     52: * This function creates the toolbox window.
                     53: *
                     54: * History:
                     55: *
                     56: ****************************************************************************/
                     57: 
                     58: VOID ToolboxCreate(VOID)
                     59: {
                     60:     BITMAP bmp;
                     61:     INT i;
                     62:     INT x;
                     63:     INT y;
                     64:     INT cx;
                     65:     INT cy;
                     66:     INT cxDummy;
                     67:     INT cyDummy;
                     68:     RECT rc;
                     69:     RECT rcClient;
                     70:     POINT pt;
                     71:     BOOL fMaximized;
                     72: 
                     73:     /*
                     74:      * Load the bitmaps.
                     75:      */
                     76:     for (i = 0; i < CTOOLS; i++) {
                     77:         if (!(gaTools[i].hbmToolBtnUp = LoadBitmap(ghInst,
                     78:                 MAKEINTRESOURCE(gaTools[i].idbmToolBtnUp))))
                     79:             return;
                     80: 
                     81:         if (!(gaTools[i].hbmToolBtnDown = LoadBitmap(ghInst,
                     82:                 MAKEINTRESOURCE(gaTools[i].idbmToolBtnDown))))
                     83:             return;
                     84:     }
                     85: 
                     86:     /*
                     87:      * Get the dimensions of the tool button bitmaps.
                     88:      */
                     89:     GetObject(gaTools[0].hbmToolBtnUp, sizeof(BITMAP), (PSTR)&bmp);
                     90:     cxToolBtn = bmp.bmWidth;
                     91:     cyToolBtn = bmp.bmHeight;
                     92: 
                     93:     /*
                     94:      * Calculate the required window size for the client area
                     95:      * size we want.  The size leaves room for a margin, and
                     96:      * assumes that adjacent buttons overlap their borders by
                     97:      * one pixel.
                     98:      */
                     99:     rc.left = 0;
                    100:     rc.top = 0;
                    101:     rc.right = PALETTEMARGIN + ((cxToolBtn - 1) * 2) + 1 + PALETTEMARGIN;
                    102:     rc.bottom = PALETTEMARGIN + ((cyToolBtn - 1) *
                    103:             (CTOOLS / 2)) + 1 + PALETTEMARGIN;
                    104:     AdjustWindowRect(&rc, TOOLBOXSTYLE, FALSE);
                    105:     cx = rc.right - rc.left;
                    106:     cy = rc.bottom - rc.top;
                    107: 
                    108:     /*
                    109:      * Get the saved position of the Toolbox.  Note that we throw away
                    110:      * the size fields, because we just calculated the required size.
                    111:      */
                    112:     if (!ReadWindowPos(szTBPos, &x, &y, &cxDummy, &cyDummy, &fMaximized)) {
                    113:         /*
                    114:          * The previous position of the Toolbox couldn't be found.
                    115:          * Position the toolbox to the upper right corner of the
                    116:          * client area of the editor, but make sure it is completely
                    117:          * visible.
                    118:          */
                    119:         GetClientRect(ghwndMain, &rcClient);
                    120:         pt.x = rcClient.right - cx - (2 * PALETTEMARGIN);
                    121:         pt.y = rcClient.top + gcyPropBar + (2 * PALETTEMARGIN);
                    122:         ClientToScreen(ghwndMain, &pt);
                    123:         SetRect(&rc, pt.x, pt.y, pt.x + cx, pt.y + cy);
                    124:         FitRectToScreen(&rc);
                    125:         x = rc.left;
                    126:         y = rc.top;
                    127:     }
                    128: 
                    129:     if (!(ghwndToolbox = CreateWindow(szToolboxClass, NULL, TOOLBOXSTYLE,
                    130:             x, y, cx, cy, ghwndMain, NULL, ghInst, NULL)))
                    131:         return;
                    132: 
                    133:     /*
                    134:      * Create the buttons.
                    135:      */
                    136:     x = PALETTEMARGIN;
                    137:     y = PALETTEMARGIN;
                    138:     for (i = 0; i < CTOOLS; i++) {
                    139:         CreateWindow(szToolBtnClass, NULL,
                    140:                 WS_CHILD | WS_VISIBLE,
                    141:                 x, y, cxToolBtn, cyToolBtn,
                    142:                 ghwndToolbox, (HMENU)i, ghInst, NULL);
                    143: 
                    144:         if (x == PALETTEMARGIN) {
                    145:             x += cxToolBtn - 1;
                    146:         }
                    147:         else {
                    148:             x = PALETTEMARGIN;
                    149:             y += cyToolBtn - 1;
                    150:         }
                    151:     }
                    152: 
                    153:     ToolboxUpdate();
                    154: }
                    155: 
                    156: 
                    157: 
                    158: /****************************************************************************
                    159: * ToolboxShow
                    160: *
                    161: * This function shows or hides the toolbox window.
                    162: *
                    163: * History:
                    164: *
                    165: ****************************************************************************/
                    166: 
                    167: VOID ToolboxShow(
                    168:     BOOL fShow)
                    169: {
                    170:     if (fShow)
                    171:         ShowWindow(ghwndToolbox, SW_SHOWNA);
                    172:     else
                    173:         ShowWindow(ghwndToolbox, SW_HIDE);
                    174: }
                    175: 
                    176: 
                    177: 
                    178: /****************************************************************************
                    179: * ToolboxUpdate
                    180: *
                    181: * This function updates the toolbox.  It should be called any time that
                    182: * a new file is opened/created for editing.
                    183: *
                    184: * History:
                    185: *
                    186: ****************************************************************************/
                    187: 
                    188: VOID ToolboxUpdate(VOID)
                    189: {
                    190:     if (!ghwndToolbox)
                    191:         return;
                    192: 
                    193:     if (giType == FT_CURSOR) {
                    194:         ShowWindow(GetDlgItem(ghwndToolbox, TOOL_HOTSPOT), SW_SHOWNA);
                    195:         iToolLast = CTOOLS - 1;
                    196:     }
                    197:     else {
                    198:         ShowWindow(GetDlgItem(ghwndToolbox, TOOL_HOTSPOT), SW_HIDE);
                    199:         iToolLast = TOOL_HOTSPOT - 1;
                    200:         if (gCurTool == TOOL_HOTSPOT)
                    201:             ToolboxSelectTool(TOOL_FIRST);
                    202:     }
                    203: }
                    204: 
                    205: 
                    206: 
                    207: /****************************************************************************
                    208: * ToolboxWndProc
                    209: *
                    210: * This is the window procedure for the toolbox window.
                    211: *
                    212: * History:
                    213: *
                    214: ****************************************************************************/
                    215: 
                    216: WINDOWPROC ToolboxWndProc(
                    217:     HWND hwnd,
                    218:     UINT msg,
                    219:     WPARAM wParam,
                    220:     LPARAM lParam)
                    221: {
                    222:     switch (msg) {
                    223:         case WM_CREATE:
                    224:             {
                    225:                 HMENU hmenu = GetSystemMenu(hwnd, FALSE);
                    226: 
                    227:                 RemoveMenu(hmenu, 7, MF_BYPOSITION);    // Second separator.
                    228:                 RemoveMenu(hmenu, 5, MF_BYPOSITION);    // First separator.
                    229: 
                    230:                 RemoveMenu(hmenu, SC_RESTORE, MF_BYCOMMAND);
                    231:                 RemoveMenu(hmenu, SC_SIZE, MF_BYCOMMAND);
                    232:                 RemoveMenu(hmenu, SC_MINIMIZE, MF_BYCOMMAND);
                    233:                 RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND);
                    234:                 RemoveMenu(hmenu, SC_TASKLIST, MF_BYCOMMAND);
                    235:             }
                    236: 
                    237:             return 0;
                    238: 
                    239:         case WM_KEYDOWN:
                    240:             {
                    241:                 INT iToolNext;
                    242: 
                    243:                 switch (wParam) {
                    244:                     case VK_UP:
                    245:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    246:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    247:                             break;
                    248: 
                    249:                         /*
                    250:                          * Go up a row, but don't go beyond the top.
                    251:                          */
                    252:                         iToolNext = gCurTool - TOOLBOXCOLUMNS;
                    253:                         if (iToolNext < 0)
                    254:                             break;
                    255: 
                    256:                         ToolboxSelectTool(iToolNext);
                    257: 
                    258:                         break;
                    259: 
                    260:                     case VK_DOWN:
                    261:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    262:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    263:                             break;
                    264: 
                    265:                         /*
                    266:                          * Go down a row, but don't go beyond the bottom.
                    267:                          */
                    268:                         iToolNext = gCurTool + TOOLBOXCOLUMNS;
                    269:                         if (iToolNext > iToolLast)
                    270:                             break;
                    271: 
                    272:                         ToolboxSelectTool(iToolNext);
                    273: 
                    274:                         break;
                    275: 
                    276:                     case VK_LEFT:
                    277:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    278:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    279:                             break;
                    280: 
                    281:                         /*
                    282:                          * Already at left edge.
                    283:                          */
                    284:                         if (!(gCurTool % TOOLBOXCOLUMNS))
                    285:                             break;
                    286: 
                    287:                         /*
                    288:                          * Go left a column.
                    289:                          */
                    290:                         ToolboxSelectTool(gCurTool - 1);
                    291: 
                    292:                         break;
                    293: 
                    294:                     case VK_RIGHT:
                    295:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    296:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    297:                             break;
                    298: 
                    299:                         /*
                    300:                          * Already at right edge.
                    301:                          */
                    302:                         if ((gCurTool % TOOLBOXCOLUMNS) == TOOLBOXCOLUMNS - 1)
                    303:                             break;
                    304: 
                    305:                         /*
                    306:                          * Don't go off the end of the available tools.
                    307:                          */
                    308:                         if (gCurTool + 1 > iToolLast)
                    309:                             break;
                    310: 
                    311:                         /*
                    312:                          * Go right a column.
                    313:                          */
                    314:                         ToolboxSelectTool(gCurTool + 1);
                    315: 
                    316:                         break;
                    317: 
                    318:                     case VK_TAB:
                    319:                         if (GetKeyState(VK_CONTROL) & 0x8000)
                    320:                             break;
                    321: 
                    322:                         /*
                    323:                          * Is the shift key pressed also?
                    324:                          */
                    325:                         if (GetKeyState(VK_SHIFT) & 0x8000) {
                    326:                             if (gCurTool == TOOL_FIRST)
                    327:                                 iToolNext = iToolLast;
                    328:                             else
                    329:                                 iToolNext = gCurTool - 1;
                    330:                         }
                    331:                         else {
                    332:                             if (gCurTool == iToolLast)
                    333:                                 iToolNext = TOOL_FIRST;
                    334:                             else
                    335:                                 iToolNext = gCurTool + 1;
                    336:                         }
                    337: 
                    338:                         ToolboxSelectTool(iToolNext);
                    339: 
                    340:                         break;
                    341: 
                    342:                     case VK_END:
                    343:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    344:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    345:                             break;
                    346: 
                    347:                         ToolboxSelectTool(iToolLast);
                    348: 
                    349:                         break;
                    350: 
                    351:                     case VK_HOME:
                    352:                     case VK_ESCAPE:
                    353:                         if ((GetKeyState(VK_SHIFT) & 0x8000) ||
                    354:                                 (GetKeyState(VK_CONTROL) & 0x8000))
                    355:                             break;
                    356: 
                    357:                         ToolboxSelectTool(TOOL_FIRST);
                    358: 
                    359:                         break;
                    360:                 }
                    361:             }
                    362: 
                    363:             break;
                    364: 
                    365:         case WM_ACTIVATE:
                    366:             if (LOWORD(wParam))
                    367:                 gidCurrentDlg = DID_TOOLBOX;
                    368: 
                    369:             break;
                    370: 
                    371:         case  WM_PAINT:
                    372:             {
                    373:                 HDC hdc;
                    374:                 PAINTSTRUCT ps;
                    375: 
                    376:                 hdc = BeginPaint(hwnd, &ps);
                    377:                 DrawMarginBorder(hwnd, hdc);
                    378:                 EndPaint(hwnd, &ps);
                    379:             }
                    380: 
                    381:             break;
                    382: 
                    383:         case WM_CLOSE:
                    384:             /*
                    385:              * The user closed the toolbox from the system menu.
                    386:              * Hide the toolbox (we don't actually destroy it so
                    387:              * that it will appear in the same spot when they show
                    388:              * it again).
                    389:              */
                    390:             ToolboxShow(FALSE);
                    391:             gfShowToolbox = FALSE;
                    392:             break;
                    393: 
                    394:         case WM_DESTROY:
                    395:             {
                    396:                 INT i;
                    397:                 RECT rc;
                    398: 
                    399:                 for (i = 0; i < CTOOLS; i++) {
                    400:                     DeleteObject(gaTools[i].hbmToolBtnUp);
                    401:                     gaTools[i].hbmToolBtnUp = NULL;
                    402:                     DeleteObject(gaTools[i].hbmToolBtnDown);
                    403:                     gaTools[i].hbmToolBtnDown = NULL;
                    404:                 }
                    405: 
                    406:                 /*
                    407:                  * Save the position of the toolbox.
                    408:                  */
                    409:                 GetWindowRect(hwnd, &rc);
                    410:                 WriteWindowPos(&rc, FALSE, szTBPos);
                    411: 
                    412:                 /*
                    413:                  * Null out the global window handle for the toolbox
                    414:                  * for safety's sake.
                    415:                  */
                    416:                 ghwndToolbox = NULL;
                    417:             }
                    418: 
                    419:             break;
                    420: 
                    421:         default:
                    422:             return DefWindowProc(hwnd, msg, wParam, lParam);
                    423:     }
                    424: 
                    425:     return 0;
                    426: }
                    427: 
                    428: 
                    429: 
                    430: /****************************************************************************
                    431: * ToolBtnWndProc
                    432: *
                    433: * This is the window procedure for the buttons in the toolbox window.
                    434: *
                    435: * History:
                    436: *
                    437: ****************************************************************************/
                    438: 
                    439: WINDOWPROC ToolBtnWndProc(
                    440:     HWND hwnd,
                    441:     UINT msg,
                    442:     WPARAM wParam,
                    443:     LPARAM lParam)
                    444: {
                    445:     switch (msg) {
                    446:         case WM_LBUTTONDOWN:
                    447:             /*
                    448:              * Select the tool that was clicked on.
                    449:              */
                    450:             ToolboxSelectTool((UINT)GetWindowLong((hwnd), GWL_ID));
                    451: 
                    452:             break;
                    453: 
                    454:         case WM_PAINT:
                    455:             {
                    456:                 HDC hDC;
                    457:                 PAINTSTRUCT ps;
                    458: 
                    459:                 hDC = BeginPaint(hwnd, &ps);
                    460:                 ToolboxDrawBitmap(hDC, (UINT)GetWindowLong((hwnd), GWL_ID));
                    461:                 EndPaint(hwnd, &ps);
                    462:             }
                    463: 
                    464:             break;
                    465: 
                    466:         default:
                    467:             return DefWindowProc(hwnd, msg, wParam, lParam);
                    468:     }
                    469: 
                    470:     return 0;
                    471: }
                    472: 
                    473: 
                    474: 
                    475: /****************************************************************************
                    476: * ToolboxDrawBitmap
                    477: *
                    478: *
                    479: * History:
                    480: *
                    481: ****************************************************************************/
                    482: 
                    483: STATICFN VOID NEAR ToolboxDrawBitmap(
                    484:     HDC hDC,
                    485:     INT tool)
                    486: {
                    487:     HDC hMemDC;
                    488:     HBITMAP hbmOld;
                    489: 
                    490:     /*
                    491:      * Draw the image.
                    492:      */
                    493:     hMemDC = CreateCompatibleDC(hDC);
                    494:     hbmOld = SelectObject(hMemDC, (tool == gCurTool) ?
                    495:             gaTools[tool].hbmToolBtnDown : gaTools[tool].hbmToolBtnUp);
                    496:     BitBlt(hDC, 0, 0, cxToolBtn, cyToolBtn, hMemDC, 0, 0, SRCCOPY);
                    497:     SelectObject(hMemDC, hbmOld);
                    498:     DeleteDC(hMemDC);
                    499: }
                    500: 
                    501: 
                    502: 
                    503: /****************************************************************************
                    504: * ToolboxSelectTool
                    505: *
                    506: *
                    507: * History:
                    508: *
                    509: ****************************************************************************/
                    510: 
                    511: VOID ToolboxSelectTool(
                    512:     INT tool)
                    513: {
                    514:     if (gCurTool != tool) {
                    515:         if (ghwndToolbox) {
                    516:             InvalidateRect(GetDlgItem(ghwndToolbox, gCurTool), NULL, FALSE);            InvalidateRect(GetDlgItem(ghwndToolbox, tool), NULL, FALSE);
                    517:         }
                    518: 
                    519:         gCurTool = tool;
                    520:         gpfnDrawProc = gaTools[gCurTool].pfnDrawProc;
                    521:     }
                    522: }

unix.superglobalmegacorp.com

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