Литература: Пахомов Б. С. С++ и ms visual C++ 2010 для начинающих




Скачать 170.93 Kb.
Дата24.08.2016
Размер170.93 Kb.
Программное обеспечение:

Visual C++ (Visual Studio) версии 2010 Express или выше



Литература:

Пахомов Б.С. С++ и MS Visual C++ 2010 для начинающих

Зиборов В. MS Visual C++ 2010 в среде NET (Библиотека программиста) - 2012
Тема 1. Основы C++/CLI и Windows Forms

C++/CLI - диалект C++, используемый на платформе .NET. Платформа позволяет писать в едином стиле приложения на языках C++, C#, Visual Basic.

1. Создание проекта, его состав:

Файл

Описание

Form1.h

Заголовочный файл, содержащий описание формы и всех ее компонентов

арр.rс

Файл ресурсов проекта, записанный в виде сценария, который, в зависимости от типа проекта, содержит описание диалоговых окон, панелей инструментов, пиктограмм, версии проекта и др.

app.ico

Иконка (пиктограмма) программы

resource.h

Заголовочный файл содержит в себе определения ресурсов, используемых в проекте, сгенерированных из файла арр.гс

sldafx.h

Файл используется для построения предкомпиляционного заголовочного файла и предкомпиляционных объектных файлов

Assemblylnfo.cpp

Содержит информацию по сборке проекта (файлы, ресурсы, типы и т. п.)

sfdafx.cpp

Информация для создания предкомпиляционных файлов

Projname.cpp

где Projname – имя проекта. Содержит функцию int main(), оператор include, подключающий h-файл, содержащий описание формы и всех ее компонентов (т.е., это программа проекта на языке C++)

Solname.sln

где Solname – имя решения. Относится к категории группы проектов, объединенных в одно решение. Организует все элементы проекта (проектов) в одно общее решение

Solname.suo

Файл опций решения, хранит все пользовательские режимы, задаваемые при создании решения

Solname.sdf

Служебный файл IntelliSense. При копировании решения можно удалять (а также  .ncb, ipch, содержимое папок debug)

Projname.vcproj

Главный файл проекта для VC++ проектов, генерируемых с

использованием Мастера Приложений. Содержит информацию о версии среды разработки, о платформе, на которой создается приложение, и о свойствах созданного проекта



Projname.idl

Код описания интерфейса для управления библиотекой типов (используется для генерации такой библиотеки). Эта библиотека выставляет интерфейс компонента другим клиентам

Projname.ncb

Некомпилируемый файл, содержит информацию, генерируемую синтаксическим анализатором, которая используется классом View

Readme.txt

В этом файле описываются некоторые файлы созданного проекта

Главная форма - первая в проекте

2. Настройка среды:

Сервис - Параметры - Расширенные параметры ("полноценные" меню)

Сервис - Параметры - Сброс, если "потерялись" окна и их нет в Вид - Другие окна

Вид - Другие окна - Структура документа (при расширенных параметрах)

Если окна нет при Основных параметрах - включить Расширенные, посмотреть хоткей, вернуть Основные и восстановить окно хоткеем :)

Окно - Сброс макета окон (Reset window layout) - если запутались в плавающих и закреплённых вкладках



Скачать справку: Справка - Управление параметрами

Выбрать локальную справку Потом Установить содержимое из Интернета

Из списка выбрать Visual C++ (русский)

Лучше – онлайновую http://msdn.microsoft.com/ru-ru/library/, Visual C++

Установить всплывающую подсказку для сборок Express (по умолчанию нету) - сайт www.wholetomato.com

3. Свойства формы и основные общие свойства компонент

Свойство

Описание

ApplicationSettings

Установки приложения через файл app.settings

AllowDrop

выводятся ли данные при перетаскивании их над компонентом

AutoScaleMode

есть ли автомасштибирование:

Font в соответствии с размерами системного шрифта в ОС

DPI в соответствии с размерами экрана

Inherit наследовать от компьютера, на котором была сборка



AutoScroll

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

AutoScrollMargin

задать отступы в пикселах от внутреннего компонента, вызывающего скроллинг

AutoSize

менять ли размер элемента в соответствии с размером содержимого

AutoSizeMode

способ изменения формой своих размеров (только увеличение, увеличение и уменьшение)

BackColor

фоновый цвет

BackGroundImage

выбор фонового изображения

BackGroundImageLayOut

позиционирование фонового изображения (нет - мозаика - по центру - растянуть - масшабировать пропорционально)

CancelButton

работает ли клавиша Esc как отмена

CausesValidation

подавлять или не подавлять событие Validating при получении фокуса

