Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 1.DOC
Скачиваний:
107
Добавлен:
10.05.2014
Размер:
721.41 Кб
Скачать

3. Ресурсы: меню Простая программа с меню

Линейка меню является непременным атрибутом главного окна практически всех приложений Windows и основным средством активизации тех или иных программных средств, предусмотренных в приложении, а также изменения режимов его работы. Рассмотрим простую программу с меню, с помощью которого изменяется цвет фона главного окна. В программе предусмотрена линейка меню с единственным пунктом "Фон". При щелчке по нему левой клавишей мыши открывается меню из трех пунктов:"Синий","Зеленый"и"Выход"(такое меню называют всплывающим, popup). Выбор каждого пункта всплывающего меню приводит к соответствующему действию: перекраске фона окна или завершению всего приложения. На рис. 3.1 показано окно приложения с открытым меню.

Рис. 3.1. Главное окно приложения с открытым меню

Меню можно создать в программе различными способами. Наиболее распространенным и удобным является включение в приложение меню в качестве ресурса; в этом случае форма меню описывается в специальном файле ресурсов (в нашем случае файл 3-1.RC). Кроме этого, в рассматриваемый программный комплекс включен еще один дополнительный файл3-1.H (заголовочный файл), в который собраны, как это обычно и делается, определения используемых в программе констант (идентифицирующих пункты меню), а также прототипы прикладных функций.

/*Пример 3-1. Программа с меню в главном окне*/

/*Заголовочный файл3-1.H*/

/*Определения констант*/

#define MI_BLUE 100

#define MI_GREEN 101

#define MI_EXIT 102

/*Прототипы функций*/

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

BOOL OnCreate(HWND,LPCREATESTRUCT);

void OnPaint(HWND);

void OnCommand(HWND,int,HWND,UINT);

void OnDestroy(HWND);

/*Файл ресурсов 3-1.RC*/

#include "3-1.h"

Main MENU{

POPUP "Фон" {

MENUITEM "Синий",MI_BLUE

MENUITEM "Зеленый",MI_GREEN

MENUITEM SEPARATOR

MENUITEM "Выход",MI_EXIT

}

}

/*Файл с исходным текстом программы 3-1.CPP*/

#include <windows.h>

#include <windowsx.h>

#include "3-1.h"

HBRUSH hBlueBrush,hGreenBrush;//Дескрипторы кистей фона

int sw;//Переключатель для управления фоном окна

/*Главная функция WinMain*/

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){

char szClassName[]="MainWindow";

char szTitle[]="Программа 3-1";

MSG msg;

WNDCLASS wc;

/*Зарегистрируем класс главного окна*/

ZeroMemory(&wc,sizeof(wc));

wc.lpfnWndProc=WndProc;

wc.hInstance=hInst;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=GetStockBrush(WHITE_BRUSH);

wc.lpszMenuName="Main";//Имя меню в файле ресурсов

wc.lpszClassName=szClassName;

RegisterClass(&wc);

/*Создадим главное окно и сделаем его видимым*/

HWND hwnd=CreateWindow(szClassName,szTitle,

WS_OVERLAPPEDWINDOW,10,10,200,100,

HWND_DESKTOP,NULL,hInst,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);

/*Организуем цикл обработки сообщений*/

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

DispatchMessage(&msg);

return 0;

}

/*Оконная функция WndProcглавного окна*/

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,

WPARAM wParam,LPARAM lParam){

switch(msg){

HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);

HANDLE_MSG(hwnd,WM_CREATE,OnCreate);

HANDLE_MSG(hwnd,WM_PAINT,OnPaint);

HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);

default:

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

}

}

/*ФунцкияOnCreateобработки сообщений WM_CREATE*/

BOOL OnCreate(HWND,LPCREATESTRUCT){

/*Создадим новые кисти*/

hBlueBrush=CreateSolidBrush(RGB(100,100,255));

hGreenBrush=CreateSolidBrush(RGB(100,255,100));

return TRUE;

}

/*Функция OnCommandобработки сообщенийWM_COMMAND

void OnCommand(HWND hwnd,int id,HWND,UINT){

switch(id){//id = идентификатор выбранного пункта меню

case MI_BLUE:

sw=1;

InvalidateRect(hwnd,NULL,TRUE);

break;

case MI_GREEN:

sw=2;

InvalidateRect(hwnd,NULL,TRUE);

break;

case MI_EXIT:

DestroyWindow(hwnd);

}

}

/*ФункцияOnPaintобработки сообщенийWM_PAINT*/

void OnPaint(HWND hwnd){

PAINTSTRUCT ps;//Структура для функции BeginPaint()

HDC hdc=BeginPaint(hwnd,&ps);//Получим контекст устройства

if(sw==1)//Если выбрано "Синий"

FillRect(hdc,&ps.rcPaint,hBlueBrush);

if(sw==2)//Если выбрано "Зеленый"

FillRect(hdc,&ps.rcPaint,hGreenBrush);

EndPaint(hwnd,&ps);//Освободим контекста устройства

}

/*Функция OnDestroyобработки сообщенияWM_DESTROY*/

void OnDestroy(HWND){

PostQuitMessage(0);

}