
Пример выполнения
Задание 1. Работа с меню
Рабочую область окна приложения занимают два временных окна. Главное меню первого временного окна содержит раздел "Файл" с командами "Создать", "Открыть", "Демо-версия" и "Выход". Причем состоянием строки "Демо-версия" управляет второе окно.
Исходный код программы:
2.rc:
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Russian resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MENU1 MENU
BEGIN
POPUP "Файл"
BEGIN
MENUITEM "Создать", ID_NEW
MENUITEM "Открыть", ID_OPEN
MENUITEM "Демо-версия", ID_DEMO, CHECKED
MENUITEM "Выход", ID_EXIT
END
END
#endif // Russian resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
resource.h:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by 2.rc
//
#define IDR_MENU1 101
#define ID_NEW 40005
#define ID_OPEN 40006
#define ID_DEMO 40007
#define ID_EXIT 40008
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40009
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
main.cpp:
#pragma comment (lib, "comctl32.lib")
#include <stdio.h>
#include <windows.h>
#include "resource.h"
#include <commctrl.h>
// --- Описание функции главного окна, а так же временного и дочернего окон
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam);
LRESULT CALLBACK PopupWnd1Proc(HWND hWnd, UINT msg, WPARAM
wParam, LPARAM lParam);
LRESULT CALLBACK PopupWnd2Proc(HWND hWnd, UINT msg, WPARAM
wParam, LPARAM lParam);
// --- Глобальные переменные
HINSTANCE hInst; // Дескриптор экземпляра приложения
LPCSTR lpszMainWndClassName="MainWindow";
LPCSTR lpszPopupWnd1ClassName="Popup1Window";
LPCSTR lpszPopupWnd2ClassName="Popup2Window";
HWND hWndMain;
HWND hWndPopup1;
HWND hWndPopup2;
HMENU hMenu;
// --- Функция WinMain
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
WNDCLASS wcp1; //класс всплывающего окна
WNDCLASS wcp2; //класс дочернего окна
MSG msg;
hInst=hInstance;
RECT r;
if((hWndMain=FindWindow(lpszMainWndClassName, NULL))!=NULL)
{
if(IsIconic(hWndMain)) ShowWindow(hWndMain, SW_RESTORE);
SetForegroundWindow(hWndMain);
return FALSE;
}
memset(&wc, 0, sizeof(wc));
wc.lpszClassName=lpszMainWndClassName;
wc.lpfnWndProc=(WNDPROC)MainWndProc;
wc.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса
wc.hInstance=hInstance; // Экземпляр приложения
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL; // Ресурс меню окон
wc.cbClsExtra=0; // Дополнительная память
wc.cbWndExtra=0; // Дополнительная память
RegisterClass(&wc);
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));
memset(&wcp1, 0, sizeof(wcp1));
wcp1.lpszClassName=lpszPopupWnd1ClassName;
wcp1.lpfnWndProc=(WNDPROC)PopupWnd1Proc;
wcp1.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса
wcp1.hInstance=hInstance; // Экземпляр приложения
wcp1.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcp1.hCursor=LoadCursor(NULL,IDC_ARROW);
wcp1.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
wcp1.lpszMenuName=NULL; // Ресурс меню окон
wcp1.cbClsExtra=0; // Дополнительная память
wcp1.cbWndExtra=0; // Дополнительная память
RegisterClass(&wcp1);
memset(&wcp2, 0, sizeof(wcp2));
wcp2.lpszClassName=lpszPopupWnd2ClassName;
wcp2.lpfnWndProc=(WNDPROC)PopupWnd2Proc;
wcp2.style=CS_HREDRAW|CS_VREDRAW; // Стиль класса
wcp2.hInstance=hInstance; // Экземпляр приложения
wcp2.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcp2.hCursor=LoadCursor(NULL,IDC_ARROW);
wcp2.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
wcp2.lpszMenuName=NULL; // Ресурс меню окон
wcp2.cbClsExtra=0; // Дополнительная память
wcp2.cbWndExtra=0; // Дополнительная память
RegisterClass(&wcp2);
hWndMain=CreateWindow(
lpszMainWndClassName, // Имя класса окон
"OVERLAPPEDWINDOW", // Заголовок окна
WS_OVERLAPPEDWINDOW, // Стиль окна
100, // X-координаты
100, // Y-координаты
CW_USEDEFAULT, // Ширина окна
CW_USEDEFAULT, // Высота окна
NULL, // Дескриптор окна-родителя
NULL, // Дескриптор меню окна
hInst, // Дескриптор экземпляра приложения
NULL); // Дополнительная информация
if(!hWndMain)
{
MessageBox(NULL,
"Create: error",lpszMainWndClassName,MB_OK|MB_ICONSTOP);
return FALSE;
}
GetClientRect(hWndMain,&r);
hWndPopup1=CreateWindow(
lpszPopupWnd1ClassName, // Имя класса окон
"POPUPWINDOW1", // Заголовок окна
WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|
WS_MAXIMIZEBOX|WS_SIZEBOX, // Стиль окна
105, // X-координаты
125, // Y-координаты
r.right, // Ширина окна
(r.bottom-25)/2, // Высота окна
hWndMain, // Дескриптор окна-родителя
hMenu, // Дескриптор меню окна
hInst, // Дескриптор экземпляра приложения
NULL); // Дополнительная информация
if(!hWndPopup1)
{
MessageBox(NULL,
"Create Popup1: error",lpszMainWndClassName,MB_OK|MB_ICONSTOP);
DestroyWindow(hWndMain);
return FALSE;
}
hWndPopup2=CreateWindow(
lpszPopupWnd2ClassName, // Имя класса окон
"POPUPWINDOW2", // Заголовок окна
WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|
WS_MAXIMIZEBOX|WS_SIZEBOX, // Стиль окна
105, // X-координаты
125+(r.bottom-25)/2, // Y-координаты
r.right, // Ширина окна
(r.bottom-25)/2, // Высота окна
hWndMain, // Дескриптор окна-родителя
NULL, // Дескриптор меню окна
hInst, // Дескриптор экземпляра приложения
NULL); // Дополнительная информация
if(!hWndPopup2)
{
MessageBox(NULL,
"Create Popup2: error",lpszMainWndClassName,MB_OK|MB_ICONSTOP);
DestroyWindow(hWndPopup1);
DestroyWindow(hWndMain);
return FALSE;
}
ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);
ShowWindow(hWndPopup1, SW_NORMAL);
UpdateWindow(hWndPopup1);
ShowWindow(hWndPopup2, SW_NORMAL);
UpdateWindow(hWndPopup2);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
char *str="Task №2";
switch(msg)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
// Получить контекст окна
TextOut(hDC,20,20,str,strlen(str));
// Нарисовать текст
EndPaint(hWnd,&ps);
// Освободить контекст окна
}; break;
case WM_DESTROY:
{
PostQuitMessage(0);
}; break;
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0l;
}
LRESULT CALLBACK PopupWnd1Proc(HWND hWnd, UINT msg, WPARAM
wParam, LPARAM lParam)
{
char *str="Popup1";
UINT uItem, fuFlags;
switch(msg)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
// Получить контекст окна
TextOut(hDC,20,20,str,strlen(str));
// Нарисовать текст
EndPaint(hWnd,&ps);
// Освободить контекст окна
return 0;
}
case WM_COMMAND:
{
switch (wParam)
{
case ID_NEW:
MessageBox(hWnd, "Выбрано: Файл|Создать",
"Сообщение",MB_OK|MB_ICONINFORMATION);
return 0;
case ID_OPEN:
MessageBox(hWnd, "Выбрано: Файл|0ткрыть",
"Сообщение",MB_OK|MB_ICONINFORMATION);
return 0;
case ID_EXIT:
MessageBox(hWnd, "Выбрано: Файл|Выход",
"Сообщение",MB_OK|MB_ICONINFORMATION);
DestroyWindow(hWndPopup1);
DestroyWindow(hWndPopup2);
DestroyWindow(hWndMain);
return 0;
default: return PopupWnd2Proc(hWnd, msg, wParam, lParam);
}
}
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
LRESULT CALLBACK PopupWnd2Proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
char *str="Popup2";
switch(msg)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
// Получить контекст окна
TextOut(hDC,20,20,str,strlen(str));
// Нарисовать текст
EndPaint(hWnd,&ps);
// Освободить контекст окна
}; break;
case WM_COMMAND:
{
switch (wParam)
{
case ID_DEMO:
MessageBox(hWnd, "Выбрано: Файл|Демо-версия",
"Сообщение", MB_OK | MB_ICONINFORMATION);
}
}; break;
case WM_LBUTTONDOWN:
{
if(GetMenuState(hMenu,ID_DEMO,MF_BYCOMMAND)==MF_CHECKED)
CheckMenuItem(hMenu,ID_DEMO,MF_UNCHECKED);
else CheckMenuItem(hMenu,ID_DEMO,MF_CHECKED);
}; break;
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0l;
}
Задание 2. Описать функцию, которая в указанном прямоугольнике строит эллиптическую диаграмму. Количество секторов, их доля в процентах и цвета закрашивания также передаются аргументами вызова функции.
П
ри
щелчке правой кнопки мыши появляется
диалоговое окно. Пользователь вводит
положение и размеры прямоугольника, к
который вписывается эллипс.
П
ри
щелчке левой кнопки мыши появляется
диалоговое окно, в котором пользователь
вводит параметры необходимого сектора:
его процентную долю от всего эллипса и
его цвет. Существует возможность добавить
новый сектор и удалить существующий.
Также присутвует область, которая
показывает заполненность элипса.
В результате возможно получение данного эллипса, разделенного на сектора разных цветов.