ContextMenuStrip

назначить компоненту одно из созданных на форме системных меню (компонент ContextMenuStrip)

ControlBox

отключение системных кнопок окна формы

Cursor

выбор формы курсора мыши

DoubleBuffered

включение двойной буферизации для уменьшения мерцания при перерисовке

Enabled

компонент не блокирован/блокирован

Font

характеристики шрифта, по умолчанию наследуются компонентами-потомками

ForeColor

цвет переднего плана компонента

FormBorderStyle

стиль рамок окна (None - нет заголовка окна и рамок, имена на Sizeable - размер изменяется мышью, остальные - не меняется)

HelpButton

добавит кнопку "?" при отключённых значениях MaximizeBox и MinimizeBox, обрабатывается событием HelpRequested, например, код обработчика:

MessageBox::Show("Текст","Заголовок",

MessageBoxButtons::OK,MessageBoxIcon::Asterisk);


Icon

загрузка иконки приложения

ImeMode

выбор режима обработки входных данных компонента

IsMdiContainer

является ли контейнером для вложенных форм во многодокументных приложениях

KeyPreview

обрабатывать ли сначала в форме события нажатия клавиш от ее компонентов

Language

текущий язык локализации

Localizable

локализован ли код

Locked

блокирован ли компонент (если да, нельзя перемещать и изменять размер)

MainMenuStrip

подключает компоненты главного меню MenuStrip:

создадим меню Файл, в нём пункт Выход, добавим в контейнер формы, запрограммируем пункт: this->Close();



MaximumSize

ограничить макс.размеры или 0;0 безразмерно

MinimizeBox

есть ли кнопка "свернуть в трей"

MinimumSize

ограничить мин.размеры или 0;0 безразмерно

MaximizeBox

есть ли кнопка "размернуть на весь экран"

Opacity

уровень непрозрачности формы в %

Padding

внутренние отступы от границ компонента в пикселах

Margin

внешние отступы от границ компонента в пикселах

RightToLeft

выводить ли текст справа налево

Size

задаёт ширину и высоту компонента в пикселах

SizeGripStyle

выводить ли полоску захвата в правом нижнем углу окна

StartPosition

варианты начального положения окна формы (CenterScreen - по центру)

Tag

пользовательское свойство для хранения доп. информации

Text

текст, отображаемый для компоненты:

для формы - текст в строке заголовка

для кнопки - надпись на ней

для текстовой метки - текст метки



TextAlign

способ выравнивания значения Text относительно границ (TopLeft)

TopMost

отображать ли поверх других окон

TransparencyKey

цвет, остающийся прозрачным при закраске формы

UseWaitCursor

использовать ли курсор ожидания

WindowState

состояние окна формы после её первичного отображения в состоянии Normal

Некоторые события формы

Activated

возникает, когда форма активизирована

Click

возникает при щелчке мышью в форме

ControlAdded

возникает, когда в форму добавлен новый компонент

ControlRemoved

возникает, когда компонент удален из формы

CursorChanged

возникает, когда в форме изменяется свойство Cursor

DoubleClick

возникает после двойного щелчка в форме

FormClosed

возникает после закрытия формы

FormClosing

возникает перед закрытием формы

HelpButtonClicked

возникает после щелчка на кнопке HelpButton

HelpRequested

возникает при нажатии клавиши F1

Load

возникает перед первым выводом формы

Paint

возникает, когда форма перерисована

Scroll

возникает, когда в форме начинается прокрутка

Shown

возникает, когда форма впервые выведена

Некоторые методы формы

Close();

закрыть; при закрытии главной формы закрывается приложение

Hide();

спрятать

Show();

показать

ShowDialog();

показать модально

Dispose();

разрушить форму и освободить память

Focus();

сделать активной (Visible и Enabled становятся true)

Назначать свойства объектов в программном коде удобно или сразу после инициализации компонентов формы (после вызова процедуры InitializeComponent), или при обработке события Form1_Load. Основной "плюс" программного назначения - "читабельность" кода.


Первый обработчик события (Load формы)

Пр 1.

MessageBox::Show

("Сообщение","Заголовок",MessageBoxButtons::OK);
Пр 2.

int i=3;


textBox1->Text = i.ToString();
4. Основные компоненты - Button, Panel, Label, TextBox

Компоненты: используют классы и пространства имен библиотеки .NET Framework

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

Ключевое понятие при работе с готовыми компонентами - namespace ( пространство имен )- абстрактное хранилище для логической группировки идентификаторов (имен).

Для работы с встроенными методами и свойствами нужно обратиться к соответствующему namespace:



C#: using System.Collections

