Главная страница
Навигация по странице:

  • All Windows Forms

  • Борис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П


    Скачать 17.38 Mb.
    НазваниеБорис Пахомов Санкт Петербург бхв петербург 2013 удк 004. 4 Ббк 32. 973. 26018. 2 П
    АнкорMS Visual C.pdf
    Дата04.08.2018
    Размер17.38 Mb.
    Формат файлаpdf
    Имя файлаMS Visual C.pdf
    ТипДокументы
    #22453
    страница27 из 37
    1   ...   23   24   25   26   27   28   29   30   ...   37

    1
    .6
    6
    . Примеры работы переключателей Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    341 Примеры работы переключателей показаны на рис. 11.66, текст обработчиков событий в листингах 11.12 и 11.13. Листинг 11.12

    private: System::Void checkBox1_CheckStateChanged(System::Object^ sender,
    System::EventArgs^ e)
    { if(this->checkBox1->CheckState == CheckState::Checked) this->panel1->BackColor=Color::Aqua ; if(this->checkBox1->CheckState == CheckState::Unchecked) this->panel1->BackColor=Color::Blue;
    } private: System::Void checkBox2_CheckStateChanged(System::Object^ sender,
    System::EventArgs^ e)
    { if(this->checkBox2->CheckState == CheckState::Checked) this->panel2->BackColor=Color::Aquamarine ; if(this->checkBox2->CheckState == CheckState::Unchecked) this->panel2->BackColor=Color::Azure;
    } private: System::Void radioButton1_CheckedChanged(System::Object^ sender,
    System::EventArgs^ e)
    { this->pictureBox2->Visible=false; this->pictureBox1->Visible=true;
    } private: System::Void radioButton2_CheckedChanged(System::Object^ sender,
    System::EventArgs^ e)
    { this->pictureBox2->Visible=true; this->pictureBox1->Visible=false;
    } Листинг 11.13

    private: System::Void checkBox1_CheckedChanged(System::Object^ sender,
    System::EventArgs^ e)
    { if(this->checkBox1->CheckState == CheckState::Checked) this->panel1->BackColor=Color::Red ; else this->panel1->BackColor=Color::Blue;
    } private: System::Void radioButton1_CheckedChanged(System::Object^ sender,
    System::EventArgs^ e)

    342 Часть II. Приложения Windows Form
    { this->pictureBox2->Visible=false; this->pictureBox1->Visible=true;
    } private: System::Void checkBox2_CheckStateChanged_1(System::Object^ sender,
    System::EventArgs^ e)
    { if(this->checkBox2->CheckState == CheckState::Checked) this->panel2->BackColor=Color::Aquamarine ; else this->panel2->BackColor=Color::Beige;
    } private: System::Void radioButton2_CheckedChanged_1(System::Object^ sender,
    System::EventArgs^ e)
    { this->pictureBox2->Visible=true; this->pictureBox1->Visible=false;
    } Компонент Довольно часто вместо отдельных переключателей используют их групповой контейнер компонент
    GroupBox
    , который расположен в группе All Windows Forms палитры компонентов. Рис 11.67. Свойства
    GroupBox
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    343 Вообще компоненты используют, чтобы обеспечить разделение компонентов на различные группы, которые становятся для них родителями, стем, чтобы компоненты унаследовали некоторые свойства своих родителей. Обычно так делают, чтобы подразделить форму на несколько функций. Да и дизайн осуществлять удобнее перемещая только
    GroupBox
    , мы одновременно перемещаем все компоненты, которые в нем находятся. Перечень свойств компонента, отображенный в его окне Properties, показан на рис. 11.67 (никаких новых свойств по сравнению с ранее встречавшимися, мы тут не находим. Применение компонента вместе с флажками было показано на рис. 11.66, в котором в этот контейнер помещались компоненты
    RadioButton и Компонент Компонент расположен в группе All Windows Forms палитры компонентов, он позволяет добавлять к приложениям ссылки на страницы, задавать адреса папок, файлов (на первом уровне, которые будут находиться и открываться. Наряду с этим главным качеством компонента, его можно использовать аналогично компоненту Как же работать с этим компонентом Самое простое — щелкнуть на нем дважды, в результате чего откроется заготовка обработчика. Параметром этого обработчика является ссылка на класс
    LinkLabelLinkClickedEventArgs
    , который содержит данные, необходимые для обработки строки типа
    String
    , содержащей гиперссылку — обычный адрес, по которому надо добраться до необходимых данных (страницы, обычной папки вашего компьютера или просто файла. Ссылка будет обработана, и на ваших глазах появится открытый документ (сайт, содержимое папки или содержимое файла. Носами по себе они не откроются — надо выполнить метод
    Start()
    из класса класса, обеспечивающего запуск различных процессов внутри приложения. Вид метода запуска выглядит так
    System::Diagnostics::Process::Start( str где str
    — это переменная типа
    String Итак, самый простой способ использования гиперссылки таков в обработчике события
    LinkClicked объявляем
    String адрес объекта";
    затем выполняем оператор
    System::Diagnostics::Process::Start(str Примеры адреса объекта

    C:\\a.txt — это файл, если этот путь задается в тексте программы как константа, а если, например, в поле компонента
    TextBox
    , то двойной
    BackSlash надо заменить на одинарный

    344 Часть II. Приложения Windows Фото — это папка

    www.mail.ru — это интернет-адрес. Форма приложения, иcпользующего
    LinkLabel
    , и результаты работы — на риса тексты обработчиков событий — в листинге 11.14. Рис 11.68. Демонстрация работы Листинг 11.14

    private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
    { this->Close();
    } private: System::Void linkLabel1_LinkClicked(System::Object^ sender,
    System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e)
    { this->linkLabel1->Links[ linkLabel1->Links->IndexOf( e->Link ) ]->
    Visited = true;
    String ^str =this->textBox1->Text;
    System::Diagnostics::Process::Start( str );
    // класс, обеспечивающий запуск процессов внутри приложения
    } private: System::Void Form1_Shown(System::Object^ sender, System::EventArgs^ e)
    { this->textBox1->Focus();
    }
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    345 Рассмотрим более подробно сам процесс создания гиперссылки. Во-первых, у нее есть наименование, которое помещается в свойство
    Text
    , и собственно сама ссылка, те. путь к объекту, на который идет ссылка. Куда помещается сама ссылка Она помещается в свойство
    Links
    , которое не отражается в окне Properties. Из самого названия свойства (связи, ссылки) следует, что ссылок можно задавать и больше, чем на один объект. Это свойство является указателем на элемент
    LinkCollection класса который содержит множество
    M{}
    ссылок, задающихся в
    LinkLabel
    , поэтому можно воспользоваться методами этого класса, в частности — методом
    Add()
    , который добавляет в
    M{}
    новую гипер- ссылку (это можно сделать только в тексте программы, т. к. свойство
    Links не высвечивается в окне Properties). Поскольку ссылок бывает одна и более, то первая ссылка обязательно помещается в свойство
    LinkArea
    (нажав на кнопку с многоточием в поле этого свойства, можно такую ссылку задать прямо в режиме дизайна проекта. Остальные ссылки можно задать в тексте программы, помещая их в свойство
    Links методом Add()
    . В любом случае, зададите ли вы одну-единственную ссылку или множество, все они в режиме исполнения приложения попадут во множество
    M{}, те. в свойство Следовательно, если вы задаете в тексте программы даже единственную ссылку, то можно поместить ее сразу в первый элемент из множества M{}, однако сведения о том, что это единственная ссылка, надо все же отразить в свойстве Каким образом Дело в том, что сама ссылка непосредственно связана со своим наименованием, тес текстом этого наименования, который хранится в свойстве
    Text
    . Это свойство содержит строку символов (точнее — слов. Слова следует пометить так, чтобы было понятно, что они отображают названия гиперссылок. Если слово отображает наименование гиперссылки, оно сразу оказывается непохожим на остальные части текста в строке свойства
    Text
    : такое слово становится подчеркнутым, цвет его шрифта изменяется в соответствии с цветом, установленным в свойстве цвет выбирается из всплывающей палитры цветов, если в поле свойства нажать кнопку со стрелкой. Например, свойство
    Text содержит текст "Это гиперссылка, а это просто текст. Если вы пометили часть текста "Это гиперссылка" таким образом, чтобы она относилась к наименованию гиперссылки, то когда в режиме исполнения приложения вы на такую помеченную часть текста наведете курсор мыши, его вид изменится он станет изображаться в виде кисти руки. Это означает, что в этом месте можно щелкнуть кнопкой мыши и программа отошлет нас к объекту, адрес которого находится в свойстве
    Links в соответствующем его элементе, имеющим тот же порядковый номер от начала множества, что и помеченная ссылкой часть текста в свойстве
    Text
    . Сколько частей в свойстве
    Text мы пометим в качестве названий гиперссылок, столько фактических адресов объектов, на которые будет идти ссылка из помеченных частей текста в свойстве
    Text
    , надо будет задать в свойстве
    Links
    . Ровно столько же, и ни больше ни меньше, иначе возникнет исключительная ситуация, которая, если ее не обработать, приведет к аварийному останову программы.

    346 Часть II. Приложения Windows Как же помечать части текстовой строки, чтобы они становились наименованиями гиперссылок? Пометки задаются в виде указания номера позиции (счет от нуля) символа, которым начинается наименование гиперссылки, и количества символов, относящихся к наименованию гиперссылки. В самом свойстве
    LinkArea
    (а можно в его подствойствах —
    Start и
    Length
    ) надо набрать соответственно номер начальной позиции (счет от нуля) и длину подстроки, набранной в редакторе
    LinkArea то, что набирается в редакторе
    LinkArea
    , автоматически попадает в свойство
    Text
    ), которая будет играть роль имени первой и, возможно, единственной, гиперссылки. Если вы набираете координаты имени гиперссылки в самом поле
    LinkArea
    , то начало и длину имени следует набирать через точку с запятой. Например, в поле редактора вы набрали текст "Это гиперссылка, а это просто текст. В свойстве
    LinkArea автоматически установятся значения (35;0). Получатся данные
    Start=35
    и
    Length=0
    . Это неправильно. И свидетельством тому явится исчезновение подсветки шрифта в наименовании, которое мы ввели. Вы должны за этим проследить и самостоятельно установить значения подсвойств
    Start и Если, например, зададите величины (0;23), то получите подсвеченный и подчеркнутый текст такой "Это гиперссылка, а это просто текст" (остальные символы заданного текста не станут отражать название гиперссылки). Если же зададите (0;15), то получите Это гиперссылка. Для выделения остальных частей строки текста из свойства
    Text вы должны задавать начало и длину в программе и помещать их (как и сами адреса объектов) в элементы свойства
    Links
    . Если, например, вы станете добавлять данные из объекта, то оператор добавки будет выглядеть так this->linkLabel1->Links->Add( (int)ArStart[i], (int)ArLen[i], Здесь аргументы
    (int)ArStart[i]
    ,
    (int)ArLen[i]
    означают е элементы массивов, где хранятся соответственно номера символов начальных позиций и длин текста из свойства
    Text
    , которые будут помечены в качестве наименования гиперссылки, добавляемой в качестве пути к объекту из й строки
    TextBox1
    . Начало и длина принудительно переводятся в тип int
    , как требует того формат метода
    Add()
    , потому что массивы
    ArStart[]
    ,
    ArLen[]
    — это числовые (
    Int32
    ) массивы. Когда у нас в проекте несколько гиперссылок, то требуется отмечать, что мы щелкали на какой-то конкретной гиперссылке (как говорят, "посетили" гиперссылку), иначе в работе может наступить полная путаница. В классе
    Links имеется на этот счет специальное свойство
    Visited
    , устанавливаемое в значения true
    (посетили ссылку) и false
    (не посещали ссылку. Кроме того, к ссылке можно разрешить или запретить доступ с помощью установки в значения true и false другого свойства класса
    Links
    — свойства В качестве примера приведем приложение, где задается строка в компоненте
    TextBox
    , из которой формируются два имени гиперссылок и адреса к объектам, за
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    347 данные в другом компоненте
    TextBox
    . Текст приложения приведен в листинге, а результат его работы — на рис. 11.69 и 11.70. Листинг 11.1
    5
    #pragma once namespace My2008LinkLabel { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System; using namespace System::Runtime::InteropServices;
    ///
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need
    /// to change the 'Resource File Name' property for the managed
    /// resource compiler tool associated with all .resx files this
    /// class depends on. Otherwise, the designers will not be able
    /// to interact properly with localized resources
    /// associated with this form.
    ///
    public ref class Form1 : public System::Windows::Forms::Form
    { public:
    Form1(void)
    {
    InitializeComponent();
    //
    //TODO: Add the constructor code here
    //
    } protected:
    ///
    /// Clean up any resources being used.
    ///

    Form1()
    { if (components)
    {

    348 Часть II. Приложения Windows Form
    delete components;
    }
    } protected: private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::LinkLabel^ linkLabel1; private: System::Windows::Forms::Button^ button2; private: System::Windows::Forms::TextBox^ textBox1; private: System::Windows::Forms::TextBox^ textBox2; private: System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Label^ label2; private:
    ///
    /// Required designer variable.
    //----------------- PasteTextString() ----------------------------------------- просматривает строку, удаляет из нее все "/", "*", одновременно запоминая координаты слов в новой строке в массивах ArStart[],ArLen[]*/ массивы будут и выходными void PasteTextString(String ^in, array ^out, array ^ArStart, array ^ArLen, array ^Ns)
    { in->ToCharArray(); это будет уже массивом символов
    String ^p; int Ar=0; индекс для ArStart и ArLen посимвольный просмотр строки
    String ^out1=""; int len=in->Length; for(int i=0,j=0; i < len; i++)
    { wchar_t s=in->ToCharArray()[i]; p= s.ToString(); if(p != "/" && p != "*")
    { out1+=p; j++; считает кол-во добавок
    } if (p == "/")
    запомнить позицию разделителя (начало) в новой строке out1:
    ArStart[Ar]=j; //i;
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    349
    if(p == "*")
    {
    запомнить позицию разделителя (длина
    ArLen[Ar]=i — ArStart[Ar] -1;
    Ar++;
    }
    }
    Ns[0]=Ar; out[0]=out1;
    }
    //-------------------------------------------------
    ///
    System::ComponentModel::Container ^components;
    #pragma region Windows Form Designer generated code
    ///
    /// Required method for Designer support — do not modify
    /// the contents of this method with the code editor.
    ///
    void InitializeComponent(void)
    { this->button1 = (gcnew System::Windows::Forms::Button()); this->linkLabel1 = (gcnew System::Windows::Forms::LinkLabel()); this->button2 = (gcnew System::Windows::Forms::Button()); this->textBox1 = (gcnew System::Windows::Forms::TextBox()); this->textBox2 = (gcnew System::Windows::Forms::TextBox()); this->label1 = (gcnew System::Windows::Forms::Label()); this->label2 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout();
    //
    // button1
    // this->button1->Location = System::Drawing::Point(19, 17); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(18, 75); this->button1->TabIndex = 4; this->button1->Text = Выход this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew System::EventHandler(this,
    &Form1::button1_Click);
    //
    // linkLabel1
    // this->linkLabel1->AutoSize = true; this->linkLabel1->LinkArea = System::Windows::Forms::LinkArea(0, 8); this->linkLabel1->Location = System::Drawing::Point(64, 17);

    350 Часть II. Приложения Windows Form
    this->linkLabel1->Name = L"linkLabel1"; this->linkLabel1->Size = System::Drawing::Size(55, 17); this->linkLabel1->TabIndex = 5; this->linkLabel1->TabStop = true; this->linkLabel1->Text = L"linkLabel1"; this->linkLabel1->UseCompatibleTextRendering = true; this->linkLabel1->LinkClicked += gcnew
    System::Windows::Forms::LinkLabelLinkClickedEventHandler(this,
    &Form1::linkLabel1_LinkClicked_1);
    //
    // button2
    // this->button2->Location = System::Drawing::Point(106, 47); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(114, 45); this->button2->TabIndex = 6; this->button2->Text = Сформировать множество ссылок this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew System::EventHandler(this,
    &Form1::button2_Click);
    //
    // textBox1
    // this->textBox1->Location = System::Drawing::Point(19, 113); this->textBox1->Multiline = true; this->textBox1->Name = L"textBox1"; this->textBox1->Size = System::Drawing::Size(186, 81); this->textBox1->TabIndex = 7;
    //
    // textBox2
    // this->textBox2->Location = System::Drawing::Point(227, 115); this->textBox2->Multiline = true; this->textBox2->Name = L"textBox2"; this->textBox2->Size = System::Drawing::Size(196, 79); this->textBox2->TabIndex = 8;
    //
    // label1
    // this->label1->AutoSize = true; this->label1->Location = System::Drawing::Point(42, 98); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(136, 13); this->label1->TabIndex = 9; this->label1->Text = Задание адресов ссылок
    //
    // label2
    //
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    351
    this->label2->AutoSize = true; this->label2->Location = System::Drawing::Point(212, 98); this->label2->Name = L"label2"; this->label2->Size = System::Drawing::Size(233, 13); this->label2->TabIndex = 10; this->label2->Text = Формирование свойства Text гиперссылки\r\n";
    //
    // Form1
    // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(454, 206); this->Controls->Add(this->label2); this->Controls->Add(this->label1); this->Controls->Add(this->textBox2); this->Controls->Add(this->textBox1); this->Controls->Add(this->button2); this->Controls->Add(this->linkLabel1); this->Controls->Add(this->button1); this->Name = L"Form1"; this->Text = L"Form1"; this->ResumeLayout(false); this->PerformLayout();
    }
    #pragma endregion
    //------------------- Обработчики событий -------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
    { this->Close();
    } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
    {
    /* Требуем, чтобы первая ссылка всегда посещалась (те. помечалась после щелчка на ее имени this->linkLabel1->Links[ 0 ]->Visited = true;
    формирование свойства Text с помощью TextBox:
    //кол-во строк в обоих ах должно быть одинаковым this->linkLabel1->Text="";
    //-------------------------------------------
    /* /Register* Folder Call /MSN* Эту строку будем помещать в свойство Text. Для выделения частей, которые попадут в качестве имени гиперссылки, применяем разделители
    "/" – для обозначения начала текста, а "*" – для обозначения конца текста
    */

    352 Часть II. Приложения Windows Рис 11.69. Создание нескольких гиперссылок. Часть Рис 11.70. Создание нескольких гиперссылок. Часть 2
    Глава
    11. Компоненты, создающие интерфейс между пользователем и
    приложением
    353
    // Формирование имен гиперссылок в свойстве Text и начала с длинной для
    // свойства Links:
    String ^in; array ^Ns = gcnew array (1); array ^out = gcnew array (1); int tbl=this->textBox2->Text->Length; in=this->textBox2->Text; array ^ArStart = gcnew array (tbl); array ^ArLen = gcnew array (tbl);
    PasteTextString(in, out, ArStart,ArLen,Ns); this->linkLabel1->Text=out[0];
    //--------- Формирование собственно гиперссылок в свойстве Links -------------- int NumLines=Ns[0]; количество элементов массива for(int i=0; i< NumLines; i++)
    { if(i==0) для первой гиперссылки
    { this->linkLabel1->Links[ i ]->LinkData = this->textBox1->Lines[i]; надо задать еще Start и Length для LinkArea: this->linkLabel1->LinkArea.Start=ArStart[0]; this->linkLabel1->LinkArea.Length=ArLen[0]; this->linkLabel1->Links[ 0 ]->Visited = true; this->linkLabel1->Links[ 0 ]->Enabled = true; continue;
    }
    координаты берутся из сформированных массивов ArStart[],ArLen[], асами ссылки — из TextBox1: */ this->linkLabel1->Links->Add( (int)ArStart[i], (int)ArLen[i], this-
    >textBox1->Lines[i]);
    }
    }
    //------------------ Обработчик щелчка на имени гиперссылки ------------------- private: System::Void linkLabel1_LinkClicked_1(System::Object^ sender,
    System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e)
    {
    //Гиперссылка, на которой был щелчок, помечается как посещенная this->linkLabel1->Links[ linkLabel1->Links->IndexOf( e->Link ) ]->Visited
    = true;
    // Display the appropriate link based on the value of the
    // LinkData property of the Link Object*. Подготовка данных для команды Start (извлекается адрес объекта
    String^ target = dynamic_cast(e->Link->LinkData);

    354 Часть II. Приложения Windows объект отыскивается и выводится на экран
    System::Diagnostics::Process::Start( target );
    } обработчик
    }; форма
    } программный модуль Компонент Компонент находится в списке
    1   ...   23   24   25   26   27   28   29   30   ...   37


    написать администратору сайта