Annotation of mstools/ole20/samples/outline/status.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2: ** 
                      3: **    OLE 2.0 Sample Code
                      4: **    
                      5: **    status.c
                      6: **    
                      7: **       This file contains the window handlers, and various initialization
                      8: **       and utility functions for an application status bar.
                      9: **
                     10: **       (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
                     11: **
                     12: *************************************************************************/
                     13: 
                     14: // Application specific include files
                     15: #include "outline.h"
                     16: #include "message.h"
                     17: #include "status.h"
                     18: 
                     19: // Current status message.
                     20: static char *szStatusMessage = NULL;
                     21: 
                     22: // Holder for string messages.
                     23: static char szMessageHold[MAX_MESSAGE];
                     24: 
                     25: // Window proc for status window.
                     26: LRESULT FAR PASCAL StatusWndProc
                     27:    (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam);
                     28: 
                     29: // List of all constant messages.
                     30: static STATMESG ControlList[2] =
                     31: {
                     32:     {   STATUS_READY,   "Ready."    },
                     33:     {   STATUS_BLANK,   " "         }
                     34: };
                     35: 
                     36: // List of all system menu messages.
                     37: static STATMESG SysMenuList[16] =
                     38: {
                     39:     {   SC_SIZE,        "Change the size of the window."            },
                     40:     {   SC_MOVE,        "Move the window."                          },
                     41:     {   SC_MINIMIZE,    "Make the window iconic."                   },
                     42:     {   SC_MAXIMIZE,    "Make the window the size of the screen."   },
                     43:     {   SC_NEXTWINDOW,  "Activate the next window."                 },
                     44:     {   SC_PREVWINDOW,  "Activate the previous window."             },
                     45:     {   SC_CLOSE,       "Close this window."                        },
                     46:     {   SC_VSCROLL,     "Vertical scroll?"                          },
                     47:     {   SC_HSCROLL,     "Horizontal scroll?"                        },
                     48:     {   SC_MOUSEMENU,   "A menu for mice."                          },
                     49:     {   SC_KEYMENU,     "A menu for keys (I guess)."                },
                     50:     {   SC_ARRANGE,     "Arrange something."                        },
                     51:     {   SC_RESTORE,     "Make the window noramally sized."          },
                     52:     {   SC_TASKLIST,    "Put up the task list dialog."              },
                     53:     {   SC_SCREENSAVE,  "Save the screen!  Run for your life!"      },
                     54:     {   SC_HOTKEY,      "Boy, is this key hot!"                     }
                     55: };
                     56: 
                     57: // Message type for popup messages.
                     58: typedef struct {
                     59:     HMENU hmenu;
                     60:     char string[MAX_MESSAGE];
                     61: } STATPOPUP;
                     62: 
                     63: // List of all popup messages.
                     64: static STATPOPUP PopupList[NUM_POPUP];
                     65: 
                     66: static UINT nCurrentPopup = 0;
                     67: 
                     68: 
                     69: 
                     70: /* RegisterStatusClass
                     71:  * -------------------
                     72:  *
                     73:  * Creates classes for status window.
                     74:  *
                     75:  * HINSTANCE hInstance
                     76:  *
                     77:  * RETURNS: TRUE if class successfully registered.
                     78:  *          FALSE otherwise.
                     79:  * 
                     80:  * CUSTOMIZATION: Change class name.
                     81:  *
                     82:  */
                     83: BOOL RegisterStatusClass(HINSTANCE hInstance)
                     84: {
                     85:     WNDCLASS  wc;
                     86: 
                     87:     wc.lpszClassName = "ObjStatus";
                     88:     wc.lpfnWndProc   = StatusWndProc;
                     89:     wc.style         = 0;
                     90:     wc.hInstance     = hInstance;
                     91:     wc.hIcon         = NULL;
                     92:     wc.cbClsExtra    = 4;
                     93:     wc.cbWndExtra    = 0;
                     94:     wc.lpszMenuName  = NULL;
                     95:     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
                     96:     wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
                     97: 
                     98:     if (!RegisterClass(&wc))
                     99:         return FALSE;
                    100: 
                    101:     return TRUE;
                    102: }
                    103: 
                    104: 
                    105: /* CreateStatusWindow
                    106:  * ------------------
                    107:  *
                    108:  * Creates status window.
                    109:  *
                    110:  * HWND hwndMain
                    111:  * 
                    112:  * RETURNS: HWND of status window if creation is successful.
                    113:  *          NULL otherwise.
                    114:  *
                    115:  * CUSTOMIZATION: Change class name.
                    116:  *
                    117:  */
                    118: HWND CreateStatusWindow(HWND hWndApp, HINSTANCE hInst)
                    119: {
                    120:     RECT rect;
                    121:     int width, height;
                    122:     HWND hWndStatusBar;
                    123: 
                    124:     szStatusMessage = ControlList[0].string;
                    125:     GetClientRect(hWndApp, &rect);
                    126:     width = rect.right - rect.left;
                    127:     height = rect.bottom - rect.top;
                    128: 
                    129:     hWndStatusBar = CreateWindow (
                    130:         "ObjStatus",
                    131:         "SvrStatus",
                    132:         WS_CHILD | WS_VISIBLE,
                    133:         0, height - STATUS_HEIGHT,
                    134:         width,
                    135:         STATUS_HEIGHT,
                    136:         hWndApp,
                    137:         NULL,
                    138:         hInst,
                    139:         NULL
                    140:     );
                    141: 
                    142:     return hWndStatusBar;
                    143: }
                    144: 
                    145: 
                    146: /* DestroyStatusWindow
                    147:  * -------------------
                    148:  *
                    149:  * Destroys status window.
                    150:  *
                    151:  * CUSTOMIZATION: None.
                    152:  *
                    153:  */
                    154: void DestroyStatusWindow(HWND hWndStatusBar)
                    155: {
                    156:     DestroyWindow(hWndStatusBar);
                    157: }
                    158: 
                    159: 
                    160: /* AssignPopupMessage
                    161:  * ------------------
                    162:  *
                    163:  * Associates a string with a popup menu handle.
                    164:  *
                    165:  * HMENU hmenuPopup
                    166:  * char *szMessage
                    167:  *
                    168:  * CUSTOMIZATION: None.
                    169:  *
                    170:  */
                    171: void AssignPopupMessage(HMENU hmenuPopup, char *szMessage)
                    172: {
                    173:     if (nCurrentPopup < NUM_POPUP) {
                    174:         PopupList[nCurrentPopup].hmenu = hmenuPopup;
                    175:         lstrcpy(PopupList[nCurrentPopup].string, szMessage);
                    176:         ++nCurrentPopup;
                    177:     }
                    178: }
                    179: 
                    180: static void WriteStatusMessage(HWND hWndStatusBar, LPVOID lpDoc)
                    181: {
                    182: #if defined( INPLACE_LATER )
                    183:     if (lpDoc && lpDoc->lpIpData != NULL) {
                    184:         lpDoc->lpIpData->lpFrame->lpVtbl->SetStatusText
                    185:                     (lpDoc->lpIpData->lpFrame, szStatusMessage);
                    186:     }
                    187:     else 
                    188: #endif  
                    189:     {
                    190:         InvalidateRect (hWndStatusBar, (LPRECT)NULL,  TRUE);
                    191:         UpdateWindow (hWndStatusBar);
                    192:     }
                    193: }
                    194: 
                    195: /* ItemMessage
                    196:  * -----------
                    197:  *
                    198:  * Prints message associated with the given item number.
                    199:  *
                    200:  * UINT wIDItem
                    201:  * LPVOID lpDoc
                    202:  *
                    203:  * CUSTOMIZATION: None.
                    204:  *
                    205:  */
                    206: void ItemMessage(HWND hWndStatusBar, UINT wIDItem, LPVOID lpDoc)
                    207: {
                    208:     UINT i;
                    209: 
                    210:     szStatusMessage = ControlList[1].string;
                    211:     for (i = 0; i < NUM_STATS; ++i) {
                    212:         if (wIDItem == MesgList[i].wIDItem) {
                    213:             szStatusMessage = MesgList[i].string;
                    214:             break;
                    215:         }
                    216:     }
                    217:     WriteStatusMessage(hWndStatusBar, lpDoc);
                    218: }
                    219: 
                    220: 
                    221: /* PopupMessage
                    222:  * ------------
                    223:  *
                    224:  * Prints message associated with the given popup menu.
                    225:  *
                    226:  * HMENU hmenuPopup
                    227:  * LPVOID lpDoc
                    228:  *
                    229:  * CUSTOMIZATION: None.
                    230:  *
                    231:  */
                    232: void PopupMessage(HWND hWndStatusBar, HMENU hmenuPopup, LPVOID lpDoc)
                    233: {
                    234:     UINT i;
                    235: 
                    236:     szStatusMessage = ControlList[1].string;
                    237:     for (i = 0; i < nCurrentPopup; ++i) {
                    238:         if (hmenuPopup == PopupList[i].hmenu) {
                    239:             szStatusMessage = PopupList[i].string;
                    240:             break;
                    241:         }
                    242:     }
                    243:     WriteStatusMessage(hWndStatusBar, lpDoc);
                    244: }
                    245: 
                    246: 
                    247: /* SysMenuMessage
                    248:  * --------------
                    249:  *
                    250:  * Prints messages to correspond to items on the system menu.
                    251:  * 
                    252:  *
                    253:  * UINT wIDItem
                    254:  * LPVOID lpDoc
                    255:  *
                    256:  * CUSTOMIZATION: None.
                    257:  *
                    258:  */
                    259: void SysMenuMessage(HWND hWndStatusBar, UINT wIDItem, LPVOID lpDoc)
                    260: {
                    261:     UINT i;
                    262: 
                    263:     szStatusMessage = ControlList[1].string;
                    264:     for (i = 0; i < 16; ++i) {
                    265:         if (wIDItem == SysMenuList[i].wIDItem) {
                    266:             szStatusMessage = SysMenuList[i].string;
                    267:             break;
                    268:         }
                    269:     }
                    270:     WriteStatusMessage(hWndStatusBar, lpDoc);
                    271: }
                    272: 
                    273: 
                    274: /* ControlMessage
                    275:  * --------------
                    276:  *
                    277:  * Prints general system messages.
                    278:  * 
                    279:  *
                    280:  * STATCONTROL scCommand
                    281:  * LPVOID lpDoc
                    282:  *
                    283:  * CUSTOMIZATION: Add new messages.
                    284:  *
                    285:  */
                    286: void ControlMessage(HWND hWndStatusBar, STATCONTROL scCommand, LPVOID lpDoc)
                    287: {
                    288:     UINT i;
                    289: 
                    290:     szStatusMessage = ControlList[1].string;
                    291:     for (i = 0; i < 2; ++i) {
                    292:         if ((UINT)scCommand == ControlList[i].wIDItem) {
                    293:             szStatusMessage = ControlList[i].string;
                    294:             break;
                    295:         }
                    296:     }
                    297:     WriteStatusMessage(hWndStatusBar, lpDoc);
                    298: }
                    299: 
                    300: 
                    301: /* StringMessage
                    302:  * -------------
                    303:  *
                    304:  * Prints messages specially sent by the application.
                    305:  * 
                    306:  * char *szMessage
                    307:  * LPVOID lpDoc
                    308:  *
                    309:  * CUSTOMIZATION: Add new messages.
                    310:  *
                    311:  */
                    312: void StringMessage(HWND hWndStatusBar, char *szMessage, LPVOID lpDoc)
                    313: {
                    314:     lstrcpy(szMessageHold, szMessage);
                    315:     szStatusMessage = szMessageHold;
                    316:     WriteStatusMessage(hWndStatusBar, lpDoc);
                    317: }
                    318: 
                    319: 
                    320: 
                    321: /* StatusWndProc
                    322:  * -------------
                    323:  *
                    324:  * Message handler for the statusbar window.
                    325:  *
                    326:  *
                    327:  * CUSTOMIZATION: None
                    328:  *
                    329:  */
                    330: LRESULT FAR PASCAL StatusWndProc
                    331:    (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam)
                    332: {
                    333:     if (message == WM_PAINT) {
                    334:         RECT        rc;
                    335:         HDC         hdc;
                    336:         PAINTSTRUCT paintstruct;
                    337:         HPEN        hpenOld;
                    338:         HPEN        hpen;
                    339:         HFONT       hfontOld;
                    340:         HFONT       hfont;
                    341:         HPALETTE    hpalOld = NULL;
                    342:         POINT       point;
                    343: 
                    344:         BeginPaint (hwnd, &paintstruct);
                    345:         hdc = GetDC (hwnd);
                    346: 
                    347:         GetClientRect (hwnd, (LPRECT) &rc);
                    348: 
                    349:         hpenOld = SelectObject (hdc, GetStockObject (BLACK_PEN));
                    350:             
                    351:         MoveToEx (hdc, 0, 0, &point);
                    352:         LineTo (hdc, rc.right, 0);
                    353:             
                    354:         SelectObject (hdc, GetStockObject (WHITE_PEN));
                    355:         
                    356:         MoveToEx (hdc, STATUS_RRIGHT, STATUS_RTOP, &point);
                    357:         LineTo (hdc, STATUS_RRIGHT, STATUS_RBOTTOM);
                    358:         LineTo (hdc, STATUS_RLEFT-1, STATUS_RBOTTOM);
                    359:         
                    360:         hpen = CreatePen (PS_SOLID, 1, /* DKGRAY */ 0x00808080);
                    361:         SelectObject (hdc, hpen);
                    362:         
                    363:         MoveToEx (hdc, STATUS_RLEFT, STATUS_RBOTTOM-1, &point);
                    364:         LineTo (hdc, STATUS_RLEFT, STATUS_RTOP);
                    365:         LineTo (hdc, STATUS_RRIGHT, STATUS_RTOP);
                    366:         
                    367:         SetBkMode (hdc, TRANSPARENT);
                    368:         SetTextAlign (hdc, TA_LEFT | TA_TOP);
                    369:         hfont = CreateFont (STATUS_THEIGHT, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
                    370:                             FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                    371:                             CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                    372:                             DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif");
                    373:                             
                    374:         hfontOld = SelectObject(hdc, hfont);
                    375:         
                    376:         TextOut (hdc, STATUS_TLEFT, STATUS_TTOP,
                    377:                  szStatusMessage,
                    378:                  lstrlen(szStatusMessage));
                    379:         
                    380:         // Restore original objects
                    381:         SelectObject (hdc, hfontOld);
                    382:         SelectObject (hdc, hpenOld);
                    383:         DeleteObject (hpen);
                    384:         DeleteObject (hfont);
                    385: 
                    386:         ReleaseDC (hwnd, hdc);
                    387:         EndPaint (hwnd, &paintstruct);
                    388:         
                    389:         return 0;
                    390:     }
                    391:     else {
                    392:         return DefWindowProc(hwnd, message, wParam, lParam);
                    393:     }
                    394: }

unix.superglobalmegacorp.com

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