Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

335

[другие строки программы]

}

break;

При обработке сообщения WM_DESTROY программа NOPOPUPS настраивает меню программы на меню Main и, вызывая функцию DestroyMenu, удаляет меню File и Edit. Само меню Main удаляется автоматически при удалении окна программы.

Использование в меню битовых образов

Символьные строки — это не единственный способ вывода на экран пунктов меню. Для этой цели можно также использовать битовые образы. Если вы тотчас с ужасом подумали о меню с изображением папок с файлами, банок с кашей и мусорных корзин, то забудьте о картинках. Лучше подумайте о том, какими полезными могли бы быть битовые образы в программах рисования. Подумайте об использовании разных шрифтов и размеров шрифтов, линий разной ширины, штриховых шаблонов и цветов в ваших меню.

Программа, которую мы собираемся исследовать, называется GRAFMENU (graphics menu, графическое меню). Главное меню показано на рис. 10.6. Увеличенные буквы получены из монохромных битовых образов размером 40 на 16 пикселей и сохранены как файлы типа .BMP, которые были созданы с помощью редактора изображений, входящего в состав Developer Studio. Выбор из меню опции FONT вызывает появление всплывающего меню с тремя опциями — Courier New, Arial и Times New Roman. Это стандартные шрифты Windows типа TrueType, и

каждая опция представлена на экране соответствующим ей шрифтом (см. рис. 10.7). Эти битовые образы были созданы в программе с использованием контекста памяти.

Рис. 10.6 Главное меню программы GRAFMENU

Рис. 10.7 Всплывающее окно меню FONT программы GRAFMENU

336

И наконец, когда вы открываете системное меню, то получаете доступ к некоторой справочной информации, обозначенной словом "Help", отражающим, вероятно, отчаяние новичка (см. рис. 10.8). Этот монохромный битовый образ размером 64 на 64 пикселя был создан с помощью редактора изображений, входящего в состав

Developer Studio.

Рис. 10.8 Системное меню программы GRAFMENU

Программа GRAFMENU, а также четыре битовых образа, созданных в редакторе изображений, представлены на рис. 10.9.

GRAFMENU.MAK

#------------------------

# GRAFMENU.MAK make file

#------------------------

grafmenu.exe : grafmenu.obj grafmenu.res $(LINKER) $(GUIFLAGS) -OUT:grafmenu.exe \ grafmenu.obj grafmenu.res $(GUILIBS)

grafmenu.obj : grafmenu.c grafmenu.h $(CC) $(CFLAGS) grafmenu.c

grafmenu.res : grafmenu.rc grafmenu.h \

editlabl.bmp filelabl.bmp fontlabl.bmp bighelp.bmp $(RC) $(RCVARS) grafmenu.rc

GRAFMENU.C

/*----------------------------------------------

 

GRAFMENU.C --

Demonstrates Bitmap Menu Items

 

(c) Charles Petzold, 1996

----------------------------------------------

*/

#include <windows.h> #include <string.h> #include "grafmenu.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

HBITMAP StretchBitmap(HBITMAP);

HBITMAP GetBitmapFont(int);

char szAppName[] = "GrafMenu";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