C++: using namespace System::Collections;


пространство имен . свойство

пространство имен :: статическая_величина
Пример: System.Collections.ArrayList



Кнопка Button, некоторые ранее не рассмотренные свойства

Anchor

управление закреплением компонента, взаимодействует с AutoSize

AutoEllipsis

если Да, есть многоточие, когда текст "не влазит" в компонент (при AutoSize==false)

DialogResult

какой результат диалогового окна возвращать при нажатии кнопки

Dock

аналог Align в VCL, показывает, к каким сторонам своего контейнера прикреплен компонент (выбор центр. прямоугольника - ко всем)

FlatStyle

выбор стиля элемента

Image

добавить на компоненту иконку (при FlatStyle != System)

ImageList, ImageIndex

для сопоставления списка изображений с кнопкой

TabIndex

порядок элемента при переходе по компонентам формы клавишей TAB

TabStop

если true, компонент не получает фокуса клавишей Tab

UseMnemonic

использовать "горячую клавишу" для доступа к компоненту (перед нужным символом в Text ставится &)

События: Click, Enter (получает фокус)

Методы: Show()/Hide(), Focus() или Select()

Метка Label - не получает фокуса, обычно ставят TabIndex другой компоненты, к которой метка даёт пояснение

Поле ввода TextBox - может быть и однострочным, и многострочным

Полезные свойства:



AcceptsReturn

если true, Enter создает новую строку ввода (иначе Ctrl+Enter)

AcceptsTab

если true, разрешены табуляции в данных (тогда Ctrl+Tab - переход к след. компоненту) Свойство формы AcceptsButton задает кнопку по умолчанию для формы

HideSelection

если false, выделение в поле не скрывается при потере фокуса

Lines

содержимое поля как многострочный текст

Multiline

если true, поле многострочное

PasswordChar

при Multiline == false заменяет ввод указанным символом

ReadOnly

если true, поле только для чтения

ScrollBars

полосы прокрутки

ShortcutsEnabled

если false, не работают горячие клавишу Windows (например, Ctrl+V)

Text

содержимое поля как одна строка

WordWrap

автоперенос

События:

напишем обработчик KeyDown

if (e->KeyCode == Keys::Enter) {

MessageBox::Show(textBox1->Text,"KeyDown",MessageBoxButtons::OK);

}

//но не Form1->textBox1->Text и не просто Text (тогда получим заголовок окна формы)



Методы:

AppendText

добавить текст к текущему

Clear

очистить

Copy, Cut, Paste

работа с буфером обмена

Select, SelectAll, DeselectAll

работа с выделением

Show, Hide

показать и спрятать компонент

Focus

установить фокус на компонент

Undo

отменить последнее действие

textBox1->Clear(); // Очистка текстового поля

textBox1->AppendText("*");

textBox1->TabIndex = 0;

// Первый по порядку элемент, в результате будет установка фокуса в нем


Пр. Корректное получение числа из поля ввода

Способ 1. Методы класса System::Convert::To<тип>

int n;


try {

n = System::Convert::ToInt32(textBox1->Text);

}

catch (...) {



MessageBox::Show("Не удалось получить целое число","Ошибка",MessageBoxButtons::OK);

}
Способ 2. Метод TryParse

float a;

bool A = Single::TryParse(textBox1->Text, System::Globalization::NumberStyles::Number,

System::Globalization::NumberFormatInfo::CurrentInfo, a);

if (A==false) { MessageBox::Show("Нет"); }


Способ 3. Проверка на допустимые символы и их последовательность

В примере ниже показана обработка события KeyPress однострочного поля ввода textBox1, позволяющая вводить с клавиатуры только вещественные или целые числа, возможно, со знаком "минус" в первой позиции числа.

На практике нужно обратить внимание, что для ввода чисел есть специально предназначенная для этой цели стандартная компонента NumericUpDown

//Описать глобально после в Form1.h после директивы #pragma endregion

String^ TorZ; // Точка или запятая


//Обработчик события Load формы Form1

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {

label1->Text = "Можно вводить только цифры!";

// Выясняем что установлено в настройках в качестве разделителя - точка или запятая

TorZ = Globalization::NumberFormatInfo::CurrentInfo->NumberDecimalSeparator;

}
//Обработчик события KeyPress поля ввода textBox1

