Уфимский Государственный Авиационный Технический Университет
Кафедра Вычислительной Техники
и Защиты Информации
Пояснительная записка
к курсовой работе
по дисциплине: «Методы программирования и прикладные алгоритмы»
по теме:
«Разработка программы на языке С++ для построения сложных геометрических фигур на плоскости
»
Выполнил студент:
Митряхин А.В.
Факультет: ИРТ
Группа: ЗИ-134
Принял доцент, к.т.н.:
Бабич М. В.
Уфа 2007 г.
Содержание
1. Постановка задачи и исходные данные….………………….…………………..…3
2. Математическое обеспечение ……………………………………..…………….…4
3. Описание работы программы и полученные результаты при решении поставленной задачи ….………………………………………...………..……..……..5
4. Разработка алгоритма программы в виде блок-схемы……………………...…….8
5. Краткое описание возможностей среды программирования
MicrosoftVisualC++………..………….………………………………...…………….9
6. Выводы………………………………….……………………….…………….……14
7. Список используемой литературы…….…………………………………………..15
8. Приложение А………………….…………………………………………….……..16
Постановка задачи
Задание:
Разработать программу для построения изображения фигуры, приведенной на рисунке. Исходные данные (x1,y1,R1,x2,y2,r2,x3,y3,r3) должны быть считаны из выбранного пользователем файла. Осуществлять проверку исходных данных на соответствие варианту (две окружности находятся внутри третьей).
Математическое обеспечение
Разрабатывать программу для построения изображения фигуры будем по следующему алгоритму:
1) Исходные данные (x1,y1,R1,x2,y2,r2,x3,y3,r3) считываем из выбранного пользователем файла.
2) Осуществляем проверку исходных данных: две окружности находятся внутри третьей.
Если одновременно выполняются условия:
(R1 > 0), (R1 > 2*r2), (R1 > 2*r3), ((x2 - r2) > x3), sqrt((x2 - X1)*(x2 - X1) + (y2 - Y1)*(y2 - Y1)) + r2 < R1,
sqrt((x3 - X1)*(x3 - X1) + (y3 - Y1)*(y3 - Y1)) + r3 < R1,
тогда исходные данные верны. Затем выполняется построение фигуры. В случае ошибки программа выдает сообщение ”Can't load params”, то есть искомые данные не соответствуют варианту.
Описание работы программы и полученные результаты при решении поставленной задачи
Рис. 1. Главное окно программы.
Программа предназначена для построения сложной геометрической фигуры (рисунок 1).
В диалоге программы имеются две кнопки и поле MFC_DIALOG. В этом поле отображается результат той или иной функции.
После запуска программы пользователь нажимает на кнопку ”Load”, которая вызывает стандартное окно для открытия документа. В новом диалоге выбирает файл для считывания исходных данных (рисунок 2). И после того, как пользователь выберет правильный
файл функция OnBtnLoad() нарисует в точности то, что изображено на рисунке 5, а это то, что и требовалось. Если файл содержит величины не соответствующие условию задачи, тогда функция OnBtnLoad() выведет сообщение ”Can’tloadparams”, то есть исходные данные не верны.
Рис. 2
Кнопка ”Update” предназначена для обновления изображения фигуры, после исправления данных (x1,y1,R1,x2,y2,r2,x3,y3,r3), которые считываются из выбранного пользователем файла (рисунок 3).
Рис. 3
Теперь рассмотрим другую ситуацию, когда пользователь выбрал не верный файл:
Если такое случилось, то код функции OnBtnLoad() предупредит нас об этом сообщением (рисунок 4).
Рис. 4
Итог работы приложения приведен на рисунке 5.
Рис. 5
Результат созданного проекта.
Разработка алгоритма программы в виде блок-схемы
Блок-схема для функции OnBtnLoad()
Среда программирования
Microsoft
Visual
C
++
Введение
C++ - это попытка решения разработчиками языка С задач объектно-ориентированного программирования (ObjectOrientedProgramming, OOP). Построенный на твердом фундаменте С, С++ помимо ООР поддерживает множество других полезных инструментов, не жертвуя при этом ни мощью, ни элегантностью, ни гибкостью С. С++ уже стал универсальным языком для программистов всего мира.
С++ был разработан сотрудником научно-исследовательского центра AT&TBellLaboratories(Нью-Джерси, США) Бьярном Страуструпом в 1979 году. Первоначальное название «С с классами» было изменено на С++ в 1983 году. Начиная с 1980 года С++ претерпел две существенные модернизации: в 1985 и 1990 годах. Последняя третья модель связана с процессом стандартизации С++. Несколько лет назад началась работа по созданию единого международного стандарта по С++. Для этой цели был сформирован объединенный комитет по стандартизации ANSI (AmericanNationalStandardsInstitute, Американский национальный институт стандартов) и ISO (InternationalStandardsOrganization, Международная организация по стандартам) для языка С++. Первый рабочий проект указанного стандарта был предложен 25 января 1994 года. Комитет ANSI/ISO по С++ фактически сохранил все основные черты языка, заложенные туда еще Страуструпом и добавил несколько новых инструментов.
C++ - универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей C++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, C++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.
Ключевым понятием C++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. C++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline- подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В C++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем. C++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из C++ программ можно использовать C библиотеки, и с C++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C.
Microsoft Visual C++
и
MFC
MFC расшифровываетсякак Microsoft Foundations Classes. Это библиотека, которая используется для программирования под Windows на Visual C++. Сам язык C/C++ хотя и позволяет программировать под Windows, но с большими трудностями. Так, для создания простейшего приложения (окно, которое можно двигать по экрану, минимизировать и максимизировать) надо написать несколько десятков строчек кода. С помощью MFC вы это сделаете существенно быстрее. MFC инкапсулирует в себя многие рутинные операции, с которыми сталкивается программист при создании программ по Windows.
Наряду с MFC существуют и другие библиотеки для Windows-программирования. Например VCL (Visual Component Library) от Borland. Она используется в продуктах Borland'а - C++ Builder и Delphi (несомненный плюс всего этого - изучив VCL, вы сможете работать и в Delphi, и в C++ Builder).
Но сейчас стандарт это всё-таки MFC. И даже в C++ Builder вы можете использовать MFC.
Процесс разработки Windows-программы в Visual C++ начинается с создания нового проекта и подготовки набора исходных файлов. Раньше их приходилось делать вручную, теперь всю работу берет на себя "мастер" AppWizard.
AppWizard - это специальный инструмент для генерации программных текстов. В ходе его работы на экране отображается последовательность диалоговых окон, где задаются основные вопросы, касающиеся желаемых свойств создаваемой программы. Получив ответы, AppWizard генерирует текст базовой программы (скелет программы), содержащий все ее обязательные элементы.
Классы графического интерфейса
Весь вывод в системе Windows реализован на принципе унификации работы с такими физически различными устройствами, как экран дисплея, принтеры, плоттеры, и.т.п. Для всех этих устройств, приложение использует одни и те же функции и, в общем случае, может «не задумываться» над тем, куда будет выведена строка текста или какой-либо графический объект. Система сама распознает устройство ввода и активизирует соответствующий драйвер. Такой подход, с одной стороны, обеспечивает универсальность процесса графического вывода, а с другой – позволяет, например, создавать платы графических акселераторов, которые самостоятельно, без использования центрального процессора осуществляют преобразования команд рисования, существенно разгружая тем самым всю систему в целом.
Для реализации такого подхода в Windowsпредусмотрен специальный объект, называемый контекстом устройства. Именно он хранит необходимую информацию, как об устройстве вывода, так и о параметрах соответственно рисования. Физически весь вывод происходит, естественно, на конкретное устройство, представленное в системе контекстом, описываемым, в свою очередь, дескриптором. Последний используют (в качестве параметра) все функции графического вывода Win32 API, т.е. при этом задействуется объект «контекст устройства», до чего MFC-приложению нет никакого дела – оно работает с объектами классов библиотеки MFC, что существенно удобнее и надежнее.
CDC – базовый класс для всех классов, инкапсулирующих контексты устройств Windows. Объекты этого класса используются для работы со всем экраном дисплея или с таким устройством, как принтер.
CClientDC – объекты этого класса обеспечивают доступ к клиентской части окна. Используется для графического вывода в любой функции. При создании объекта класса CClientDC в конструкторе вызывается функция Win32 APIGetDC, а при разрушении, в деструкторе – ReleaseDC, также из Win32 API, обеспечивая необходимые операции для подготовки и завершения процесса графического вывода именно и только в клиентскую часть окна. За создание объекта класса CClientDC отвечает разработчик приложения.
Графические объекты
Настройка параметров графического вывода проводится двумя путями. Одни параметры настраиваются при помощи вызова функций Win32 APIили функций-членов класса CDC и производных от него, другие – путем замены так называемых графических объектов. Библиотека MFC обеспечивает разработчиков всеми необходимыми классами, которые инкапсулируют соответствующие графические объекты Windows. Кроме того, библиотека имеет в своем составе дополнительные классы, значительно облегчающие решение ряда задач (к примеру классы CPointи CRect).
CPen – инкапсулирует объект Windows «карандаш», который может быть выбран (назначен) в контекст устройства и использоваться для определения типа и цвета линий и границ фигур.
CBrush – Инкапсулирует объект Windows «кисть», который может быть выбран (назначен) в контекст устройства и использоваться для определения типа и цвета заливки внутренних областей замкнутых фигур.
Создать объекты CPenи CBrush можно двумя способами:
1. Конструктор используется как для создания собственно объекта, так и для его инициализации.
2. Помимо использования конструктора, только создающего объект класса, дополнительно требуется вызов инициализирующей функции.
Второй способ предпочтительнее, т.к. невозможность инициализации, например, в случае исчерпания соответствующих системных ресурсов, легче определить при вызове именно функции инициализации. В противном случае для гарантии защиты от ошибок, вернее, для их своевременного обнаружения потребуется механизм обработки исключений.
Настройка режимов отображения
Функции этой группы устанавливают и настраивают систему координат, которая используется всеми функциями вывода – координаты вывода задаются именно в логически
Для настройки системы координат в Windows используются два понятия – физическая область вывода (viewport), координаты и размеры которой задаются в физических единицах – пикселях, и логическая область вывода (window), координаты и размеры которой задаются в логических единицах, определяемых размером рисования.
И физическая и логическая области вывода характеризуются точкой, определяющей начало координат. Для настройки начала координат физической области вывода используются функции:
virtual CPoint CDC::SetViewportOrg(int x, int y) или
virtual CPoint CDC::SetViewportOrg(POINT point)
Для настройки логической области вывода используются следующие функции:
CPoint CDC::SetWindowOrg(int x, int y) или
CPoint CDC::SetWindowOrg(POINT point)
Все четыре функции в качестве параметров получают новые значения для установки начала координат, а возвращают предыдущие значения. Здесь есть одна тонкость: если для физической области вывода указываются координаты, которые в дальнейшем будут являться началом координат, то для логической области вывода указываются логические координаты, которые в дальнейшем будут соответствовать левому верхнему углу логической области вывода.
Из вышесказанного следует, что есть смысл настраивать начало координатной сетки только для одной из областей, т.к система координат логической области вывода относительна системе координат физической области.
Рисование линий
Функции этой группы предназначены для рисования прямых (LineTo), гладких (Arc, ArcTo) и ломаных линий (Polyline, PolylineTo), установленным на момент рисования карандашом. Часть функций меняют при этом текущее положение карандаша, другие – нет. Даже если в результате рисования контур получается замкнутым, закрашивание не осуществляется.
Класс
CFileDialog
Этот класс отвечает за создание и работоспособность двух блоков диалога: один позволяет выбрать файл для его последующего открытия, а другой предназначен для выбора места расположения и имени файла при его сохранении.
Ниже описаны некоторые основные функции класса.
CFileDialog::CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
LPCSTR lpszFilter = NULL,
CWnd *pParentWnd = NULL) – конструктор класса, создает объект «стандартный блок диалога».
Если параметр bOpenFileDialog равен TRUE, создается объект «блок диалога FileOpen (Открытие файла)» и объект «блок диалога FileSaveAs (Сохранение файла)», если bOpenFileDialog равен FALSE.
virtualintCFileDialog::DoModal() – вызов этой функции выводит на экран модальный стандартный блок диалога для открытия или сохранения файла. При успешном завершении функция возвращает IDOKили IDCANCELв зависимости от того, при помощи какой кнопки пользователь закрыл блок диалога.
Для того чтобы получить имя файла, определенное пользователем в блоке диалога, в классе реализованы несколько функций:
virtualCStringCFileDialog::GetPathName() – возвращает полное имя файла, включая путь.
virtualCStringCFileDialog::GetFileName() – возвращает имя файла с расширением.
virtual CString CFileDialog::GetFileExt() – возвращаетрасширениеименифайла.
virtual CString CFileDialog::GetFileTitle() – возвращаетимяфайлабезрасширения.
Выводы
В ходе выполнения курсовой работы были получены основы разработки Windows – приложений с использованием MFС. Был освоен объектно-ориентированный язык программирования VisualC++.
В результате работы была написана программа, которая строит изображение фигуры, приведенной на рисунке 5. При исходных данных (x1, y1,R1, x2, y2, r2, x3, y3, r3), которые должны быть считаны из выбранного пользователем файла. Осуществил проверку исходных данных на соответствие варианту: две окружности находятся внутри третьей.
Список используемой литературы
1. Шилдт Герберт «Полный справочник по С++»- 4-е издание.: Пер.с англ. – М.: Издательский дом «Вильямс», 2002.- 704с.: ил.
2. Мешков А., Тихомиров Ю. «VisualC++ и MFC» - СПб.:БХВ-Петербург. 2002 – 1017с.
3. Карпов Б., Баранов Т. «С++: специальный справочник» - СПб.: Питер, 2001. – 480 с.:ил.
4. Основы Microsoft Visual Studio. Net 2003/ Пер. с англ. - М.:Издательство- торговый дом "Русская редакция", 2003.-464 с: ил.
5. Круглински Д., Уингоу С, Шеферд Дж. «Программирование на Microsoft Visual C++ 6.0 для профессионалов»/Пер. с англ.- СПб: Питер, М.:Издательсво- торговый дом "Русская Редакция", 2004.- 861 с.:ил.
6. Бьярн Страуструп « Введение в язык СИ++», 1995
Приложение А
CMyDlg.cpp
#include "stdafx.h"
#include "4ertejmfc.h"
#include "4ertejmfcDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) // конструктор класса, создает объект “стандартный блок
диалога”
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BUTTON2, &CMyDlg::OnBtnUpdate)
ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBtnLoad)
END_MESSAGE_MAP()
// обработчики сообщений
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
return TRUE;
}
void CMyDlg::OnPaint()
{
CPaintDCdc(this); // контекст устройств для рисования
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRectrect; // объявили о создании объекта класса CRect
GetClientRect(&rect); //передаем размеры иконки в объект Rect
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon); //рисование
}
else
{
k_Draw.Draw(&dc);
}
}
HCURSOR CMyDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMyDlg::OnBtnLoad()
{
CFileDialog fd(1, 0, 0, 4|2, _T("txt files (.txt)|*.txt|"), this); //
CFileDialog fd(TRUE, ".txt", "ReadMe", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, Filter);
объявили о создании объекта класса CFileDialog для открытия файла
if(fd.DoModal() != IDOK)return;
k_filePath = fd.GetPathName(); // открыли файл, выбранный пользователем, на чтение
if(!k_Draw.LoadParamFromFile(k_filePath.GetString()))
this->MessageBox(_T("Can't load params"));
this->RedrawWindow();
}
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
this->RedrawWindow();
}
// функция OnSize вызывается при всяком изменении размера окна
void CMyDlg::OnBtnUpdate()
{
if(k_filePath.GetLength() <= 0)return;
if(!k_Draw.LoadParamFromFile(k_filePath.GetString()))
this->MessageBox(_T("Can't load params"));
this->RedrawWindow();
}
Рисование
#include "StdAfx.h"
#include "Draw.h"
#include <Math.h>
inline int sqrt(int arg){return (int)sqrt((double) (arg)); }
CDraw::CDraw(void):
isCorrectState(false)
{
}
CDraw::~CDraw(void)
{
}
bool CDraw::LoadParamFromFile(const TCHAR* path)
{
CStdioFile file;
if(!file.Open(path, CStdioFile::modeRead | CStdioFile::typeText))return false;
CString strs[9];
for(int i = 0; i < 9; i++)
{
if(!file.ReadString(strs[i]))
{
file.Close();
return false;
}
}
int i = 0;
X1 = _tstoi(strs[i++].GetString());
Y1 = _tstoi(strs[i++].GetString());
R1 = _tstoi(strs[i++].GetString());
x2 = _tstoi(strs[i++].GetString());
y2 = _tstoi(strs[i++].GetString());
r2 = _tstoi(strs[i++].GetString());
x3 = _tstoi(strs[i++].GetString());
y3 = _tstoi(strs[i++].GetString());
r3 = _tstoi(strs[i++].GetString());
//test
isCorrectState =
(R1 > 0) &&
(R1 > 2*r2) && (R1 > 2*r3) &&
((x2 - r2) > x3) &&
sqrt((x2 - X1)*(x2 - X1) + (y2 - Y1)*(y2 - Y1)) + r2 < R1 &&
sqrt((x3 - X1)*(x3 - X1) + (y3 - Y1)*(y3 - Y1)) + r3 < R1 ;
return isCorrectState;
}
bool CDraw::Draw(CPaintDC* pDC)
{
if(!isCorrectState)return false;
RECT cr;
pDC->GetWindow()->GetClientRect(&cr);
int x0 = (cr.right - cr.left) /2;
int y0 = (cr.bottom - cr.top) / 2;
pDC->Rectangle(&cr);
pDC->MoveTo(x0, cr.top);
pDC->LineTo(x0, cr.bottom);
pDC->MoveTo(cr.left,y0);
pDC->LineTo(cr.right,y0);
CRect r;
r.SetRect(X1 - R1, -(Y1 - R1), X1 + R1, -(Y1 + R1));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));
pDC->MoveTo(x2 + x0, r.top + 10);
pDC->LineTo(x2 + x0, r.bottom - 10);
pDC->MoveTo(x3 + x0, r.top + 10);
pDC->LineTo(x3 + x0, r.bottom - 10);
r.SetRect(x2 - r2, -(y2 - r2), x2 + r2, -(y2 + r2));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));
r.SetRect(x3 - r3, -(y3 - r3), x3 + r3, -(y3 + r3));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(r.left, r.top), CPoint(r.left, r.top));
CPen pen(PS_SOLID, 7, (COLORREF)(0));
CPen* penLast = pDC->SelectObject(&pen);
pDC->MoveTo(X1 + x0, -Y1 + y0);
pDC->LineTo(X1 + x0, -Y1 + y0);
pDC->MoveTo(x2 + x0, -y2 + y0);
pDC->LineTo(x2 + x0, -y2 + y0);
pDC->MoveTo(x3 + x0, -y3 + y0);
pDC->LineTo(x3 + x0, -y3 + y0);
r.SetRect(x2 - r2, -(y2 - r2), x2 + r2, -(y2 + r2));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(r.CenterPoint().x, r.bottom), CPoint(r.CenterPoint().x, r.top));
r.SetRect(x3 - r3, -(y3 - r3), x3 + r3, -(y3 + r3));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(r.CenterPoint().x, r.bottom), CPoint(r.CenterPoint().x, r.top));
//rb
int lu = Y1 + sqrt(R1*R1 - (X1 - x3)*(X1 - x3));
int ru = Y1 + sqrt(R1*R1 - (x2 - X1)*(x2 - X1));
int rd = Y1 -(ru - Y1);
int ld = Y1 -(lu - Y1);
pDC->MoveTo(x2 + x0, -(y2 - r2) + y0);
pDC->LineTo(x2 + x0, -rd + y0);
pDC->MoveTo(x2 + x0, -(y2 + r2) + y0);
pDC->LineTo(x2 + x0, -ru + y0);
pDC->MoveTo(x3 + x0, -(y3 - r3) + y0);
pDC->LineTo(x3 + x0, -ld + y0);
pDC->MoveTo(x3 + x0, -(y3 + r3) + y0);
pDC->LineTo(x3 + x0, -lu + y0);
r.SetRect(X1 - R1, -(Y1 - R1), X1 + R1, -(Y1 + R1));
r.OffsetRect(x0, y0);
pDC->Arc(&r, CPoint(x3 + x0, -ld + y0), CPoint(x2 + x0, -rd + y0));
pDC->Arc(&r, CPoint(x2 + x0, -ru + y0), CPoint(x3 + x0, -lu + y0));
pDC->SelectObject(penLast);
//CRect rto = cr;
//rto.right -= 10;
//rto.bottom -= 10;
//pDC->SetTextColor(0);
//pDC->SetBkColor(RGB(255,255,255));
//pDC->DrawText(_T("4ertenie 4ever!"),-1, &rto, DT_RIGHT | DT_BOTTOM | DT_SINGLELINE );
return true;
}