- •Лабораторный практикум «Основы разработки приложений Windows» Книга 1
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум95
- •Часть 1 Теоретические сведения
- •1. Структура приложения Windows Простейшая программа с главным окном
- •Структура программы
- •Главная функция WinMain()
- •Регистрация класса окна
- •Создание и показ окна
- •Сообщения Windows и цикл их обработки
- •Оконная функция
- •Макрос handle_msg и структурирование программы
- •2. Интерфейс графических устройств
- •Простая программа, использующая средства gdi
- •Обработка сообщений wmpaint
- •Контекст устройства
- •Использование графических инструментов
- •3. Ресурсы: меню Простая программа с меню
- •Файл ресурсов
- •Описание меню в файле ресурсов
- •Сообщение wmcommand
- •Программное создание меню
- •Плавающее меню
- •Инструментальная панель
- •Всплывающие подсказки
- •0,"Первая строка"
- •1,"Вторая строка"
- •2,"Третья строка"
- •4. Ресурсы: диалоговые окна
- •Простая программа с меню и диалогом
- •Описание диалога в файле ресурсов
- •Обслуживание модального диалога
- •Модальный диалог как главное окно приложения
- •Немодальный диалог
- •Список в диалоговом окне
- •Окно редактирования и статический элемент управления
- •Графика в диалоговом окне
- •Перекрашивание диалогового окна и его элементов
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Вызов функций Windows
- •Работа 2. Главное окно приложения (пример 1-1 из настоящего пособия)
- •Работа 3. Вывод в главное окно приложения текста и фигур (пример 2-1 из настоящего пособия)
- •Работа 4.Вывод в главное окно приложения текста и фигур (индивидуальное задание а)
- •Работа 5. Меню и модальный диалог (пример 4-1 из настоящего пособия)
- •Работа 6.Меню (индивидуальное задание в)
- •Работа 7.Модальный диалог в качестве главного окна приложения (индивидуальное задание с)
- •Работа 8.Вывод графика в главное окно приложения (индивидуальное заданиеD)
- •Работа 9. Немодальный диалог
- •Работа 10. Диалог с окном редактирования
- •Работа 11. Программное создание меню
- •Работа 12. Плавающее меню
- •Работа 13. График в диалоговом окне
- •Работа 14. Инструментальная панель (tool bar)
- •Работа 15. Инструментальная панель со всплывающими подсказками (tool tips)
- •Работа 16. Пользовательские пиктограммы и курсоры
- •Работа 17. Локализация программных продуктов
- •Индивидуальные задания лабораторного практикума
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);
}