home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 7.ddi / MWHC.007 / X1 < prev    next >
Encoding:
Text File  |  1991-10-22  |  7.6 KB  |  240 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. #ifdef __HIGHC__
  139.           CHAR lfPitchAndFamily ;
  140.           CHAR lfFaceName [LF_FACESIZE] ;
  141. #else
  142.           BYTE lfPitchAndFamily ;
  143.           BYTE lfFaceName [LF_FACESIZE] ;
  144. #endif
  145.           char *szMenuText ;
  146.           } 
  147.           lfSet [3] =
  148.           {
  149.           FIXED_PITCH    | FF_MODERN, "Courier",   "Courier",
  150.           VARIABLE_PITCH | FF_SWISS,  "Helvetica", "Helvetica",
  151.           VARIABLE_PITCH | FF_ROMAN,  "Tms Rmn",   "Times Roman"
  152.           } ;
  153.      DWORD   dwSize ;
  154.      HBITMAP hBitmap ;
  155.      HDC     hdc, hdcMem ;
  156.      HFONT   hFont ;
  157.      LOGFONT lf ;
  158.  
  159.      hFont = GetStockObject (SYSTEM_FONT) ;
  160.      GetObject (hFont, sizeof (LOGFONT), (LPSTR) &lf) ;
  161.  
  162.      lf.lfHeight *= 2 ;
  163.      lf.lfWidth  *= 2 ;
  164.      lf.lfPitchAndFamily = lfSet[i].lfPitchAndFamily ;
  165.      strcpy (lf.lfFaceName, lfSet[i].lfFaceName) ;
  166.  
  167.      hdc = CreateIC ("DISPLAY", NULL, NULL, NULL) ;
  168.      hdcMem = CreateCompatibleDC (hdc) ;
  169.      SelectObject (hdcMem, CreateFontIndirect (&lf)) ;
  170.      dwSize = GetTextExtent (hdcMem, lfSet[i].szMenuText,
  171.                              strlen (lfSet[i].szMenuText)) ;
  172.  
  173.      hBitmap = CreateBitmap (LOWORD (dwSize)-1, HIWORD (dwSize), 1, 1, NULL) ;
  174.      SelectObject (hdcMem, hBitmap) ;
  175.  
  176.  
  177.      TextOut (hdcMem, 0, 0, lfSet[i].szMenuText,
  178.                             strlen (lfSet[i].szMenuText)) ;
  179.  
  180.      DeleteObject (SelectObject (hdcMem, hFont)) ;
  181.      DeleteDC (hdcMem) ;
  182.      DeleteDC (hdc) ;
  183.  
  184.      return hBitmap ;
  185.      }
  186.  
  187. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  188.      {
  189.      HMENU  hMenu ;
  190.      static short nCurrentFont = IDM_COUR ;
  191.  
  192.      switch (message)
  193.           {
  194.           case WM_CREATE:
  195.                CheckMenuItem (GetMenu (hwnd), nCurrentFont, MF_CHECKED) ;
  196.                return 0 ;
  197.  
  198.           case WM_SYSCOMMAND:
  199.                switch (wParam)
  200.                     {
  201.                     case IDM_HELP:
  202.                          MessageBox (hwnd, "Help not yet implemented.",
  203.                                    szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  204.                          return 0 ;
  205.                     }
  206.                break ;
  207.  
  208.           case WM_COMMAND:
  209.                switch (wParam)
  210.                     {
  211.                     case IDM_NEW:
  212.                     case IDM_OPEN:
  213.                     case IDM_SAVE:
  214.                     case IDM_SAVEAS:
  215.                     case IDM_UNDO:
  216.                     case IDM_CUT:
  217.                     case IDM_COPY:
  218.                     case IDM_PASTE:
  219.                     case IDM_CLEAR:
  220.                          MessageBeep (0) ;
  221.                          return 0 ;
  222.  
  223.                     case IDM_COUR:
  224.                     case IDM_HELV:
  225.                     case IDM_TMSRMN:
  226.                          hMenu = GetMenu (hwnd) ;
  227.                          CheckMenuItem (hMenu, nCurrentFont, MF_UNCHECKED) ;
  228.                          nCurrentFont = wParam ;
  229.                          CheckMenuItem (hMenu, nCurrentFont, MF_CHECKED) ;
  230.                          return 0 ;
  231.                     }
  232.                break ;
  233.  
  234.           case WM_DESTROY:
  235.                PostQuitMessage (0) ;
  236.                return 0 ;
  237.           }
  238.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  239.      }
  240.