Читайте также:
|
|
Задание 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. Описать функцию, которая в указанном прямоугольнике строит эллиптическую диаграмму. Количество секторов, их доля в процентах и цвета закрашивания также передаются аргументами вызова функции.
В результате возможно получение данного эллипса, разделенного на сектора разных цветов.
Листинг программы
// --- Обязательный включаемый файл
#include <windows.h>
#include <math.h>
#include <windowsx.h>
#include <stdlib.h>
#include "resource.h"
#define PI 3.14156
// --- Описание функции главного окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProc1(HWND hDlg1, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam);
double CalculateProcentToRad(double Percent);
//===================================================
double Edit[7];
struct TSector
{
double Percent;
int Color;
};
TSector Sectors[20];
int sector_count = 0;
int percent_count = 0;
//==========================================================================
void PrintRect(HDC hDC){
HPEN hpenW1, hpenOldPen;
hpenW1 = CreatePen(PS_SOLID, 1, RGB(0,0,0));
hpenOldPen = SelectPen(hDC, hpenW1);
MoveToEx(hDC, Edit[1], Edit[2], NULL);
LineTo(hDC, (Edit[1]+Edit[4]), Edit[2]);
MoveToEx(hDC, (Edit[1]+Edit[4]), Edit[2], NULL);
LineTo(hDC, (Edit[1]+Edit[4]), (Edit[2]+Edit[3]));
MoveToEx(hDC, (Edit[1]+Edit[4]), (Edit[2]+Edit[3]), NULL);
LineTo(hDC, Edit[1], (Edit[2]+Edit[3]));
MoveToEx(hDC, Edit[1], (Edit[2]+Edit[3]), NULL);
LineTo(hDC, Edit[1], Edit[2]);
SelectPen(hDC, hpenOldPen);
DeletePen(hpenW1);
}
//=========================================================================
void PrintRadPie (HDC hDC, int X0, int Y0, int A, int B, double R1, double R2, int Color){
HBRUSH hBr = CreateSolidBrush(Color);
HBRUSH hBrOld = (HBRUSH)SelectObject(hDC,hBr);
Pie (hDC, // дескриптор контекста отображения
X0, Y0, // координаты верхнего левого угла
A+X0, B+Y0, // координаты правого нижнего угла
((A/2)*cos(R1) + X0 + (A/2)), (-(B/2)*sin(R1) + Y0 + (B/2)), // координаты начала дуги
((A/2)*cos(R2) + X0 + (A/2)), (-(B/2)*sin(R2) + Y0 + (B/2)) // координаты начала дуги
);
SelectObject(hDC,hBrOld);
DeleteObject(hBr);
}
//===========================================================================
void PrintRadDiagram(HDC hDC, int X0, int Y0, int A, int B, TSector* Sectors, int SectorCount)
{
double R1 = 0;
for(int i=0; i<SectorCount; i++){
double R2 = CalculateProcentToRad(Sectors[i].Percent)+R1;
if(Sectors[i].Percent!=0){
PrintRadPie (hDC, X0, Y0, A, B, R1, R2, Sectors[i].Color);
}
R1 = R2;
}
}
//===========================================================================
double CalculateProcentToRad(double Percent){
double Rad = ((2*PI)*Percent)/100;
return Rad;
}
...
// --- Функция WinMain
int WINAPI WinMain(HINSTANCE hInstance,
...
for(int i=0;i<20;i++){
Sectors[i].Percent = 0;
Sectors[i].Color = 0;
}
Edit[0]=0;
Edit[1]=100;
Edit[2]=100;
Edit[3]=300;
Edit[4]=300;
Edit[5]=255;
Edit[6]=255;
Edit[7]=0;
...
// --- Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
InvalidateRect(hWnd,NULL,TRUE);
hDC=BeginPaint(hWnd,&ps);
PrintRect(hDC);
if(sector_count!=0)
PrintRadDiagram(hDC, Edit[1], Edit[2], Edit[4], Edit[3], Sectors, sector_count);
EndPaint(hWnd,&ps);
}; break;
case WM_LBUTTONDOWN:
{
DialogBox(hInst,(LPCTSTR)IDD_DIALOG1,hWnd,(DLGPROC)DlgProc1);
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
};
break;
case WM_RBUTTONDOWN:
{
DialogBox(hInst,(LPCTSTR)IDD_DIALOG2,hWnd,(DLGPROC)DlgProc2);
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
};
break;
case WM_DESTROY:
{
PostQuitMessage(0);
}; break;
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0l;
}
//==========================================================================
LRESULT CALLBACK DlgProc1(HWND hDlg1, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
SetDlgItemInt(hDlg1,IDC_EDIT2,Edit[1],0);
SetDlgItemInt(hDlg1,IDC_EDIT3,Edit[2],0);
SetDlgItemInt(hDlg1,IDC_EDIT4,Edit[3],0);
SetDlgItemInt(hDlg1,IDC_EDIT5,Edit[4],0);
return TRUE;
}; break;
case WM_INITDIALOG:
{
SetDlgItemInt(hDlg1,IDC_EDIT2,Edit[1],0);
SetDlgItemInt(hDlg1,IDC_EDIT3,Edit[2],0);
SetDlgItemInt(hDlg1,IDC_EDIT4,Edit[3],0);
SetDlgItemInt(hDlg1,IDC_EDIT5,Edit[4],0);
return TRUE;
}; break;
case WM_COMMAND:
{
switch(wParam)
{
case IDOK:
{
Edit[1] = GetDlgItemInt(hDlg1,IDC_EDIT2,FALSE,0);
Edit[2] = GetDlgItemInt(hDlg1,IDC_EDIT3,FALSE,0);
Edit[3] = GetDlgItemInt(hDlg1,IDC_EDIT4,FALSE,0);
Edit[4] = GetDlgItemInt(hDlg1,IDC_EDIT5,FALSE,0);
EndDialog(hDlg1,TRUE);
}; break;
case IDC_CLEAR:
{
SetDlgItemInt(hDlg1,IDC_EDIT2,0,0);
SetDlgItemInt(hDlg1,IDC_EDIT3,0,0);
SetDlgItemInt(hDlg1,IDC_EDIT4,0,0);
SetDlgItemInt(hDlg1,IDC_EDIT5,0,0);
}; break;
case IDCANCEL:
{
EndDialog(hDlg1,TRUE);
}; break;
default: return FALSE;
};
}
default: return FALSE;
};
return TRUE;
}
//==========================================================================
LRESULT CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
SetDlgItemInt(hDlg2,IDC_PERCENT,Edit[0],0);
SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);
return TRUE;
}; break;
case WM_INITDIALOG:
{
SetDlgItemInt(hDlg2,IDC_RED,Edit[5],0);
SetDlgItemInt(hDlg2,IDC_GREEN,Edit[6],0);
SetDlgItemInt(hDlg2,IDC_BLUE,Edit[7],0);
SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);
return TRUE;
}; break;
case WM_COMMAND:
{
switch(wParam)
{
case IDOK2:
{
Edit[0] = GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0);
Edit[5] = GetDlgItemInt(hDlg2,IDC_RED,FALSE,0);
Edit[6] = GetDlgItemInt(hDlg2,IDC_GREEN,FALSE,0);
Edit[7] = GetDlgItemInt(hDlg2,IDC_BLUE,FALSE,0);
SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);
EndDialog(hDlg2,TRUE);
}; break;
case IDC_SECTOR:
{
if((GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0)+percent_count)>100){
MessageBox(NULL,
"Слишком большой процент","Превышен лимит",MB_OK|MB_ICONSTOP);
return FALSE;
}
else {
Sectors[sector_count].Percent = GetDlgItemInt(hDlg2,IDC_PERCENT,FALSE,0);
percent_count += GetDlgItemInt(hDlg2,IDC_EDIT1,FALSE,0);
Sectors[sector_count].Color = RGB(GetDlgItemInt(hDlg2,IDC_RED,FALSE,0),
GetDlgItemInt(hDlg2,IDC_GREEN,FALSE,0),
GetDlgItemInt(hDlg2,IDC_BLUE,FALSE,0)
);
}
sector_count++;
SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);
}; break;
case IDC_DEL_SECTOR:
{
if(percent_count>0){
sector_count--;
percent_count -= (int)Sectors[sector_count].Percent;
SetDlgItemInt(hDlg2,IDC_EDIT2,percent_count,0);
Sectors[sector_count].Percent = 0;
Sectors[sector_count].Color = 0;
}
}; break;
case IDCANCEL2:
{
EndDialog(hDlg2,TRUE);
}; break;
default: return FALSE;
};
}
default: return FALSE;
};
return TRUE;
}
Дата добавления: 2015-08-13; просмотров: 141 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задание 2 | | | II. Требования к порядку предоставления муниципальной услуги |