|
|
1.1 ! root 1: #include "cardfile.h" ! 2: ! 3: /*********************************************************************/ ! 4: /* Windows/PM Cardfile Shared Code */ ! 5: /* */ ! 6: /* (c) Copyright Microsoft Corp. 1987,1988 - All Rights Reserved */ ! 7: /*********************************************************************/ ! 8: ! 9: /*********************************************************************/ ! 10: /* The following shared code was developed from the original */ ! 11: /* Cardfile application. This code can be compiled to run under */ ! 12: /* either the Windows or the PM manager environment. All */ ! 13: /* functionality associated with bitmaps or printing has been */ ! 14: /* deleted. Some comments refering to these functions may still be */ ! 15: /* present in the code and should be disregarded. jw. */ ! 16: /*********************************************************************/ ! 17: ! 18: /* This file contains all of cardfile's painting procedures, as well as */ ! 19: /* the size proc. */ ! 20: ! 21: /*********************************************************************/ ! 22: /* CardfileEraseBkGnd - */ ! 23: /* Handles the EraseBkGnd message. Most applications pass the */ ! 24: /* message through to DefWindowProc, but Cardfile paints the */ ! 25: /* background blue in Cardfile mode. */ ! 26: /* */ ! 27: /* Slightly different in PM and Windows. */ ! 28: /*********************************************************************/ ! 29: ! 30: void CardfileEraseBkGnd(hWnd, hDC) ! 31: HWND hWnd; ! 32: HDC hDC; ! 33: { ! 34: HBRUSH hbr; /* brush used to paint background */ ! 35: HBRUSH hbrOld; /* to save brush which was in DC */ ! 36: RECT rect; /* filled with the window's rect */ ! 37: POINT pt; /* used for aligning brush */ ! 38: ! 39: GetClientRect(hWnd, (LPRECT)&rect); ! 40: ! 41: /* Get the right brush */ ! 42: if (CardPhone == IDM_PHONEBOOK) ! 43: ! 44: /* Last minute changes in the way in which colors operate force */ ! 45: /* the next two statements - for the PM version, assume that */ ! 46: /* the phonebook background color is white */ ! 47: ! 48: #ifdef IN_WINDOWS ! 49: hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); ! 50: #else ! 51: hbr = WHITE_COLOR; ! 52: #endif ! 53: else ! 54: hbr = hbrBack; ! 55: ! 56: if (hbr) ! 57: { ! 58: /* Unless you unrealize the brush, and set its origin, patterns */ ! 59: /* may not line up correctly on the screen. For example, two */ ! 60: /* gray brushes that weren't lined up could create a line. */ ! 61: ! 62: /* Don't worry about this for PM; right now patterns aren't */ ! 63: /* used for brushes anyway */ ! 64: ! 65: #ifdef IN_WINDOWS ! 66: UnrealizeObject(hbr); ! 67: pt.x = 0; ! 68: pt.y = 0; ! 69: ClientToScreen(hWnd, (LPPOINT)&pt); ! 70: SetBrushOrg( hDC, pt.x, pt.y); ! 71: hbrOld = SelectObject(hDC, hbr); ! 72: #endif ! 73: ! 74: FillRect(hDC, (LPRECT)&rect, hbr); ! 75: ! 76: /* Deleting old brush. Don't do in PM version */ ! 77: ! 78: #ifdef IN_WINDOWS ! 79: /* We may delete the brush, so select in the old one. (You can't */ ! 80: /* delete a locked object.) */ ! 81: SelectObject(hDC, hbrOld); ! 82: ! 83: if (CardPhone == IDM_PHONEBOOK) ! 84: DeleteObject(hbr); ! 85: #endif ! 86: } ! 87: } ! 88: ! 89: ! 90: ! 91: /*********************************************************************/ ! 92: /* CardfilePaint - */ ! 93: /* Main paint procedure for Cardfile when in the card mode. For */ ! 94: /* an explanation of the variables used to draw cards, look in */ ! 95: /* cfdata.c. */ ! 96: /* */ ! 97: /* Same in Windows and PM. */ ! 98: /*********************************************************************/ ! 99: ! 100: void CardfilePaint(hWindow, hDC) ! 101: HWND hWindow; ! 102: HDC hDC; ! 103: { ! 104: RECT rect; ! 105: LPCARDHEADER lpCards; /* far pointer to first card */ ! 106: LPCARDHEADER lpTCards; /* far pointer to any card in file */ ! 107: int xCur, yCur; /* coordinates of card being painted */ ! 108: int vcCards; /* count of cards that will fit vertically */ ! 109: int hcCards; /* count of cards that will fit horizontally */ ! 110: int width; /* width of the window minus the margins */ ! 111: int height; /* height of the window minus the margins */ ! 112: int idCard; /* index of the card being painted */ ! 113: int i; /* loop variable */ ! 114: ! 115: ! 116: /* always have a left margin, and if there's room for a right margin, */ ! 117: /* subtract that too. */ ! 118: width = cxMainWindow - LEFTMARGIN; ! 119: if (width - RIGHTMARGIN > CardWidth) ! 120: width -= RIGHTMARGIN; ! 121: ! 122: /* always have a top margin, and if there's room for a bottom margin, */ ! 123: /* subtract that too. */ ! 124: height = cyMainWindow; ! 125: if (cyMainWindow - BOTTOMMARGIN > CardHeight) ! 126: height -= BOTTOMMARGIN; ! 127: ! 128: /* always have at least one card */ ! 129: hcCards = 1; ! 130: cFSHeads = cScreenHeads = 1; ! 131: ! 132: /* see how many full or partial headers will appear in vertical space */ ! 133: if (yFirstCard < height) ! 134: { ! 135: cScreenHeads += (yFirstCard+ySpacing-1) / ySpacing; ! 136: cFSHeads += (yFirstCard / ySpacing); ! 137: } ! 138: ! 139: /* limit header counts to number of cards in file */ ! 140: if (cScreenHeads > cCards) ! 141: cScreenHeads = cCards; ! 142: ! 143: if (cFSHeads > cCards) ! 144: cFSHeads = cCards; ! 145: ! 146: /* see how many cards will fit horizontally */ ! 147: if (width - CardWidth > 0) ! 148: hcCards += ((width - CardWidth) / (2 * CharFixWidth)); ! 149: ! 150: /* see how many cards will fit vertically */ ! 151: vcCards = height / ySpacing; ! 152: ! 153: /* the actual count should be the greater of the vertical and horizontal */ ! 154: cScreenCards = hcCards > vcCards ? hcCards : vcCards; ! 155: ! 156: /* limit the count to the number of cards in the file */ ! 157: cScreenCards = cCards < cScreenCards ? cCards : cScreenCards; ! 158: ! 159: /* get pointer to first card */ ! 160: lpCards = (LPCARDHEADER) GlobalLock(hCards); ! 161: ! 162: /* calculate the coordinates of the first card to be painted */ ! 163: yCur = yFirstCard - (cScreenCards - 1)*ySpacing; ! 164: xCur = xFirstCard + (cScreenCards - 1)* (2 * CharFixWidth); ! 165: ! 166: /* figure out which card will be painted first. Cards are painted from */ ! 167: /* the back right to the front left, i.e. from the end of the file */ ! 168: /* to the front of the file */ ! 169: idCard = (iFirstCard + cScreenCards-1) % cCards; ! 170: lpTCards = lpCards + idCard; ! 171: ! 172: /* Turn on PM coord transformations by specifying the height of the */ ! 173: /* main window */ ! 174: TRANSLATE_COORDS( cyMainWindow ); ! 175: ! 176: for (i = 0; i < cScreenCards; ++i) ! 177: { ! 178: /* draw the card */ ! 179: SetRect((LPRECT)&rect, xCur, yCur, xCur+CardWidth, yCur+CardHeight); ! 180: TRANSLATE_RECT( rect ); ! 181: FrameRect(hDC, (LPRECT)&rect, hbrBlack); ! 182: InflateRect((LPRECT)&rect, -1, -1); ! 183: FillRect(hDC, (LPRECT)&rect, hbrWhite); ! 184: SetBkMode(hDC, TRANSPARENT); ! 185: TextOut(hDC, xCur+1, yCur+1+(ExtLeading / 2), ! 186: lpTCards->line, Mylstrlen(lpTCards->line)); ! 187: ! 188: /* calculate coordinates for next card */ ! 189: xCur -= (2*CharFixWidth); ! 190: yCur += ySpacing; ! 191: ! 192: /* get next card */ ! 193: lpTCards--; ! 194: idCard--; ! 195: ! 196: /* if past beginning of file */ ! 197: if (idCard < 0) ! 198: { ! 199: /* get to last card */ ! 200: idCard = cCards - 1; ! 201: lpTCards = lpCards+idCard; ! 202: } ! 203: } ! 204: /* draw the red line on the front card */ ! 205: SetRect((LPRECT)&rect, xFirstCard, yFirstCard+1+CharFixHeight, ! 206: xFirstCard+CardWidth, yFirstCard+2+CharFixHeight); ! 207: TRANSLATE_RECT( rect ); ! 208: FillRect(hDC, (LPRECT)&rect, hbrLine); ! 209: ! 210: SetRect((LPRECT)&rect, xFirstCard, yFirstCard+3+CharFixHeight, xFirstCard+CardWidth, yFirstCard+4+CharFixHeight); ! 211: TRANSLATE_RECT( rect ); ! 212: FillRect(hDC, (LPRECT)&rect, hbrLine); ! 213: ! 214: /* Reset the transformation unit to 0 to insure in the future */ ! 215: /* that no unwanted transformation will occur in other routines */ ! 216: TRANSLATE_COORDS( 0 ); ! 217: ! 218: /* done with cards */ ! 219: GlobalUnlock(hCards); ! 220: } ! 221: ! 222: ! 223: /*********************************************************************/ ! 224: /* PhonePaint - ! 225: /* Paints the main window when in phone book mode. Simpler than ! 226: /* painting in Card mode because all that needs to be done in phone ! 227: /* book mode is to display list of strings. ! 228: /* ! 229: /* Slightly different in Windows and PM. ! 230: /*********************************************************************/ ! 231: ! 232: void PhonePaint(hWindow, hDC) ! 233: HWND hWindow; ! 234: HDC hDC; ! 235: { ! 236: RECT rect; /* the window's rectangle */ ! 237: LPCARDHEADER lpCards; /* far pointer to card being painted */ ! 238: int y; /* y coordinate of header being painted */ ! 239: int i; ! 240: int cScrCards; /* count partially visible headers */ ! 241: ! 242: /* figure out how many headers are at least partially visible. This */ ! 243: /* is basically just the count of how many lines of text will fit in */ ! 244: /* the window. */ ! 245: cScrCards = (cyMainWindow + CharFixHeight - 1) / CharFixHeight; ! 246: ! 247: /* get to the header which is currently at the top of the window */ ! 248: lpCards = (LPCARDHEADER) GlobalLock(hCards); ! 249: lpCards += iTopCard; ! 250: ! 251: /* set the default text color, and put it in transparent mode */ ! 252: ! 253: /* Don't perform this in PM for the time being, just use default */ ! 254: /* text color. */ ! 255: #ifdef IN_WINDOWS ! 256: SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); ! 257: #endif ! 258: SetBkMode(hDC, TRANSPARENT); ! 259: ! 260: /* always start at the top of the screen */ ! 261: y = 0; ! 262: ! 263: TRANSLATE_COORDS( cyMainWindow ); ! 264: ! 265: for (i = 0; i < cScrCards; ++i) ! 266: { ! 267: /* if it's going to paint a non-existant card, break */ ! 268: if (i + iTopCard >= cCards) ! 269: break; ! 270: ! 271: /* paint it */ ! 272: TextOut(hDC, CharFixWidth, y, lpCards->line, ! 273: Mylstrlen(lpCards->line)); ! 274: ! 275: /* get to next header */ ! 276: y += CharFixHeight; ! 277: lpCards++; ! 278: } ! 279: ! 280: /* done with cards */ ! 281: GlobalUnlock(hCards); ! 282: ! 283: /* if have the focus, highlight the current card */ ! 284: if (GetFocus() == hCardfileWnd) ! 285: { ! 286: y = (iFirstCard - iTopCard) * CharFixHeight; ! 287: ! 288: SetRect((LPRECT)&rect, 0, y, (LINELENGTH+2)*CharFixWidth, ! 289: y+CharFixHeight); ! 290: TRANSLATE_RECT( rect ); ! 291: ! 292: InvertRect(hDC, (LPRECT)&rect); ! 293: } ! 294: ! 295: TRANSLATE_COORDS( 0 ); ! 296: } ! 297: ! 298: ! 299: ! 300: /*********************************************************************/ ! 301: /* PaintNewHeaders - ! 302: /* Called when a new card is brought to the front. Overwrites ! 303: /* information in headers. This routine is only called in card mode. ! 304: /* ! 305: /* Smae in Windows and PM. ! 306: /*********************************************************************/ ! 307: ! 308: void PaintNewHeaders() ! 309: { ! 310: HDC hDC; /* the DC */ ! 311: int idCard; /* id of the card being painted */ ! 312: LPCARDHEADER lpCards; /* far pointer to first card */ ! 313: LPCARDHEADER lpTCards; /* far pointer to card being painted */ ! 314: int xCur, yCur; /* coordinates of card being painted */ ! 315: int i; ! 316: RECT rect; ! 317: ! 318: /* cards are painted from back to front, calculate first coordinates */ ! 319: yCur = yFirstCard - (cScreenHeads - 1)*ySpacing; ! 320: xCur = xFirstCard + (cScreenHeads - 1)* (2 * CharFixWidth); ! 321: ! 322: /* get to the first card to be painted */ ! 323: idCard = (iFirstCard + cScreenHeads-1) % cCards; ! 324: lpCards = (LPCARDHEADER) GlobalLock(hCards); ! 325: lpTCards = lpCards + idCard; ! 326: ! 327: /* get a dc */ ! 328: hDC = GetDC(hCardfileWnd); ! 329: SetBkMode(hDC, TRANSPARENT); ! 330: ! 331: TRANSLATE_COORDS( cyMainWindow ); ! 332: ! 333: /* for all cards with headers showing */ ! 334: for (i = 0; i < cScreenHeads; ++i) ! 335: { ! 336: /* clear out the old header */ ! 337: SetRect((LPRECT)&rect, xCur+1, yCur+1, xCur+CardWidth-1, ! 338: yCur+CharFixHeight+1); ! 339: TRANSLATE_RECT( rect ); ! 340: ! 341: FillRect(hDC, (LPRECT)&rect, hbrWhite); ! 342: ! 343: /* draw the new header */ ! 344: TextOut(hDC, xCur+1, yCur+1+(ExtLeading/2), lpTCards->line, ! 345: Mylstrlen(lpTCards->line)); ! 346: ! 347: /* calculate next coordinates */ ! 348: xCur -= (2*CharFixWidth); ! 349: yCur += ySpacing; ! 350: ! 351: /* get to next card */ ! 352: lpTCards--; ! 353: idCard--; ! 354: /* if past beginning of file, get to end of file */ ! 355: if (idCard < 0) ! 356: { ! 357: idCard = cCards - 1; ! 358: lpTCards = lpCards+idCard; ! 359: } ! 360: } ! 361: ! 362: TRANSLATE_COORDS( 0 ); ! 363: ! 364: /* done with both dc and cards */ ! 365: ReleaseDC(hCardfileWnd, hDC); ! 366: GlobalUnlock(hCards); ! 367: } ! 368: ! 369: ! 370: ! 371: /*********************************************************************/ ! 372: /* CardfileSize - ! 373: /* Process size message. Repositions child edit window if in ! 374: /* Card mode; saves size in global variables. ! 375: /* ! 376: /* Same in Windows and PM. ! 377: /*********************************************************************/ ! 378: ! 379: void CardfileSize(hWindow, newWidth, newHeight) ! 380: HWND hWindow; ! 381: int newWidth; ! 382: int newHeight; ! 383: { ! 384: int yCard; ! 385: ! 386: /* save width and height */ ! 387: cxMainWindow = newWidth; ! 388: cyMainWindow = newHeight; ! 389: ! 390: /* calculate coordinates of bottom left card */ ! 391: yFirstCard = (newHeight - BOTTOMMARGIN) - CardHeight; ! 392: ! 393: if ((CharFixHeight / 2) > yFirstCard) ! 394: yFirstCard = CharFixHeight / 2; ! 395: ! 396: /* figure out where edit control should go */ ! 397: yCard = yFirstCard + 1 + CharFixHeight + 1 + 2; ! 398: ! 399: xFirstCard = LEFTMARGIN; ! 400: ! 401: /* if edit control exists, move it to new location */ ! 402: TRANSLATE_COORDS( cyMainWindow ); ! 403: ! 404: if (hCardWnd) ! 405: MoveWindow(hCardWnd, xFirstCard+1, yCard, ! 406: (LINELENGTH*CharFixWidth)+1, CARDLINES*CharFixHeight, ! 407: FALSE); ! 408: ! 409: TRANSLATE_COORDS( 0 ); ! 410: if (CardPhone == IDM_PHONEBOOK) ! 411: SetScrRangeAndPos(); ! 412: } ! 413:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.