Annotation of mstools/samples/ntfonts/demownd.c, revision 1.1.1.1

1.1       root        1: /**************************************************************************\
                      2: *  demownd.c -- module for the window with the test font.
                      3: *   Includes the window procedure and an initialization routine.
                      4: *
                      5: * store the handle to the test font in the extra bytes of this window.
                      6: *
                      7: \**************************************************************************/
                      8: 
                      9: #include <windows.h>
                     10: #include <string.h>
                     11: #include "ntfonts.h"
                     12: 
                     13: #define GRIDCOLOR  PALETTEINDEX (3)
                     14: #define TICKSPACE  10
                     15: 
                     16: 
                     17: 
                     18: int initDemo(HWND hwndMain)
                     19: {
                     20: WNDCLASS  wc;
                     21: 
                     22:   wc.style = CS_VREDRAW | CS_HREDRAW;
                     23:   wc.lpfnWndProc = (WNDPROC)DemoWndProc;
                     24:   wc.cbClsExtra = 0;
                     25:   wc.cbWndExtra = 0;
                     26:   wc.hInstance = hInst;
                     27:   wc.hIcon = LoadIcon(hInst, "ntfontsIcon");
                     28:   wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                     29:   wc.hbrBackground = NULL;
                     30:   wc.lpszMenuName = NULL;
                     31:   wc.lpszClassName = "Demo";
                     32: 
                     33:   if (!RegisterClass(&wc)) return (FALSE);
                     34: 
                     35:   hwndDemo = CreateWindow(
                     36:       "Demo",
                     37:       "TextOut()",
                     38:       WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE |
                     39:                  WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
                     40:       CHILDLEFT(2),
                     41:       CHILDTOP,
                     42:       GetSystemMetrics (SM_CXFULLSCREEN)/3 - 10,
                     43:       GetSystemMetrics (SM_CYFULLSCREEN)/3,
                     44:       hwndMain, NULL, hInst, NULL);
                     45: 
                     46:   if (!hwndDemo) return (FALSE);
                     47: 
                     48: 
                     49:   return TRUE;
                     50: }
                     51: 
                     52: 
                     53: 
                     54: 
                     55: /**************************************************************************\
                     56: *
                     57: *  function:  DemoWndProc()
                     58: *
                     59: *  input parameters:  normal window procedure parameters.
                     60: *
                     61: *  global variables:
                     62: *   allglyphsGlobal - TRUE, then paint all of the glyphs.
                     63: *   mapperflagsGlobal - input to SetMapperFlags().
                     64: \**************************************************************************/
                     65: LRESULT DemoWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                     66: {
                     67: static HANDLE hPenGrid;
                     68: static LPLOGFONT     lplf;
                     69: static LPTEXTMETRIC  lptm;
                     70: static HFONT  hfont;
                     71: 
                     72:   switch (message) {
                     73: 
                     74: 
                     75:     /**********************************************************************\
                     76:     *  WMU_DEMOTOLF
                     77:     *
                     78:     *  lParam - pointer to LOGFONT structure.
                     79:     *
                     80:     * User message.  Fill up the demo LOGFONT from the HFONT
                     81:     *  in the extra bytes.
                     82:     \**********************************************************************/
                     83:     case WMU_DEMOTOLF: {
                     84:       lplf = (LPLOGFONT) lParam;
                     85: 
                     86:       hfont = (HFONT) GetWindowLong (hwnd, GWL_USERDATA);
                     87:       GetObject (hfont, sizeof(LOGFONT), lplf);
                     88:     } return 0;
                     89: 
                     90: 
                     91: 
                     92: 
                     93:     /**********************************************************************\
                     94:     *  WMU_LFTODEMO
                     95:     *
                     96:     *  lParam - pointer to LOGFONT structure.
                     97:     *
                     98:     * User message.  Use the input LOGFONT structure to create a new
                     99:     *  font for this window.  Store the new font in the HFONT extra bytes.
                    100:     \**********************************************************************/
                    101:     case WMU_LFTODEMO: {
                    102:       lplf = (LPLOGFONT) lParam;
                    103: 
                    104:       /* Get and delete the last font placed in this window. */
                    105:       hfont = (HFONT) GetWindowLong (hwnd, GWL_USERDATA);
                    106:       DeleteObject (hfont);
                    107: 
                    108:       /* Create a new logical font and set it into the windows extra bytes. */
                    109:       hfont = CreateFontIndirect (lplf);
                    110:       SetWindowLong (hwnd, GWL_USERDATA, (LONG) hfont);
                    111:       InvalidateRect (hwnd, NULL, TRUE);
                    112:     } return 0;
                    113: 
                    114:     /**********************************************************************\
                    115:     *  WMU_DEMOTOTM
                    116:     *
                    117:     *  lParam - pointer to TEXTMETRIC structure.
                    118:     *
                    119:     * User message.  Fill up the TEXTMETRIC from the HFONT
                    120:     *  in the extra bytes.
                    121:     \**********************************************************************/
                    122:     case WMU_DEMOTOTM: {
                    123:       HDC hdc;
                    124: 
                    125:       lptm = (LPTEXTMETRIC) lParam;
                    126: 
                    127:       hfont = (HFONT) GetWindowLong (hwnd, GWL_USERDATA);
                    128: 
                    129: 
                    130:       hdc = GetDC (hwnd);
                    131:       SelectObject (hdc,hfont);
                    132:       GetTextMetrics (hdc, lptm);
                    133:       ReleaseDC (hwnd, hdc);
                    134:     } return 0;
                    135: 
                    136: 
                    137: 
                    138: 
                    139: 
                    140: 
                    141: 
                    142:     /**********************************************************************\
                    143:     *  WM_CREATE
                    144:     *
                    145:     * Create pens for drawing with later.
                    146:     \**********************************************************************/
                    147:     case WM_CREATE:
                    148:       hPenGrid   = CreatePen (PS_SOLID, 1, GRIDCOLOR);
                    149:       SetWindowLong (hwnd, GWL_USERDATA, (LONG) GetStockObject (SYSTEM_FONT));
                    150: 
                    151:       allglyphsGlobal =
                    152:       mapperflagsGlobal = FALSE;
                    153: 
                    154:     break;
                    155: 
                    156: 
                    157:     /**********************************************************************\
                    158:     *  WM_DESTROY
                    159:     *
                    160:     * Complement of the WM_CREATE message.  Delete the pens that were
                    161:     *  created and then call postquitmessage.
                    162:     \**********************************************************************/
                    163:     case WM_DESTROY:
                    164:       DeleteObject (hPenGrid);
                    165: 
                    166:     break;
                    167: 
                    168: 
                    169: 
                    170:     /**********************************************************************\
                    171:     *  WM_ERASEBKGND
                    172:     *
                    173:     * Offset the origin conditional on allglyphsGlobal.  Grid the window.
                    174:     \**********************************************************************/
                    175:     case WM_ERASEBKGND: {
                    176:       HDC hdc;
                    177:       RECT rect;
                    178:       int i;
                    179: 
                    180:       hdc = (HDC)wParam;
                    181: 
                    182:       GetClientRect (hwnd, &rect);
                    183:       FillRect (hdc, &rect, GetStockObject (LTGRAY_BRUSH));
                    184: 
                    185:       if (!allglyphsGlobal) {
                    186:         SetViewportOrgEx (hdc, rect.right /2, rect.bottom/2, NULL);
                    187:         OffsetRect (&rect, -rect.right/2, -rect.bottom/2);
                    188:       }
                    189: 
                    190:       SelectObject(hdc, hPenGrid);
                    191:       /* Draw vertical lines.  */
                    192:       for (i = 0; i<= rect.right; i+=TICKSPACE){
                    193:         MoveToEx (hdc, i, rect.top, NULL);
                    194:         LineTo (hdc, i, rect.bottom);
                    195:         MoveToEx (hdc, -i, rect.top, NULL);
                    196:         LineTo (hdc, -i, rect.bottom);
                    197:       }
                    198:       MoveToEx (hdc, 1, rect.top, NULL);
                    199:       LineTo (hdc, 1, rect.bottom);
                    200: 
                    201:       /* Draw horizontal lines.  */
                    202:       for (i = 0; i<= rect.bottom; i+=TICKSPACE){
                    203:         MoveToEx (hdc, rect.left,i, NULL);
                    204:         LineTo (hdc, rect.right,i);
                    205:         MoveToEx (hdc, rect.left,-i, NULL);
                    206:         LineTo (hdc, rect.right,-i);
                    207:       }
                    208:       MoveToEx (hdc, rect.left, 1, NULL);
                    209:       LineTo (hdc, rect.right,1);
                    210:     } return TRUE;
                    211: 
                    212: 
                    213: 
                    214:     /**********************************************************************\
                    215:     *  WM_PAINT
                    216:     *
                    217:     * Offset the origin conditional on allglyphsGlobal.  Write the "Hello"
                    218:     *  string if allglyphsGlobal is FALSE, otherwise step though all of
                    219:     *  the glyphs (from TEXTMETRIC.tmFirstChar to TEXTMETRIC.tmLastChar)
                    220:     *  and write them in the window.
                    221:     \**********************************************************************/
                    222:     case WM_PAINT: {
                    223:       HDC hdc;
                    224:       PAINTSTRUCT ps;
                    225:       RECT rect;
                    226:       POINT point;
                    227:       BYTE outByte;
                    228:       LOGFONT  lf;
                    229:       TEXTMETRIC tm;
                    230: 
                    231:       hdc = BeginPaint(hwnd, &ps);
                    232:       SetMapperFlags (hdc, mapperflagsGlobal);
                    233: 
                    234:       GetClientRect (hwnd, &rect);
                    235:       hfont = (HFONT) GetWindowLong (hwnd, GWL_USERDATA);
                    236:       SelectObject (hdc,hfont);
                    237:       SetBkMode (hdc, TRANSPARENT);
                    238: 
                    239: 
                    240:       if (!allglyphsGlobal) {
                    241:         SetViewportOrgEx (hdc, rect.right /2, rect.bottom/2, NULL);
                    242:         TextOut (hdc, 0, 0, "Hello", 5);
                    243:       } else {
                    244:         SetTextAlign (hdc, TA_LEFT | TA_TOP | TA_UPDATECP);
                    245:         GetObject (hfont, sizeof(LOGFONT), &lf);
                    246:         GetTextMetrics (hdc, &tm);
                    247: 
                    248:         MoveToEx (hdc, 0,0, NULL);
                    249: 
                    250:         for (outByte = tm.tmFirstChar; outByte <= tm.tmLastChar; outByte++) {
                    251: 
                    252:           GetCurrentPositionEx (hdc, &point);
                    253:           if (point.x > (rect.right - lf.lfWidth)) {
                    254:             point.x = 0;
                    255:             point.y += lf.lfHeight;
                    256:             MoveToEx (hdc, point.x, point.y, NULL);
                    257:           }
                    258:           if (point.y > rect.bottom)  break;
                    259:           if (outByte == MAXBYTE)  break; // tm.tmLastChar is often 0xff
                    260: 
                    261:           TextOut (hdc, 0,0, &outByte, 1);
                    262: 
                    263: 
                    264:         }
                    265:       }
                    266: 
                    267: 
                    268:       EndPaint (hwnd, &ps);
                    269: 
                    270:     } return FALSE;
                    271: 
                    272: 
                    273:     default:
                    274:       return (DefWindowProc(hwnd, message, wParam, lParam));
                    275:     }
                    276:     return (NULL);
                    277: }

unix.superglobalmegacorp.com

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