Целью было изучение принципов работы с графикой в Windows-приложении. Мне также хотелось узнать внутреннее устройство и механизмы специальных классов библиотеки MFC.
Проект представляет из себя диалоговое окно, на котором размещен элемент StaticText и 3 кнопки Reset, OK и Cancel. Элемент StaticText размером 15 на 10 сантиметров на экране и выкрашен в белый цвет. В него выводится динамически генерируемая графика: несколько прямоугольников, разной высоты, длины и цвета. Как будто бы рисуется столбчатая диаграмма. Картинка изменяется случайным образом при каждом нажатии на кнопку Reset.
Практической и смысловой нагрузки графическая информация не несет. Это просто случайным образом формируемые цветные прямоугольники в качестве примера вывода графической информации. Давайте поближе познакомимся с принципом работы контекста устройства CDC и указателями на окно CWnd *:
CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CWnd *w = this->GetParent(); CDiogrammDlg *w1 = (CDiogrammDlg *)w; CDio *p1 = &(w1->m_dio); p1->Draw();
классами и объектами пера и кисти:
CPen *pencil; CPen pen(PS_SOLID, 3, RGB(0, 0, 0)); pencil = m_pdc -> SelectObject(&pen); for(int i = 0; i < m_n; i++) { br.CreateSolidBrush(m_column_color[i]); old_brush = m_pdc -> SelectObject(&br); //m_pdc -> Rectangle(m_point_top[i].x, m_point_top[i].y, m_point_bottom[i].x, m_point_bottom[i].y); m_pdc -> Rectangle(m_x_begin[i], m_longer_y[i], m_x_end[i], (m_longer_y[i] + m_longer_y[i])); m_pdc -> SelectObject(old_brush); br.DeleteObject(); } m_pdc -> SelectObject(pencil);
создание случайного цвета:
int r = rand()%255; int g = rand()%255; int b = rand()%255; m_title_color = RGB(r, g, b);
работа с координатами клиентской части окна. Динамическое вычисление координат и расположение графического объекта в нужной позиции «на лету»:
m_wnd = wnd; m_pdc = m_wnd -> GetDC(); m_wnd -> GetClientRect(m_rect); m_client_width = m_rect.Width(); m_client_height = m_rect.Height(); m_coord_top_x = m_otstup; m_coord_top_y = m_otstup; m_coord_bottom_x = m_client_width - m_otstup; m_coord_bottom_y = m_client_height - m_otstup; m_rect_width = m_coord_bottom_x - m_coord_top_x; m_rect_height = m_coord_bottom_y - m_coord_top_y; m_wider = m_rect_width/m_n;
Динамическое создание массивов разных типов данных:
m_longer_s = new CString [m_n]; m_longer = new int [m_n];
И их удаление:
delete [] m_longer_s; delete [] m_longer; m_longer_s = NULL; m_longer = NULL;
Сведение всех подготовленных имплементаций происходит в функции OnInitDialog()
OnInitDialog() { … m_static1.SubclassDlgItem(IDC_STATIC1, this); m_dio.Create(); m_dio.SetWindow(&m_static1); m_dio.SetParam(); m_dio.Draw(); m_dio.m_n; … }