void CmfcaggView::OnDraw(CDC* pDC) { CmfcaggDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; RECT rt; ::GetClientRect(m_hWnd, &rt); HDC hdc = ::GetDC(m_hWnd); int width = rt.right - rt.left; int height = rt.bottom - rt.top; //============================================================ //Creating compatible DC and a bitmap to render the image BITMAPINFO bmp_info; bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmp_info.bmiHeader.biWidth = width; bmp_info.bmiHeader.biHeight = height; bmp_info.bmiHeader.biPlanes = 1; bmp_info.bmiHeader.biBitCount = 32; bmp_info.bmiHeader.biCompression = BI_RGB; bmp_info.bmiHeader.biSizeImage = 0; bmp_info.bmiHeader.biXPelsPerMeter = 0; bmp_info.bmiHeader.biYPelsPerMeter = 0; bmp_info.bmiHeader.biClrUsed = 0; bmp_info.bmiHeader.biClrImportant = 0; HDC mem_dc = ::CreateCompatibleDC(hdc); void* buf = 0; HBITMAP bmp = ::CreateDIBSection( mem_dc, &bmp_info, DIB_RGB_COLORS, &buf, 0, 0 ); // Selecting the object before doing anything allows you // to use AGG together with native Windows GDI. HBITMAP temp = (HBITMAP)::SelectObject(mem_dc, bmp); //============================================================ // AGG lowest level code. //agg::rendering_buffer是AGG的管理像素内存的低层类, 一般要与像素格式类配合使用 //如agg::pixfmt_bgra32… agg::rendering_buffer rbuf; // 初始化rbuf,buf就是客户区位图的指针,width,height是位图宽度与高度 // 因为上面创建位图时用的是32位的位图格式,所以要 -width*4,4表示(RGBA–4BYTE) // 因为windowsGDI的座标系与AGG的正好是反的所以加了-号*/ rbuf.attach((unsigned char*)buf, width, height, -width*4); // Use negative stride in order // to keep Y-axis consistent with // WinGDI, i.e., going down. // Pixel format and basic primitives renderer // 因为上面创建位图时用的是32位的位图格式,所以这里要用agg::pixfmt_bgra32类 agg::pixfmt_bgra32 pixf(rbuf); // agg::renderer_base主要是AGG渲染的基础类,比agg::pixfmt_bgra32类多了管理边框的功能 agg::renderer_base<agg::pixfmt_bgra32> renb(pixf); // agg::renderer_base.clear将所有像素清除为指定颜色 renb.clear(agg::rgba8(255, 255, 255, 255)); // agg::renderer_scanline_aa_solid类将直线渲染为实心 agg::renderer_scanline_aa_solid<agg::renderer_base<agg::pixfmt_bgra32> > ren(renb); // agg::rasterizer_scanline_aa是AGG的核心类,用于光删化图形 agg::rasterizer_scanline_aa<> ras; // agg::scanline_p8用于渲染 agg::scanline_p8 sl; // gsv_text类 agg::gsv_text txt; agg::conv_stroke<agg::gsv_text> cstxt(txt); // 设置大小及是否反转 txt.flip(true); txt.size(18); // 设置位置和文字 txt.start_point(20,100); txt.text("cpp"); // 以红色输出上面的文字 ras.add_path(cstxt); agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(1,0,0)); // 设置新的位置和文字 txt.start_point(20+txt.text_width(),100); txt.text("prog.com"); // 以蓝色输出上面的文字 ras.add_path(cstxt); agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(0,0,1)); //------------------------------------------------------------ // Display the image. If the image is B-G-R-A (32-bits per pixel) // one can use AlphaBlend instead of BitBlt. In case of AlphaBlend // one also should clear the image with zero alpha, i.e. rgba8(0,0,0,0) ::BitBlt( hdc, rt.left, rt.top, width, height, mem_dc, 0, 0, SRCCOPY ); // Free resources ::SelectObject(mem_dc, temp); ::DeleteObject(bmp); ::DeleteObject(mem_dc); // TODO: add draw code for native data here }