Целью было изучение принципов работы с графикой в Windows-приложении. Мне также хотелось узнать внутреннее устройство и механизмы специальных классов библиотеки MFC.  

Проект представляет из себя диалоговое окно, на котором размещен элемент StaticText и 3 кнопки Reset, OK и Cancel.  Элемент StaticText размером 15 на 10 сантиметров на экране и выкрашен в белый цвет. В него выводится динамически генерируемая графика: несколько прямоугольников, разной высоты, длины и цвета. Как будто бы рисуется столбчатая диаграмма. Картинка изменяется случайным образом при каждом нажатии на кнопку Reset.

pr3.1

pr3.2

Практической и смысловой нагрузки графическая информация не несет.  Это просто случайным образом формируемые цветные прямоугольники в качестве примера вывода графической информации. Давайте поближе познакомимся с принципом работы контекста устройства 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;
…
}