{

 

HBITMAP

hBitmapHelp, hBitmapFile, hBitmapEdit,

 

hBitmapFont, hBitmapPopFont[3];

HMENU

hMenu, hMenuPopup;

337

HWND

hwnd;

int

i;

MSG

msg;

WNDCLASSEX wndclass;

 

wndclass.cbSize

= sizeof(wndclass);

wndclass.style

= CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc

= WndProc;

wndclass.cbClsExtra

= 0;

wndclass.cbWndExtra

= 0;

wndclass.hInstance

= hInstance;

wndclass.hIcon

= LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor

= LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground

=(HBRUSH) GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName

= NULL;

wndclass.lpszClassName

= szAppName;

wndclass.hIconSm

= LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

hMenu = CreateMenu();

hMenuPopup = LoadMenu(hInstance, "MenuFile");

hBitmapFile = StretchBitmap(LoadBitmap(hInstance, "BitmapFile"));

AppendMenu(hMenu, MF_BITMAP | MF_POPUP,(int) hMenuPopup,

(PSTR)(LONG) hBitmapFile);

hMenuPopup = LoadMenu(hInstance, "MenuEdit");

hBitmapEdit = StretchBitmap(LoadBitmap(hInstance, "BitmapEdit"));

AppendMenu(hMenu, MF_BITMAP | MF_POPUP,(int) hMenuPopup,

(PSTR)(LONG) hBitmapEdit);

hMenuPopup = CreateMenu(); for(i = 0; i < 3; i++)

{

hBitmapPopFont[i] = GetBitmapFont(i); AppendMenu(hMenuPopup, MF_BITMAP, IDM_COUR + i,

(PSTR)(LONG) hBitmapPopFont[i]);

}

hBitmapFont = StretchBitmap(LoadBitmap(hInstance, "BitmapFont"));

AppendMenu(hMenu, MF_BITMAP | MF_POPUP,(int) hMenuPopup,

(PSTR)(LONG) hBitmapFont);

hwnd = CreateWindow(szAppName, "Bitmap Menu Demonstration", WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, hMenu, hInstance, NULL);

hMenu = GetSystemMenu(hwnd, FALSE);

hBitmapHelp = StretchBitmap(LoadBitmap(hInstance, "BitmapHelp"));

AppendMenu(hMenu,

MF_SEPARATOR,

NULL,

NULL);

AppendMenu(hMenu,

MF_BITMAP,

IDM_HELP,(PSTR)(LONG) hBitmapHelp);

ShowWindow(hwnd, iCmdShow);

UpdateWindow(hwnd);

while(GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

338

DeleteObject(hBitmapHelp);

DeleteObject(hBitmapEdit);

DeleteObject(hBitmapFile);

DeleteObject(hBitmapFont);

for(i = 0; i < 3; i++) DeleteObject(hBitmapPopFont[i]);

return msg.wParam;

}

HBITMAP StretchBitmap(HBITMAP hBitmap1)

{

 

BITMAP

bm1, bm2;

HBITMAP

hBitmap2;

HDC

hdc, hdcMem1, hdcMem2;

TEXTMETRIC

tm;

hdc = CreateIC("DISPLAY", NULL, NULL, NULL); GetTextMetrics(hdc, &tm);

hdcMem1 = CreateCompatibleDC(hdc); hdcMem2 = CreateCompatibleDC(hdc); DeleteDC(hdc);

GetObject(hBitmap1, sizeof(BITMAP),(PSTR) &bm1);

bm2 = bm1;

 

 

bm2.bmWidth

=(tm.tmAveCharWidth * bm2.bmWidth) / 4;

bm2.bmHeight

=(tm.tmHeight

* bm2.bmHeight) / 8;

bm2.bmWidthBytes

=((bm2.bmWidth + 15) / 16) * 2;

hBitmap2 = CreateBitmapIndirect(&bm2);

SelectObject(hdcMem1, hBitmap1);

SelectObject(hdcMem2, hBitmap2);

StretchBlt(hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight,

hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, SRCCOPY);

DeleteDC(hdcMem1);

DeleteDC(hdcMem2);

DeleteObject(hBitmap1);

return hBitmap2;

}

HBITMAP GetBitmapFont(int i)

{

static char *szFaceName[3] = { "Courier New", "Arial", "Times New Roman" };

static LOGFONT

lf;

HBITMAP

hBitmap;

HDC

hdc, hdcMem;

HFONT

hFont;

SIZE

size;

TEXTMETRIC

tm;

hdc = CreateIC("DISPLAY", NULL, NULL, NULL); GetTextMetrics(hdc, &tm);

lf.lfHeight = 2 * tm.tmHeight;

strcpy((char *) lf.lfFaceName, szFaceName[i]);

hdcMem = CreateCompatibleDC(hdc);

339

hFont =(HFONT) SelectObject(hdcMem, CreateFontIndirect(&lf)); GetTextExtentPoint(hdcMem, szFaceName[i], strlen(szFaceName[i]), &size);

hBitmap = CreateBitmap(size.cx, size.cy, 1, 1, NULL); SelectObject(hdcMem, hBitmap);

TextOut(hdcMem, 0, 0, szFaceName[i], strlen(szFaceName[i]));

DeleteObject(SelectObject(hdcMem, hFont));

DeleteDC(hdcMem);

DeleteDC(hdc);

return hBitmap;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HMENU hMenu;

static int iCurrentFont = IDM_COUR;

switch(iMsg)

{

case WM_CREATE :

CheckMenuItem(GetMenu(hwnd), iCurrentFont, MF_CHECKED); return 0;

case WM_SYSCOMMAND : switch(LOWORD(wParam))

{

case IDM_HELP :

MessageBox(hwnd, "Help not yet implemented!", szAppName, MB_OK | MB_ICONEXCLAMATION);

return 0;

}

break;

case WM_COMMAND : switch(LOWORD(wParam))

{

case IDM_NEW : case IDM_OPEN : case IDM_SAVE : case IDM_SAVEAS : case IDM_UNDO : case IDM_CUT : case IDM_COPY : case IDM_PASTE : case IDM_DEL :

MessageBeep(0); return 0;

case IDM_COUR : case IDM_ARIAL : case IDM_TIMES :

hMenu = GetMenu(hwnd);

CheckMenuItem(hMenu, iCurrentFont, MF_UNCHECKED); iCurrentFont = LOWORD(wParam); CheckMenuItem(hMenu, iCurrentFont, MF_CHECKED); return 0;

}

break;

case WM_DESTROY : PostQuitMessage(0); return 0;

340

}

return DefWindowProc(hwnd, iMsg, wParam, lParam);

}

GRAFMENU.RC

/*-----------------------------

GRAFMENU.RC resource script

-----------------------------*/

#include "grafmenu.h"

BitmapEdit BITMAP editlabl.bmp

BitmapFile BITMAP filelabl.bmp

BitmapFont BITMAP fontlabl.bmp

BitmapHelp BITMAP bighelp.bmp

MenuFile MENU

 

 

 

 

{

 

 

 

 

MENUITEM "&New",

IDM_NEW

 

 

MENUITEM "&Open...",

IDM_OPEN

 

 

MENUITEM "&Save",

IDM_SAVE

 

 

MENUITEM "Save &As...", IDM_SAVEAS

 

 

}

 

 

 

 

MenuEdit MENU

 

 

 

 

{

 

 

 

 

MENUITEM "&Undo",

IDM_UNDO

 

 

MENUITEM SEPARATOR

 

 

 

MENUITEM "Cu&t",

IDM_CUT

 

 

MENUITEM "&Copy",

IDM_COPY

 

 

MENUITEM "&Paste",

IDM_PASTE

 

 

MENUITEM "De&lete",

IDM_DEL

 

 

}

 

 

 

 

GRAFMENU.H

 

 

 

 

/*------------------------

 

 

 

GRAFMENU.H header file

 

 

 

------------------------*/

 

 

#define IDM_NEW

1

 

 

 

#define IDM_OPEN

2

 

 

 

#define IDM_SAVE

3

 

 

 

#define IDM_SAVEAS

4

 

 

 

#define IDM_UNDO

5

 

 

 

#define IDM_CUT

6

 

 

 

#define IDM_COPY

7

 

 

 

#define IDM_PASTE

8

 

 

 

#define IDM_DEL

9

 

 

 

#define IDM_COUR

10

 

 

 

#define IDM_ARIAL

11

 

 

 

#define IDM_TIMES

12

 

 

 

#define IDM_HELP

13

 

 

 

EDITLABL.BMP

 

FILELABL.BMP

FONTLABL.BMP

BIGHELP.BMP

Рис. 10.9 Программа GRAFMENU

Соседние файлы в предмете Операционные системы