private: System::Void textBox1_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {

bool TZFound = false; // Разделительный знак найден?

String ^ FirstChar; //знаки + и - разрешены первым символом

FirstChar = "";

if (textBox1->Text->Length>0) FirstChar = textBox1->Text->Substring(0,1);

bool badPosition = (FirstChar == L"-" && textBox1->SelectionStart==0);

if (Char::IsDigit(e->KeyChar) == true) {

if (badPosition) e->Handled = true;

return; //Найдена цифра

}

if (e->KeyChar == (char)Keys::Back) return; //Найден BackSpace



if (e->KeyChar == L'-') {

if (FirstChar == L"-") textBox1->Text = textBox1->Text->Substring(1);

if (textBox1->SelectionStart==0) return;

}

if (textBox1->Text->IndexOf(TorZ) != -1) TZFound = true; //Найден разделитель целой и дробной частей



if (TZFound == true) { e->Handled = true; return; } //Уже есть, второй не добавляем

if (e->KeyChar.ToString() == TorZ && !badPosition) return; //А первый - можно

e->Handled = true; //Не разрешать дальнейшую обработку

}
}; } ///////////////// конец файла Form1.h


MenuStrip главное меню

Свойства:

Items

элементы меню

Checked

была ли выбрана команда (true)

CheckOnClick

выбор команды при Checked == true

ContextMenuStrip контекстное меню (правая кнопка мыши)
Лабораторная работа № 1. Разработка однодокументного приложения Windows Forms
Задание 1. С помощью TextEdit, Button и Label реализовать простой калькулятор:

Ввод числа - в поле TextEdit с проверкой корректности

Кнопки операций - * / + - C (очистить) = (вычислить)

Выбор операции показывается в Label

Контроль ошибок (деление на ноль)

label2 – первый операнд, label1 – знак операции,

textbox1 – ввод числа

button1,…,button4 – кнопки с действиями * / + -

button5 – Вычислить, button6 - Очистить





#pragma endregion

Single d1,d2,res; int op;

private: bool is_number() { Single d;

bool Is_Num = Single::TryParse (textBox1->Text,

System::Globalization::NumberStyles::Number,

System::Globalization::NumberFormatInfo::CurrentInfo,d);

textBox1->Focus();

if (Is_Num == true) {

if (op==0) d1=d; else d2=d;

return true;

}

return false;



}

private: void copy_number (int op) {

this->op = op;

label2->Text = textBox1->Text;

if (op==1) label1->Text = "*";

else if (op==2) label1->Text = "/";

else if (op==3) label1->Text = "+";

else label1->Text = "-";

textBox1->Clear();

}

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {



op=0;

}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {



if (is_number()) copy_number(1);

}

//Еще 3 таких же метода для кнопок / + - с параметром = 2, 3, 4 соответственно

private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {

if (op!=0 && is_number()) {

switch (op) {

case 1: try { res=d1*d2; } catch (...) {

MessageBox::Show("Переполение"); return;

}

break;



case 2:

try { res=d1/d2; } catch (...) {

MessageBox::Show("Деление на ноль"); return;

}

break;



case 3: res=d1+d2; break;

case 4: res=d1-d2; break;

}

label2->Text += label1->Text + " " + textBox1->Text + "=";



label1->Text = ""; op=0;

textBox1->Text = ""+res;

}

}

private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) {



textBox1->Clear(); label1->Text=""; label2->Text="";

op=0;


}
Добавить к проекту:

главное и контекстное меню (например, пункты Вычислить, Очистить, Копировать, Вставить);

управление формой, например, фиксация ее размера;

вычисление "по цепочке", то есть, результат предыдущего расчёта из textbox1 может служить первым операндом следующего вычисления (если после = нажата кнопка *, /, + или -)


В качестве защиты работы добавить к калькулятору дополнительные функции, например, конвертирование градусов в радианы, вычисление процентов, вычисление тригонометрических функций.
Задача 2. Составить таблицу пересчета одних величин в другие (на выбор) в указанных пользователем пределах с указанным шагом. Дизайн формы может быть следующим:

Вверху окна - Panel (свойство Dock = Top), на ней пояснения (метки Label), для ввода чисел два NumericUpDown и кнопка, остальная площадь окна - многострочный textBox1(MultiLine=true, Dock=Fill, Font = Courier New).



Пример. По нажатию кнопки выводим таблицу в textBox1 (в примере шаг равен 1, пределы изменения - целочисленные)


textBox1->Clear();

String ^S = gcnew String (' ',100);

for (int i=(int)numericUpDown1->Value;

i<=(int)numericUpDown2->Value; i++) {

S = String::Format ("{0,-10} {1,10}",

i.ToString(),Math::Round(i*Math::PI,3).ToString());

textBox1->AppendText(S + Environment::NewLine);

}

delete S;





База данных защищена авторским правом ©infoeto.ru 2016
обратиться к администрации
Как написать курсовую работу | Как написать хороший реферат
    Главная страница