Annotation of pmsdk/samples/newcard/cfmain.c, revision 1.1.1.1

1.1       root        1: #include "cardfile.h"
                      2: 
                      3: 
                      4: /*********************************************************************/
                      5: /*  Windows/PM Cardfile Shared Code                                  */
                      6: /*                                                                   */
                      7: /*  (c) Copyright Microsoft Corp. 1987,1988 - All Rights Reserved    */
                      8: /*********************************************************************/
                      9: 
                     10: /*********************************************************************/
                     11: /*    The following shared code was developed from the original      */
                     12: /* Cardfile application.  This code can be compiled to run under     */
                     13: /* either the Windows or the PM manager environment.  All            */
                     14: /* functionality associated with bitmaps or printing has been        */
                     15: /* deleted.  Some comments refering to these functions may still be  */
                     16: /* present in the code and should be disregarded. jw.                */
                     17: /*********************************************************************/
                     18: 
                     19: 
                     20: /*********************************************************************/
                     21: /* CardfileWndProc -                                                 */
                     22: /*    This routine processes messages to the main card window in     */
                     23: /* both Cardfile and Phonebook mode.                                 */
                     24: /*                                                                   */
                     25: /* Substantially different in PM and Windows                         */
                     26: /*********************************************************************/
                     27: 
                     28: /* this is the main Window Procedure for cardfile's window */
                     29: long far PASCAL CardfileWndProc(hwnd, message, wParam, lParam)
                     30: HWND hwnd;
                     31: unsigned message;
                     32: WINWORD wParam;
                     33: DWORD lParam;
                     34: {
                     35:     PAINTSTRUCT ps;
                     36:     LPCARDHEADER lpCards;
                     37:     int range;
                     38:     HMENU hMenu;
                     39:     char buf[30];
                     40:     HDC hDC;
                     41:     MSG msg;
                     42:     RECT rect;
                     43:     int y;
                     44: 
                     45:     switch (message)
                     46:         {
                     47:         case WM_CREATE:
                     48:             /* save the window handle */
                     49:             hCardfileWnd = hwnd;
                     50: 
                     51: #ifdef   IN_WINDOWS
                     52:             /* In PM, the style for the about box is to have the about */
                     53:             /* Command separated from the last item in the first menu  */
                     54:             /* In other words, using ChangeMenu is unneccessary in PM */
                     55: 
                     56:             /* add "About" to the system menu */
                     57:             hMenu = GetSystemMenu(hwnd, FALSE);
                     58:             ChangeMenu(hMenu, 0, (LPSTR)NULL, -1, MF_APPEND | MF_SEPARATOR);
                     59:             LoadString(hCardfileInstance, IDS_ABOUT, (LPSTR)buf, 30);
                     60:             ChangeMenu(hMenu, 0, (LPSTR)buf, IDM_ABOUT, MF_APPEND | MF_STRING);
                     61: #endif
                     62: 
                     63:             /* set the caption */
                     64:             SetCaption();
                     65: 
                     66:             /* initialize the scroll bars */
                     67:             /* Use macro which sets Range and Pos all at once   */
                     68:             SCROLL_RANGE(hwnd, SB_HORZ, 0, 0, cCards-1);
                     69:             SCROLL_RANGE(hwnd, SB_VERT, 0, 0, 0);
                     70:             break;
                     71: 
                     72:         case WM_LBUTTONDOWN:
                     73:         case WM_LBUTTONDBLCLK:
                     74:             /* handle mouse input */
                     75: #ifndef  IN_WINDOWS
                     76:             /* In PM, mouse point comes in wParam, just move to lParam */
                     77:             lParam = wParam;
                     78: #endif
                     79:             CardfileMouse(hwnd, message, MAKEPOINT(lParam));
                     80:             break;
                     81: 
                     82: #ifdef   IN_WINDOWS
                     83:         /* In PM, ignore EndSession stuff.  In PM, application will */
                     84:         /*  receive close message and can prompt user whether to close */
                     85:         /*  or not */
                     86: 
                     87:         case WM_ENDSESSION:
                     88:             /* windows is about to close down */
                     89:             if (wParam)
                     90:                 /* make sure temp file goes away */
                     91:                 Fdelete(TmpFile);
                     92:             break;
                     93: 
                     94:         case WM_QUERYENDSESSION:
                     95:             /* windows is asking if it is ok to close down */
                     96:             /* if there are changes in cardfile, ask if user wants to */
                     97:             /* save them, and give user a chance to cancel end session */
                     98:             if (MaybeSaveFile())
                     99:                 {
                    100:                 /* user says it's ok to end session.  make sure that */
                    101:                 /* cardfile is in a position to continue in case user */
                    102:                 /* cancels end session from some other application */
                    103:                 SetCurCard(iFirstCard);
                    104:                 return(TRUE);
                    105:                 }
                    106:             else
                    107:                 /* user cancelled.  Tell windows not to end session */
                    108:                 return(FALSE);
                    109:             break;
                    110: 
                    111: #endif
                    112:         case WM_CLOSE:
                    113: 
                    114:             /* user is trying to close cardfile's window */
                    115:             /* if changes in cardfile, ask user if he wants to save, or */
                    116:             /* wants to cancel close */
                    117:             if (MaybeSaveFile())
                    118:                 {
                    119:                 /* everything is ok to close */
                    120:                 /* ok, time to quit */
                    121: 
                    122:             /* The PostQuitMessage doesn't haven't enough information,  */
                    123:             /*  i.e. the window handle, to remap it into WinPostMsg.    */
                    124:             /*  Therefore, use separate compilation.  */
                    125: 
                    126: #ifdef   IN_WINDOWS
                    127:                 PostQuitMessage(0);
                    128: #else
                    129:                 WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
                    130: #endif
                    131:                 }
                    132:             return(TRUE);
                    133: 
                    134:         case WM_DESTROY:
                    135:             /* cardfile's window is going away: clean up */
                    136:             /* get rid of temp file */
                    137:             Fdelete(TmpFile);
                    138: 
                    139:             /* if last instance of cardfile, get rid of brushes */
                    140:             /* if not last instance, then other's will still use them */
                    141: 
                    142:             /* The idea of the last instance and shared data between  */
                    143:             /* instances are windows concepts only.  Also, for PM, this */
                    144:             /* application doesn't allocate memory for brushes */
                    145: 
                    146: #ifdef   IN_WINDOWS
                    147:             if (GetModuleUsage(hCardfileInstance) == 1)
                    148:                 {
                    149:                 DeleteObject(hbrGray);
                    150:                 DeleteObject(hbrBack);
                    151:                 DeleteObject(hbrLine);
                    152:                 }
                    153: #endif
                    154:             return(TRUE);
                    155: 
                    156:         case WM_INITMENU:
                    157:             /* the user has clicked on a menu.  Enable and check everything*/
                    158:             /* that should be, before the menu is actually brought up */
                    159:             UpdateMenu();
                    160:             break;
                    161: 
                    162:         case WM_COMMAND:
                    163:             /* one of three things */
                    164:             /* the edit control may be reporting that it has run out of */
                    165:             /* memory and can't accept any more input */
                    166: 
                    167:             /* For Windows version, check lParam in if statement */
                    168:             /* For PM version, don't worry about check, just compile */
                    169:             /* statement in else clause */
                    170: 
                    171: #ifdef   IN_WINDOWS
                    172:             if (LOWORD(lParam) == hCardWnd && HIWORD(lParam) == EN_ERRSPACE)
                    173:                 CardfileOkError(IDS_EINSMEMORY);
                    174:             else
                    175: #endif
                    176:                 /* or, the common thing, the user has executed a menu command */
                    177:                 CardfileInput(hwnd, LOUSHORT(wParam));
                    178:             break;
                    179: 
                    180:         /* In PM version, don't worry about background color of  */
                    181:         /* edit control.  It should always be white anyway.      */
                    182: 
                    183: #ifdef   IN_WINDOWS
                    184:         case WM_CTLCOLOR:
                    185:             /* this message gives cardfile a chance to set the background */
                    186:             /* color of the edit control, which should always be white */
                    187:             if (LOWORD(lParam) == hCardWnd)
                    188:                 {
                    189:                 SetBkColor((HDC)wParam, 0x00ffffff);
                    190:                 SetTextColor((HDC)wParam, 0L);
                    191:                 return((long)hbrWhite);
                    192:                 }
                    193:             /* if not edit control, pass message on */
                    194:             goto CallDefProc;
                    195: #endif
                    196: 
                    197:         /* In Windows, process erase background message.  In PM,  */
                    198:         /*  the 'equivalent' message really isn't the same.  The  */
                    199:         /*  PM message is sent when the frame window needs to be  */
                    200:         /*  erased; in response to the repainting of any of the   */
                    201:         /*  control windows, not just the client area.  In PM,    */
                    202:         /*  it's easier (safer) to erase the client area when a   */
                    203:         /*  WM_PAINT message comes. */
                    204: 
                    205: #ifdef   IN_WINDOWS
                    206:         case WM_ERASEBKGND:
                    207:             /* paint the background, which will be BLUE or GRAY */
                    208:             CardfileEraseBkGnd(hwnd, (HDC)wParam);
                    209:             break;
                    210: #endif
                    211: 
                    212:         case WM_PAINT:
                    213:             /* Time to paint, either a phonebook paint,  */
                    214:             /* or a cardfile paint */
                    215:             BeginPaint(hwnd, (LPPAINTSTRUCT)&ps);
                    216: 
                    217:             /* See comment for WM_ERASEBKGND message.  In PM, erase  */
                    218:             /* client area background when WM_PAINT message comes */
                    219: #ifndef  IN_WINDOWS
                    220:             CardfileEraseBkGnd(hwnd, ps.hdc);
                    221: #endif
                    222: 
                    223:             if (CardPhone == IDM_PHONEBOOK)
                    224:                 PhonePaint(hwnd, ps.hdc);
                    225:             else
                    226:                 CardfilePaint(hwnd, ps.hdc);
                    227: 
                    228:             EndPaint(hwnd, (LPPAINTSTRUCT)&ps);
                    229:             break;
                    230: 
                    231:         case WM_SIZE:
                    232: 
                    233:             /* the main window has changed size */
                    234:             CardfileSize(hwnd, LOWORD(lParam), HIWORD(lParam));
                    235:             break;
                    236: 
                    237:         case WM_HSCROLL:
                    238:             /* there is a horizontal scroll bar only in cardfile mode */
                    239: 
                    240:             /* In PM, Scroll message is similar except that command is */
                    241:             /*  the low word of lParam instead of wParam */            
                    242: #ifndef  IN_WINDOWS
                    243:             wParam = (long) HIUSHORT(lParam);
                    244: #endif            
                    245:             CardfileScroll(hwnd, LOUSHORT(wParam), LOWORD(lParam));
                    246:             break;
                    247: 
                    248:         case WM_VSCROLL:
                    249:             /* the vertical scroll bar only appears in phonebook mode */
                    250: 
                    251:             /* In PM, Scroll message is similar except that command is */
                    252:             /*  the low word of lParam instead of wParam */            
                    253: #ifndef  IN_WINDOWS
                    254:             wParam = (long) HIUSHORT(lParam);
                    255: #endif            
                    256:             PhoneScroll(hwnd, LOUSHORT(wParam), LOWORD(lParam));
                    257:             break;
                    258: 
                    259:         case WM_CHAR:
                    260:             /* handle character input for phonebook mode.      */
                    261: 
                    262:             if(CardPhone != IDM_PHONEBOOK)
                    263:                 break;
                    264: 
                    265:             /* In Windows, the WM_CHAR message contains only valid  */
                    266:             /*  characters, so just send the message to the char    */
                    267:             /*  routine.  */
                    268: #ifdef   IN_WINDOWS
                    269:            if (GetKeyState(VK_CTRL))
                    270:                CardChar(wParam);
                    271: #else
                    272:             /* In PM, WM_CHAR message may contain a ascii char, system */
                    273:             /* char, key up or key down message.  Need to distinguish  */
                    274:             /* between the cases.  */
                    275: 
                    276:             /* If key up or dead key, ignore */
                    277:             if (wParam & (KC_KEYUP | KC_DEADKEY))
                    278:                break;
                    279: 
                    280:             /* If virtual key is valid, check if arrow or PGUP */
                    281:             if (wParam & KC_VIRTUALKEY)
                    282:                if (PhoneKey(hwnd, HIUSHORT(lParam)))
                    283:                   return( TRUE );
                    284: 
                    285:             /* If ctrl-char valid, check if first letter in index line */
                    286:             if ((wParam & KC_CHAR) && (wParam & KC_CTRL))
                    287:                if (CardChar(LOUSHORT(lParam)))
                    288:                   return( TRUE );
                    289: #endif
                    290:             break;
                    291: 
                    292:             /* WM_KEYDOWN message is handled through WM_CHAR message in */
                    293:             /* PM.  */
                    294: 
                    295: #ifdef   IN_WINDOWS
                    296:         case WM_KEYDOWN:
                    297:             /* handle keys.  Again, this will only come through when */
                    298:             /* cardfile is in phonebook mode */
                    299:             PhoneKey(hwnd, wParam);
                    300:             break;
                    301: #endif
                    302: 
                    303:         case WM_ACTIVATE:
                    304:             /* activate, and set focus to either edit control, or main window*/
                    305:             /* depending upon which mode we are in */
                    306: 
                    307:             if (LOUSHORT(wParam))
                    308:                 if (CardPhone == IDM_CARDFILE)
                    309:                     SetFocus(hCardWnd);
                    310:                 else
                    311:                     SetFocus(hCardfileWnd);
                    312:             break;
                    313: 
                    314:    /* In PM, KillFocus message is incorporated in SetFocus message.  */
                    315:    /* Because all that is done for the SetFocus or KillFocus message is */
                    316:    /* to toggle the hilight state, just add extra case for Windows  */
                    317:    /* version */
                    318: 
                    319:         case WM_SETFOCUS:
                    320: #ifdef   IN_WINDOWS
                    321:         case WM_KILLFOCUS:
                    322: #endif
                    323:             /* if in phonebook, take down highlighting */
                    324:             if(CardPhone == IDM_PHONEBOOK)
                    325:                 {
                    326:                 hDC = GetDC(hCardfileWnd);
                    327:                 y = (iFirstCard - iTopCard) * CharFixHeight;
                    328:                 TRANSLATE_COORDS( cyMainWindow );
                    329: 
                    330:                 SetRect((LPRECT)&rect, 0, y, (LINELENGTH+2) * CharFixWidth, 
                    331:                         y+CharFixHeight);
                    332: 
                    333:                 TRANSLATE_RECT( rect );
                    334: 
                    335:                 InvertRect(hDC, (LPRECT)&rect);
                    336:                 ReleaseDC(hCardfileWnd, hDC);
                    337: 
                    338:                 TRANSLATE_COORDS( 0 );
                    339:                 }
                    340:             break;
                    341: 
                    342:         /* In PM, the about box is not in the system menu so ignore this */
                    343: #ifdef   IN_WINDOWS
                    344:         case WM_SYSCOMMAND:
                    345:             /* user has chosen ABOUT, put up dialog */
                    346:             if (wParam == IDM_ABOUT)
                    347:                 {
                    348:                 CardfileInput(hwnd, wParam);
                    349:                 break;
                    350:                 }
                    351: #endif
                    352: 
                    353:         default:
                    354:             /* some other message, let default handler take care of it */
                    355: CallDefProc:
                    356:             return(DefWindowProc(hwnd, message, wParam, lParam));
                    357:             break;
                    358:         }
                    359:     return(0L);
                    360: }
                    361: 

unix.superglobalmegacorp.com

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