Программирование под Win32


Программирование для Windows с помощью библиотеки объектов OWL - стр. 14


void TWindow::EvPaint(){ TPaintDC dc(*this);

TRect& rect=*(TRect*)&dc.Ps.rcPaint; Paint(dc,dc.Ps.fErase,rect);

}

В первом предложении вызывается конструктор класса TPaintDC, который создает объект этого класса с именем dc. Имя этого объекта используется в дальнейших предложениях приведенного фраг­мента, а также и в тексте нашей программы. Прототип конструктора класса TPaintDC имеет следующий вид:

TPaintDC   (HWND);

В качестве аргумента конструктора выступает дескриптор окна типа HWND. Однако в функции EvPaint() в качестве фактического аргумента конструктора использовано обозначение *this, что означает указатель на текущий объект со снятой ссылкой, т.е. сам текущий объект (этот объект в нашей програм­ме не имеет имени, так как создан не по имени, а с помощью указателя MyWin). Каким образом целый объект *MyWin преобразуется в конкретное данное типа HWND? Это делается с помощью оператора преобразования типа, включенного в класс TWindow, который в OWL 2.5 (пакет Borland C++ 4.5) вы­глядит следующим образом:

TWindow::operator HWND()   const   {return HWindow;}

Как было показано в гл. 22, операторы такого рода позволяют преобразовывать пользовательские классы в скалярные данные базовых типов; в данном случае задаются правила преобразования класса TWindow в скалярную переменную HWindow типа HWND. Конструктор TPaintDC требует в качестве ар­гумента переменную типа HWND, однако в функции EvPaint() он вызывается с указанием параметра ти­па "объект класса TWindow". Следовательно, компилятор должен преобразовать объект TWindow в пе­ременную типа HWND. Правила такого преобразования, задаваемые оператором operator, требуют под­становки вместо объекта класса TWindow данного-члена того же класса HWindow. Таким образом, кон­структор TPaintDC получает в качестве параметра данное HWindow, представляющее собой дескриптор окна, которое он затем использует при вызове функции BeginPaint().

В OWL 5.0 (пакет Borland C++ 5.0) описанная процедура выглядит сложнее, хотя ее смысл остается в точности тем же. Отличие заключается в том, что в классе TWindow оператором typedef вводится новый тип данных THandle, в точности эквивалентный HWND: typedef  HWND THandle;




Начало  Назад  Вперед