Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР_Windows.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
207.87 Кб
Скачать

Пример выполнения

Задание 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. Описать функцию, которая в указанном прямоугольнике строит эллиптическую диаграмму. Количество секторов, их доля в процентах и цвета закрашивания также передаются аргументами вызова функции.

П ри щелчке правой кнопки мыши появляется диалоговое окно. Пользователь вводит положение и размеры прямоугольника, к который вписывается эллипс.

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

В результате возможно получение данного эллипса, разделенного на сектора разных цветов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]