Как Правильно Перерисовывать Окна
Здраствуйте — простите за тупые вопросы —
но я не знаю где на них найти ответ — в книгах
такие мелочи не рассматриваются — а MFC и API —
я знаю плохо .
так вот — я перерисовываю окно
tagRECT rec;
GetWindowRect(win,&rec);
rec.right -= rec.left;
rec.bottom -= rec.top;
rec.top = 0;
rec.left = 0;
— но почему окно нерерисовывается полностью ?
5 ответов
15 июня 2005 года
498 / / 18.02.2005
Для преобразования координат есть функции ScreenToClient() и ClientToScreen(). Попробуйте воспользоваться первой из них вместо своего преобразования.
А ещё проше сделать так.
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
С MFC ешё проще:
Invalidate();
UpdateWindow();
15 июня 2005 года
28 / / 03.04.2005
А ещё проше сделать так.
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);С MFC ешё проще:[Invalidate();
UpdateWindow();
— не это протягивыет — UpdateWindow(); —
не дает эффекта на перерисовку а —
Invalidate() и InvalidateRect() — помещают
сообщения в очеередь и конечно не чего не перирисовывают — пока данное окно не получит
фокус ввода —
функция ClientToScreen() — преобразует так же как
и GetWindowRect(win,&rec); — эффект одинаковый —
— остается не пересованной FrameRect — окна — и
системное меню — и то место от куда получается
GetWindowText .
15 июня 2005 года
465 / / 01.04.2005
RedrawWindow(win,&rec,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
Нужен еще RDW_FRAME
16 июня 2005 года
498 / / 18.02.2005
Originally posted by mixell
UpdateWindow(); —
не дает эффекта на перерисовку а —
Invalidate() и InvalidateRect() — помещают
сообщения в очеередь и конечно не чего не перирисовывают — пока данное окно не получит
фокус ввода
Это не совсем так. На самом деле всё работает так.
Invalidate() помечает всю область окна нуждающейся в обновлении и ставит сообщение WM_PAINT в очередь.
WM_PAINT имеет низкий приоритет и пропускает впереди себя другие сообщения. Это делается для того, чтобы вы могли дать Invalidate() 50 раз подряд, но перерисовка была бы только одна.
UpdateWindow() ищет WM_PAINT в очереди сообщений и (если оно там есть) вызывает его обработчик непосредственным обращением к оконной функции (call-ом, так сказать). Таким образом, перерисовка происходит раньше, чем станут обрабатываться прочие сообщения.
Поэтому фокус ввода тут совершенно ни при чём. Советую почитать Петцольда. Я считаю эту книгу обязательной к прочтению для всех, кто имеет дело с разработкой для Windows.
Originally posted by mixell
. функция ClientToScreen() — преобразует так же как и GetWindowRect(win,&rec).
GetWindowRect() ничего не преобразует. Преобразует ваш код rec.right -= rec.left. . Возможно, он делает это и правильно, но только для подобных преобразований уже написаны функции ScreenToClient() и ClientToScreen(). Можно, конечно, и вместо strcpy() писать каждый раз свой цикл, но только так почему-то никто не делает.
Control. Invalidate Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Делает недействительной конкретную область элемента управления и вызывает отправку сообщения рисования элементу управления.
Перегрузки
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.
Делает недействительной конкретную область элемента управления и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
Делает недействительной всю поверхность элемента управления и вызывает его перерисовку.
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.
Invalidate(Region, Boolean)
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
public: void Invalidate(System::Drawing::Region ^ region, bool invalidateChildren);
public void Invalidate (System.Drawing.Region region, bool invalidateChildren);
public void Invalidate (System.Drawing.Region? region, bool invalidateChildren);
member this.Invalidate : System.Drawing.Region * bool -> unit
Public Sub Invalidate (region As Region, invalidateChildren As Boolean)
Параметры
Объект Region, который делается недействительным.
invalidateChildren Boolean
Значение true , чтобы сделать недействительными дочерние элементы управления; в противном случае — значение false .
Комментарии
Invalidate Вызов метода не приводит к принудительному синхронному рисованию. Чтобы принудительно создать синхронную краску, вызовите Update метод после вызова Invalidate метода . При вызове этого метода без параметров в регион обновления добавляется вся клиентская область.
См. также раздел
Применяется к
Invalidate(Rectangle, Boolean)
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
public: void Invalidate(System::Drawing::Rectangle rc, bool invalidateChildren);
public void Invalidate (System.Drawing.Rectangle rc, bool invalidateChildren);
member this.Invalidate : System.Drawing.Rectangle * bool -> unit
Public Sub Invalidate (rc As Rectangle, invalidateChildren As Boolean)
Параметры
Объект Rectangle, представляющий область, которую следует сделать недействительной.
invalidateChildren Boolean
Значение true , чтобы сделать недействительными дочерние элементы управления; в противном случае — значение false .
Комментарии
Invalidate Вызов метода не приводит к принудительному синхронному рисованию. Чтобы принудительно создать синхронную краску, вызовите Update метод после вызова Invalidate метода . При вызове этого метода без параметров в регион обновления добавляется вся клиентская область.
См. также раздел
Применяется к
Invalidate(Region)
Делает недействительной указанную область элемента управления (добавляет ее к области обновления элемента, которая будет перерисована при следующей операции рисования) и вызывает отправку сообщения рисования элементу управления.
public: void Invalidate(System::Drawing::Region ^ region);
public void Invalidate (System.Drawing.Region region);
public void Invalidate (System.Drawing.Region? region);
member this.Invalidate : System.Drawing.Region -> unit
Public Sub Invalidate (region As Region)
Параметры
Объект Region, который делается недействительным.
Комментарии
Invalidate Вызов метода не приводит к принудительному синхронному рисованию. Чтобы принудительно создать синхронную краску, вызовите Update метод после вызова Invalidate метода . При вызове этого метода без параметров в регион обновления добавляется вся клиентская область.
См. также раздел
Применяется к
Invalidate(Boolean)
Делает недействительной конкретную область элемента управления и вызывает отправку сообщения рисования элементу управления. При необходимости объявляет недействительными назначенные элементу управления дочерние элементы.
public: void Invalidate(bool invalidateChildren);
public void Invalidate (bool invalidateChildren);
member this.Invalidate : bool -> unit
Public Sub Invalidate (invalidateChildren As Boolean)
Параметры
invalidateChildren Boolean
Значение true , чтобы сделать недействительными дочерние элементы управления; в противном случае — значение false .
Комментарии
Invalidate Вызов метода не приводит к принудительному синхронному рисованию. Чтобы принудительно создать синхронную краску, вызовите Update метод после вызова Invalidate метода . При вызове этого метода без параметров в регион обновления добавляется вся клиентская область.
См. также раздел
Применяется к
Invalidate()
Делает недействительной всю поверхность элемента управления и вызывает его перерисовку.
public: void Invalidate();
public void Invalidate ();
member this.Invalidate : unit -> unit
Public Sub Invalidate ()
Примеры
В следующем примере кода пользователь может перетащить изображение или файл изображения в форму и отобразить его в точке удаления. Метод OnPaint переопределяется для перерисовки изображения при каждом закрашивание формы; в противном случае изображение будет сохраняться только до следующей перерисовки. Метод DragEnter обработки событий определяет тип данных, перетаскиваемых в форму, и предоставляет соответствующую обратную связь. Метод DragDrop обработки событий отображает изображение в форме, если Image можно создать на основе данных. DragEventArgs.X Поскольку значения и DragEventArgs.Y являются экранными координатами, в примере используется PointToClient метод для их преобразования в клиентские координаты.
private: Image^ picture; Point pictureLocation; public: Form1() < // Enable drag-and-drop operations and // add handlers for DragEnter and DragDrop. this->AllowDrop = true; this->DragDrop += gcnew DragEventHandler( this, &Form1::Form1_DragDrop ); this->DragEnter += gcnew DragEventHandler( this, &Form1::Form1_DragEnter ); > protected: virtual void OnPaint( PaintEventArgs^ e ) override < // If there is an image and it has a location, // paint it when the Form is repainted. Form::OnPaint( e ); if ( this->picture != nullptr && this->pictureLocation != Point::Empty ) < e->Graphics->DrawImage( this->picture, this->pictureLocation ); > > private: void Form1_DragDrop( Object^ /*sender*/, DragEventArgs^ e ) < // Handle FileDrop data. if ( e->Data->GetDataPresent( DataFormats::FileDrop ) ) < // Assign the file names to a String* array, in // case the user has selected multiple files. array^files = (array^)e->Data->GetData( DataFormats::FileDrop ); try < // Assign the first image to the picture variable. this->picture = Image::FromFile( files[ 0 ] ); // Set the picture location equal to the drop point. this->pictureLocation = this->PointToClient( Point(e->X,e->Y) ); > catch ( Exception^ ex ) < MessageBox::Show( ex->Message ); return; > > // Handle Bitmap data. if ( e->Data->GetDataPresent( DataFormats::Bitmap ) ) < try < // Create an Image and assign it to the picture variable. this->picture = dynamic_cast(e->Data->GetData( DataFormats::Bitmap )); // Set the picture location equal to the drop point. this->pictureLocation = this->PointToClient( Point(e->X,e->Y) ); > catch ( Exception^ ex ) < MessageBox::Show( ex->Message ); return; > > // Force the form to be redrawn with the image. this->Invalidate(); > void Form1_DragEnter( Object^ /*sender*/, DragEventArgs^ e ) < // If the data is a file or a bitmap, display the copy cursor. if ( e->Data->GetDataPresent( DataFormats::Bitmap ) || e->Data->GetDataPresent( DataFormats::FileDrop ) ) < e->Effect = DragDropEffects::Copy; > else < e->Effect = DragDropEffects::None; > >
private Image picture; private Point pictureLocation; public Form1() < // Enable drag-and-drop operations and // add handlers for DragEnter and DragDrop. this.AllowDrop = true; this.DragDrop += new DragEventHandler(this.Form1_DragDrop); this.DragEnter += new DragEventHandler(this.Form1_DragEnter); >protected override void OnPaint(PaintEventArgs e) < // If there is an image and it has a location, // paint it when the Form is repainted. base.OnPaint(e); if(this.picture != null && this.pictureLocation != Point.Empty) < e.Graphics.DrawImage(this.picture, this.pictureLocation); >> private void Form1_DragDrop(object sender, DragEventArgs e) < // Handle FileDrop data. if(e.Data.GetDataPresent(DataFormats.FileDrop) ) < // Assign the file names to a string array, in // case the user has selected multiple files. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); try < // Assign the first image to the picture variable. this.picture = Image.FromFile(files[0]); // Set the picture location equal to the drop point. this.pictureLocation = this.PointToClient(new Point(e.X, e.Y) ); >catch(Exception ex) < MessageBox.Show(ex.Message); return; >> // Handle Bitmap data. if(e.Data.GetDataPresent(DataFormats.Bitmap) ) < try < // Create an Image and assign it to the picture variable. this.picture = (Image)e.Data.GetData(DataFormats.Bitmap); // Set the picture location equal to the drop point. this.pictureLocation = this.PointToClient(new Point(e.X, e.Y) ); >catch(Exception ex) < MessageBox.Show(ex.Message); return; >> // Force the form to be redrawn with the image. this.Invalidate(); > private void Form1_DragEnter(object sender, DragEventArgs e) < // If the data is a file or a bitmap, display the copy cursor. if (e.Data.GetDataPresent(DataFormats.Bitmap) || e.Data.GetDataPresent(DataFormats.FileDrop) ) < e.Effect = DragDropEffects.Copy; >else < e.Effect = DragDropEffects.None; >>
Private picture As Image Private pictureLocation As Point Public Sub New() ' Enable drag-and-drop operations. Me.AllowDrop = True End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) MyBase.OnPaint(e) ' If there is an image and it has a location, ' paint it when the Form is repainted. If (Me.picture IsNot Nothing) And _ Not (Me.pictureLocation.Equals(Point.Empty)) Then e.Graphics.DrawImage(Me.picture, Me.pictureLocation) End If End Sub Private Sub Form1_DragDrop(ByVal sender As Object, _ ByVal e As DragEventArgs) Handles MyBase.DragDrop ' Handle FileDrop data. If e.Data.GetDataPresent(DataFormats.FileDrop) Then ' Assign the file names to a string array, in ' case the user has selected multiple files. Dim files As String() = CType(e.Data.GetData(DataFormats.FileDrop), String()) Try ' Assign the first image to the 'picture' variable. Me.picture = Image.FromFile(files(0)) ' Set the picture location equal to the drop point. Me.pictureLocation = Me.PointToClient(New Point(e.X, e.Y)) Catch ex As Exception MessageBox.Show(ex.Message) Return End Try End If ' Handle Bitmap data. If e.Data.GetDataPresent(DataFormats.Bitmap) Then Try ' Create an Image and assign it to the picture variable. Me.picture = CType(e.Data.GetData(DataFormats.Bitmap), Image) ' Set the picture location equal to the drop point. Me.pictureLocation = Me.PointToClient(New Point(e.X, e.Y)) Catch ex As Exception MessageBox.Show(ex.Message) Return End Try End If ' Force the form to be redrawn with the image. Me.Invalidate() End Sub Private Sub Form1_DragEnter(ByVal sender As Object, _ ByVal e As DragEventArgs) Handles MyBase.DragEnter ' If the data is a file or a bitmap, display the copy cursor. If e.Data.GetDataPresent(DataFormats.Bitmap) _ Or e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy Else e.Effect = DragDropEffects.None End If End Sub
Комментарии
Invalidate Вызов метода не приводит к принудительному синхронному рисованию. Чтобы принудительно создать синхронную краску, вызовите Update метод после вызова Invalidate метода . При вызове этого метода без параметров в регион обновления добавляется вся клиентская область.
Вы отправили слишком много запросов, поэтому ваш компьютер был заблокирован.
Для того, чтобы предотвратить автоматическое считывание информации с нашего сервиса, на Linguee допустимо лишь ограниченное количество запросов на каждого пользователя.
Пользователям, браузер которых поддерживает Javascript, доступно большее количество запросов, в отличие от пользователей, чей браузер не поддерживает Javascript. Попробуйте активировать Javascript в настройках вашего браузера, подождать несколько часов и снова воспользоваться нашим сервером.
Если же ваш компьютер является частью сети компьютеров, в которой большое количество пользователей одновременно пользуется Linguee,сообщитеоб этом нам.
Invalidate();
— Скомпилировать приложение и запустить его на выполнение.
— Проверить алгоритм работы приложения-контейнера ActiveX: работу диалогового окна с кнопкой и текстовым полем с выводом строки.
— Вставить в контейнер диаграмму Excel.
Для этого запустить приложение Cont.
Выбрать команду Edit->Insert New Object. Появится диалоговое окно для внедрения или связывания объектов.
Выбрать новый объект Диаграмма Microsoft Excel и нажать OK. Диаграмма будет вставлена в контейнер.
Для отмены редактирования на месте нажать Esc. Диаграмма уменьшится и сдвинется влево. Все объекты помещаются в прямоугольник 200×200 пикселей.
labServ «Создание приложения-сервера»
Цель работы — создание приложения в виде сервера ActiveX. В качестве задачи возьмем приложение labCont, посвященное созданию диалогового окна с кнопкой и текстовым полем.
Для создания приложения–сервера ActiveX необходимо выполнить следующие этапы.
Создание проекта
Создать новый проект: задать имя проекта labServ, на 1-ом этапе выбрать MDI-приложение, на 2-ом этапе выбрать Full server, остальные – без изменений по умолчанию, щелкнув на Finish.
Сравнить меню приложения labServ с приложением lab3_2:
— Вызвать окно View->Resource View и открыть папку labServ.rc, затем — Menu. Появились два новых меню. Первое меню IDR_labServTYPE_SRVR_IP (SRVR – это согласные от слова server, IP – (in place) редактирование на месте). Это означает, что объект, содержащийся в контейнере, может быть отредактирован на месте. Для редактирования объединяются меню контейнера (например, из п.12.2 IDR_labContTYPE_CNTR_IP) и первое меню сервера. Второе меню IDR_labServTYPE_ SRVR_EMB (EMB – (embedded) встроенный) используется для редактирования в отдельном окне сервера.
— Щелкнуть дважды на втором меню. Появляется окно с командами нового меню. Это окно будет выводиться во время редактирования объекта в отдельном окне, т.е. в окне сервера. Открыть меню File. Появились новые 2 команды : Update вместо Save – модификация объекта; Save Copy As вместо Save As – копирование изменений объекта в файл, а не сохранение всего документа. Объект считается не самостоятельным документом, а объектом, внедренным в другой документ.
Включение новой команды Dialog в меню
— Открыть редактор меню, щелкнув на команде View->Resource View и открыв папку labServ.rc, затем – Menu. Дважды щелкнуть на строке IDR_labServTYPE. Выводятся команды нового меню.
— Добавить новую команду Dialog. Новая команда должна быть между командами View и Windows. Щелкнуть на пустой команде Type Here, ввести строку Dialog и нажать Enter. Перетащить с помощью мыши команду меню Dialog в позицию после View. Открыть окно Properties для новой команды меню Dialog, щелкнув сначала правой кнопкой на пункте Dialog, а затем — на Properties. Проверить наличие в свойстве Caption значения Dialog. Установить свойству Popup значение false и проверить идентификатор ID_Dialog.
— Подключить команду Dialog к приложению. Для этого открыть редактор меню, щелкнув на вкладке Resource View и открыв папку labServ.rc, затем – Menu. Дважды щелкнуть на строке IDR_labServTYPE. Выводятся команды меню. Щелкнуть правой кнопкой на команде Dialog и в открывшемся контекстном меню выбрать команду Add Event Handler (добавить обработчик события). Откроется окно Event Handler Wizard – labServ. Выбрать в списке Message Type сообщение Command, а в списке Class list – ClabServView. В поле Function handler name появится имя функции-обработчика OnDialog(). Щелкнуть на кнопке Add and Edit, и в окне редактора кода откроется шаблон созданной функции.
Создание ресурса диалогового окна
— Создать шаблон диалогового окна. Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type (или выбрать Dialog и щелкнуть на New). Появляется шаблон диалогового окна с именем IDD_DIALOG1 и панели инструментов Dialog Editor и Toolbox. В окне имеются 2 кнопки: OK и Сancel.
— Установить язык Русский. Для этого в окне Resource View открыть папку Dialog и щелкнуть на идентификаторе IDD_DIALOG1. В появившемся окне свойств Properties щелкнуть на свойстве Language и в списке справа выбрать значение Русский.
— Добавить в диалоговое окно элементы управления: текстовое поле и кнопку. Щелкнуть сначала на инструменте Edit Control (текстовое поле) панели инструментов Toolbox, а затем — в выбранной области диалогового окна. Появляется текстовое поле с надписью Sample edit box. Изменить размеры текстового поля, щелкнув в текстовом поле и пользуясь появившимися маркерами размеров (рамка с квадратами). Аналогично добавить кнопку, щелкнув на инструменте Button (кнопка), а затем в области диалогового окна. Появляется кнопка с надписью Button1.
— Изменить надписи элементов управления. Требуется изменить надпись кнопки Button1 на Output. Для изменения свойств диалогового окна открыть окно Properties (свойства), щелкнув правой кнопкой в свободной области окна, затем – на Properties. Щелкнуть на кнопке и ввести в качестве свойства Caption текст Output. Новая надпись вводится в кнопку.
— Проверить в свойстве ID идентификатор IDC_BUTTON1, присвоенный кнопке редактором диалоговых окон. Аналогично проверить идентификатор IDC_EDIT1, присвоенный текстовому полю.
Создание класса диалогового окна
— Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папку labCont.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_DIALOG1.
— Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.
— Ввести в поле Class name имя нового класса CDlg, в списке Base class выбрать имя базового класса диалоговых окон CDialog, проверить наличие в поле Dialog ID идентификатора IDD _ DIALOG1, и затем щелкнуть на кнопке Finish.
Связывание элементов управления диалогового окна с
функциями-обработчиками сообщений
Требуется связать сообщение кнопки Output с функцией – обработчиком.
— Открыть окно Class View и щелкнуть правой кнопкой на имени класса CDlg. Появится окно свойств Properties.
— Щелкнуть на кнопке Event (с изображением желтой молнии) и в появившемся списке идентификаторов раскрыть узел IDC_ BUTTON1 (щелкнуть на символе +). Появляется список сообщений
— Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде OnBnClickedButton1. Прототип новой функции-обработчика OnBnClickedButton1() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedButton1() будет вызываться при нажатии кнопки Output.
Связывание переменных класса с элементами окна
— Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CDlg. Затем выполнить команду Project->Add Variable. Ибо щелкнуть правой кнопкой на имени класса Dlg и выполнить команду Add Add->Variable.
— В появившемся окне Add Member Variable Wizard-labServ выполнить следующее: установить флажок Control variable; в списке Control ID выбрать идентификатор текстового поля IDC_EDIT1; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_text; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Появляется содержимое файла Dlg.cpp с функциями класса CDlg.
— Задать содержимое текстового поля в функции-обработчике OnBnClickedButton1():
void CDlg :: OnBnClickedButton1 ()
m_text = “Диалоговое окно”;
— Обновить текстовое поле. Для чтения или записи содержимого элемента используется вызов функции UpdateData ():
void CDlg :: OnBnClickedButton1 ()
m_text = “Диалоговое окно”;
UpdateData (false);
Вызов функции UpdateData(false) с параметром false заносит в текстовое поле значение переменной m_text, вызов с параметром true присваивает переменной m_text содержимое текстового поля. Итак, строка перенесена в текстовое поле.
Переопределение функции для кнопки ОК
— Связать сообщение кнопки ОК с функцией-обработчиком.
Для этого открыть окно Class View и щелкнуть на имени класса CDlg. В окне свойств Properties щелкнуть на кнопке Event (События) и в появившемся списке идентификаторов раскрыть узел IDOK (щелкнуть на символе +). Появляется список сообщений. Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде OnBnClickedOk. Прототип новой функции-обработчика OnBnClickedOk() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedOk() будет вызываться при нажатии кнопки OK. На экране появится текст функции-обработчика OnBnClickedOk ().
— Занести в переменную m_text содержимое текстового поля. Для этого вызывается функция UpdateData (true):
void CDlg :: OnBnClickedOk ()
UpdateData (true);
Отображение диалогового окна
— Сообщить классу вида о существовании класса диалогового окна. Для этого включить в него файл заголовков класса CDlg — Dlg.h:
# include “Dlg.h”
— Создать объект класса Dlg в классе вида:
void ClabServView :: OnDialog ()
— Отобразить диалоговое окно на экране. Для этого вызвать функцию DoModal():
void ClabServView :: OnDialog ()
int result = dlg. DoModal(); //вызов диалогового окна и возврат
— Проверить нажатие кнопки ОК:
void ClabServView :: OnDialog ()
int result = dlg. DoModal();
if (result = = IDOK)
Получить указатель на документ:
void ClabServView :: OnDialog ()
if (result == IDOK)
ClabServDoc* pDoc = GetDocument();
ASSERT_VALID (pDoc);
— Создать в документе объект класса c именем StringData:
class ClabServDoc :: public COleServerDoc
CString StringData;
— Поместить текст из переменной m_text в объект StringData:
void ClabServView :: OnDialog ()
if (result == IDOK)
pDoc -> StringData = dlg. m_text;
— Предусмотреть вызов Invalidate(). Вывод данных – в функции OnDraw (). Но сначала надо предусмотреть стирание прежней строки перед перерисовкой новой. Для этого – вызов функции класса вида Invalidate(). Эта функция и вызывает OnDraw ().
void ClabServView :: OnDialog ()
pDoc -> StringData = dlg. m_text;