home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / progwin / chap09 / grafmenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-12  |  7.5 KB  |  235 lines

  1. /*----------------------------------------------
  2.    GRAFMENU.C -- Demonstrates Bitmap Menu Items
  3.                  (c) Charles Petzold, 1990
  4.   ----------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <string.h>
  8. #include "grafmenu.h"
  9.  
  10. long FAR PASCAL WndProc  (HWND, WORD, WORD, LONG) ;
  11. HBITMAP StretchBitmap (HBITMAP) ;
  12. HBITMAP GetBitmapFont (int) ;
  13.  
  14. char szAppName [] = "GrafMenu" ;
  15.  
  16. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  17.                     LPSTR lpszCmdLine, int nCmdShow)
  18.      {
  19.      HBITMAP  hBitmapHelp, hBitmapFile, hBitmapEdit,
  20.               hBitmapFont, hBitmapPopFont [3] ;
  21.      HMENU    hMenu, hMenuPopup ;
  22.      HWND     hwnd ;
  23.      int      i ;
  24.      MSG      msg ;
  25.      WNDCLASS wndclass ;
  26.  
  27.      if (!hPrevInstance) 
  28.           {
  29.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  30.           wndclass.lpfnWndProc   = WndProc ;
  31.           wndclass.cbClsExtra    = 0 ;
  32.           wndclass.cbWndExtra    = 0 ;
  33.           wndclass.hInstance     = hInstance ;
  34.           wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  35.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  36.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  37.           wndclass.lpszMenuName  = NULL ;
  38.           wndclass.lpszClassName = szAppName ;
  39.  
  40.           RegisterClass (&wndclass) ;
  41.           }
  42.  
  43.      hMenu = CreateMenu () ;
  44.  
  45.      hMenuPopup = LoadMenu (hInstance, "MenuFile") ;
  46.      hBitmapFile = StretchBitmap (LoadBitmap (hInstance, "BitmapFile")) ;
  47.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  48.                  (LPSTR) (LONG) hBitmapFile);
  49.  
  50.      hMenuPopup = LoadMenu (hInstance, "MenuEdit") ;
  51.      hBitmapEdit = StretchBitmap (LoadBitmap (hInstance, "BitmapEdit")) ;
  52.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  53.                  (LPSTR) (LONG) hBitmapEdit);
  54.  
  55.      hMenuPopup = CreateMenu () ;
  56.  
  57.      for (i = 0 ; i < 3 ; i++)
  58.           {
  59.           hBitmapPopFont [i] = GetBitmapFont (i) ;
  60.           AppendMenu (hMenuPopup, MF_BITMAP, IDM_COUR + i,
  61.                       (LPSTR) (LONG) hBitmapPopFont [i]) ;
  62.           }
  63.  
  64.      hBitmapFont = StretchBitmap (LoadBitmap (hInstance, "BitmapFont")) ;
  65.      AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  66.                  (LPSTR) (LONG) hBitmapFont);
  67.  
  68.      hwnd = CreateWindow (szAppName, "Bitmap Menu Demonstration",
  69.                           WS_OVERLAPPEDWINDOW,
  70.                           CW_USEDEFAULT, CW_USEDEFAULT,
  71.                           CW_USEDEFAULT, CW_USEDEFAULT,
  72.                           NULL, hMenu, hInstance, NULL) ;
  73.  
  74.      hMenu = GetSystemMenu (hwnd, FALSE);
  75.      hBitmapHelp = StretchBitmap (LoadBitmap (hInstance, "BitmapHelp")) ;
  76.      AppendMenu (hMenu, MF_SEPARATOR, NULL,     NULL) ;
  77.      AppendMenu (hMenu, MF_BITMAP,    IDM_HELP, (LPSTR) (LONG) hBitmapHelp) ;
  78.  
  79.      ShowWindow (hwnd, nCmdShow) ;
  80.      UpdateWindow (hwnd) ;
  81.  
  82.      while (GetMessage (&msg, NULL, 0, 0))
  83.           {
  84.           TranslateMessage (&msg) ;
  85.           DispatchMessage (&msg) ;
  86.           }
  87.  
  88.      DeleteObject (hBitmapHelp) ;
  89.      DeleteObject (hBitmapEdit) ;
  90.      DeleteObject (hBitmapFile) ;
  91.      DeleteObject (hBitmapFont) ;
  92.  
  93.      for (i = 0 ; i < 3 ; i++)
  94.           DeleteObject (hBitmapPopFont [i]) ;
  95.  
  96.      return msg.wParam ;
  97.      }
  98.  
  99. HBITMAP StretchBitmap (HBITMAP hBitmap1)
  100.      {
  101.      BITMAP     bm1, bm2 ;
  102.      HBITMAP    hBitmap2 ;
  103.      HDC        hdc, hdcMem1, hdcMem2 ;
  104.      TEXTMETRIC tm ;
  105.  
  106.      hdc = CreateIC ("DISPLAY", NULL, NULL, NULL) ;
  107.      GetTextMetrics (hdc, &tm) ;
  108.      hdcMem1 = CreateCompatibleDC (hdc) ;
  109.      hdcMem2 = CreateCompatibleDC (hdc) ;
  110.      DeleteDC (hdc) ;
  111.  
  112.      GetObject (hBitmap1, sizeof (BITMAP), (LPSTR) &bm1) ;
  113.  
  114.      bm2 = bm1 ;
  115.      bm2.bmWidth      = (tm.tmAveCharWidth * bm2.bmWidth)  / 4 ;
  116.      bm2.bmHeight     = (tm.tmHeight       * bm2.bmHeight) / 8 ;
  117.      bm2.bmWidthBytes = ((bm2.bmWidth + 15) / 16) * 2 ;
  118.  
  119.      hBitmap2 = CreateBitmapIndirect (&bm2) ;
  120.  
  121.      SelectObject (hdcMem1, hBitmap1) ;
  122.      SelectObject (hdcMem2, hBitmap2) ;
  123.  
  124.      StretchBlt (hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight,
  125.                  hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, SRCCOPY) ;
  126.  
  127.      DeleteDC (hdcMem1) ;
  128.      DeleteDC (hdcMem2) ;
  129.      DeleteObject (hBitmap1) ;
  130.  
  131.      return hBitmap2 ;
  132.      }
  133.  
  134. HBITMAP GetBitmapFont (int i)
  135.      {
  136.      static  struct
  137.           {
  138.           BYTE lfPitchAndFamily ;
  139.           BYTE lfFaceName [LF_FACESIZE] ;
  140.           char *szMenuText ;
  141.           } 
  142.           lfSet [3] =
  143.           {
  144.           FIXED_PITCH    | FF_MODERN, "Courier",   "Courier",
  145.           VARIABLE_PITCH | FF_SWISS,  "Helvetica", "Helvetica",
  146.           VARIABLE_PITCH | FF_ROMAN,  "Tms Rmn",   "Times Roman"
  147.           } ;
  148.      DWORD   dwSize ;
  149.      HBITMAP hBitmap ;
  150.      HDC     hdc, hdcMem ;
  151.      HFONT   hFont ;
  152.      LOGFONT lf ;
  153.  
  154.      hFont = GetStockObject (SYSTEM_FONT) ;
  155.      GetObject (hFont, sizeof (LOGFONT), (LPSTR) &lf) ;
  156.  
  157.      lf.lfHeight *= 2 ;
  158.      lf.lfWidth  *= 2 ;
  159.      lf.lfPitchAndFamily = lfSet[i].lfPitchAndFamily ;
  160.      strcpy (lf.lfFaceName, lfSet[i].lfFaceName) ;
  161.  
  162.      hdc = CreateIC ("DISPLAY", NULL, NULL, NULL) ;
  163.      hdcMem = CreateCompatibleDC (hdc) ;
  164.      SelectObject (hdcMem, CreateFontIndirect (&lf)) ;
  165.      dwSize = GetTextExtent (hdcMem, lfSet[i].szMenuText,
  166.                              strlen (lfSet[i].szMenuText)) ;
  167.  
  168.      hBitmap = CreateBitmap (LOWORD (dwSize)-1, HIWORD (dwSize), 1, 1, NULL) ;
  169.      SelectObject (hdcMem, hBitmap) ;
  170.  
  171.  
  172.      TextOut (hdcMem, 0, 0, lfSet[i].szMenuText,
  173.                             strlen (lfSet[i].szMenuText)) ;
  174.  
  175.      DeleteObject (SelectObject (hdcMem, hFont)) ;
  176.      DeleteDC (hdcMem) ;
  177.      DeleteDC (hdc) ;
  178.  
  179.      return hBitmap ;
  180.      }
  181.  
  182. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  183.      {
  184.      HMENU  hMenu ;
  185.      static short nCurrentFont = IDM_COUR ;
  186.  
  187.      switch (message)
  188.           {
  189.           case WM_CREATE:
  190.                CheckMenuItem (GetMenu (hwnd), nCurrentFont, MF_CHECKED) ;
  191.                return 0 ;
  192.  
  193.           case WM_SYSCOMMAND:
  194.                switch (wParam)
  195.                     {
  196.                     case IDM_HELP:
  197.                          MessageBox (hwnd, "Help not yet implemented.",
  198.                                    szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  199.                          return 0 ;
  200.                     }
  201.                break ;
  202.  
  203.           case WM_COMMAND:
  204.                switch (wParam)
  205.                     {
  206.                     case IDM_NEW:
  207.                     case IDM_OPEN:
  208.                     case IDM_SAVE:
  209.                     case IDM_SAVEAS:
  210.                     case IDM_UNDO:
  211.                     case IDM_CUT:
  212.                     case IDM_COPY:
  213.                     case IDM_PASTE:
  214.                     case IDM_CLEAR:
  215.                          MessageBeep (0) ;
  216.                          return 0 ;
  217.  
  218.                     case IDM_COUR:
  219.                     case IDM_HELV:
  220.                     case IDM_TMSRMN:
  221.                          hMenu = GetMenu (hwnd) ;
  222.                          CheckMenuItem (hMenu, nCurrentFont, MF_UNCHECKED) ;
  223.                          nCurrentFont = wParam ;
  224.                          CheckMenuItem (hMenu, nCurrentFont, MF_CHECKED) ;
  225.                          return 0 ;
  226.                     }
  227.                break ;
  228.  
  229.           case WM_DESTROY:
  230.                PostQuitMessage (0) ;
  231.                return 0 ;
  232.           }
  233.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  234.      }
  235.