Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

10.20.Использование графики в консольных приложениях

/* Иллюстрация использования функций графики в окне консольного приложения.

Этот пример еще раз указывает на отличие консольного приложения от

приложения MS DOS: MS DOS поддерживает или текстовый режим или графический,

но не два одновременно.

В приведенном ниже простеньком консольном приложении использован, с доработками,

текст программы неизвестного автора (MansMI)

http://www.cyberforum.ru/c-beginners/thread1124744.html

Для понимания приведенного ниже кода надо почитать литературу о графике Windows,

например, работу:

Круглински Д., Уингоу С., Шеферд Дж. Программирование на Microsoft Visual C++ для

профессионалов/Пер. с англ. – СПб:Питер; М.: Издательско-торговый дом "Русская

редакция", 2000. - 864с.

@Овсянник В.Н. 2014, ХАИ, к-105

*/

#include "stdafx.h"

#include <math.h>

#include <windows.h>

#include <conio.h>

#define M_PI 3.14159265359

using namespace std;

int main()

{

double sumang=0, dang=0, ang, r;

RECT rc;

int i, n, x0, y0;

const char Escape=27;

char ch=0;

POINT *arr=0;

/* Создаем красное (pred) и черное (pblack) перья*/

HPEN pred=CreatePen(PS_SOLID, 2, RGB(255,0,0));

HPEN pblack=CreatePen(PS_SOLID, 2, RGB(0,0,0));

/* Получаем дескриптор окна hwnd*/

HWND hwnd = GetForegroundWindow();

/* Получаем указатель на контекст устройства*/

HDC hdc = GetDC(hwnd);

setlocale(LC_ALL,"rus");

GetClientRect(hwnd, &rc);

x0=(int)(rc.right - rc.left)/2;

y0=(int)(rc.bottom - rc.top)/2+10;

r=y0-20;

cout<<"Введи число вершин многоугольника[>=2]>";

cin>>n;

cout<<"Escape -выход, L-вращать против час. стрелки, R-вращать по час. стрелке"<<endl;

ang=M_PI*2/n;

arr=new POINT[n+1];

do

{

for(i=0; i<=n; i++)

{

arr[i].x=x0+(int)(r*cos(M_PI/2+i*ang+sumang));

arr[i].y=y0-(int)(r*sin(M_PI/2+i*ang+sumang));

}

SelectObject(hdc, pred);

Polyline(hdc, arr, n+1);

Sleep(100);

SelectObject(hdc, pblack);

Polyline(hdc, arr, n+1);

if(_kbhit())

{

if(!(ch=_getch())) ch=_getch();

if((ch=='L')||(ch=='l')) dang=M_PI/36;

if((ch=='R')||(ch=='r')) dang=-M_PI/36;

}

sumang+=dang;

}while(ch!=Escape);

delete arr;

return 0;

}

Результат работы приложения может выглядеть так:

или так:

10.21.Изменение заголовка окна приложения и его прятание

void main()

{

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

_tprintf(_T("Fatal Error: MFC initialization failed\n"));

return;

}

HWND wnd=GetConsoleWindow();

ShowWindow (wnd,SW_HIDE); // Скрываем окно консоли

SetWindowTextW(wnd, L"Format");

// AfxMessageBox(L"Форматирование диска С: завершено",

// MB_OK|MB_ICONINFORMATION);

MessageBox(wnd,L"Форматирование диска С: завершено", L"Format",

MB_OK|MB_ICONINFORMATION);

}

11.Архитектура документ-вид и диалоговое окно

11.1.Как получить доступ к документу из диалогового окна

11.1.1.Первый способ

Допустим, имеется проект, шаблон которого создан с помощью мастера MFC AppWizard (exe) и при его создании был выбран тип приложения, поддерживающий архитектуру документ-вид (Document/View architecture support) с одним документом (single document). Допустим также, для конкретности, что классы названы так (имя каталога с проектом Get_Doc_from_Dialog, а имя проекта – Constr):

CConstrDoc – класс документа;

CConstrView – класс вида;

CMyDialog – класс диалогового окна.

Теперь предположим, что нам требуется отображать в управляющих элементах диалогового окна некоторые данные документа. Рекомендуемым Microsoft подходом является получение доступа к документу из методов класса вид с помощью получения указателя на документ

CConstrDoc *pDoc=GetDocument();

Теперь мы можем «добраться» до данных с помощью квалифицированного имени pDoc->Данное. Так как обычно диалоговое окно создается каким-либо из методов класса вид, то нет никаких проблем передать теперь данные в диалоговое окно (см. лаб. работу «Разработка приложения с модальным диалоговым окном с архитектурой документ-вид»).

Если все же требуется получить доступ к данным документа непосредственно из методов класса диалог, то надо как-то передать указатель на документ в класс диалога. Сделать это можно, модифицировав конструктор диалогового окна.

Изменим объявление конструктора диалогового окна в файле MyDialog.h и добавим в класс член-данное CDocument *pDOC:

class CMyDialog : public CDialog

{

public:

CMyDialog(CDocument * pdoc);

// …

protected:

CDocument *pDOC;

Соответственно, в файле MyDialog.cpp опишем такую реализацию конструктора

CMyDialog::CMyDialog(CDocument* pdoc ) : CDialog(CMyDialog::IDD, NULL)

{

//{{AFX_DATA_INIT(CMyDialog)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

pDOC=pdoc;

}

В том методе класса вид, где создается диалоговое окно (это может быть обработчик нажатия какой-нибудь кнопки или темы меню), надо поступить так:

CConstrDoc *pDoc=GetDocument();

CMyDialog dlg((CConstrDoc*) pDoc);

// …

dlg.DoModal();// показываем диалоговое окно

Само собой разумеется, что надо подключить заголовочный файл ConstrDoc.h к файлу MyDialog.cpp для того, чтобы было видно объявление класса CConstrDoc.

Теперь в классе диалог мы получаем доступ к данным документа таким образом:

BOOL CMyDialog::OnInitDialog()

{

CDialog::OnInitDialog();

CConstrDoc * pdc = (CConstrDoc *)pDOC;

pdc->член-данное…;

// ((CConstrDoc *) pDOC)-> член-данное…; - можно и так, но длинно

return TRUE;

}

Само собой разумеется, что так же можно вызывать и методы объекта документ.

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