本人想做一个根据实时采集来的数据绘制曲线图的程序,然后将绘出的图形以位图的格式存盘。询问解决方法,或者第3方控件也成(类似于VB的PictureBox之类的——和VC比起来,VB真容易用啊),自知问题应该很好解决,但由于本人刚开始学习MFC,正处于迷茫加郁闷中,请高手指教,超级感激。

解决方案 »

  1.   

    绘图使用CDC的函数就可以了。不知道你的曲线是什么曲线?
    保存成位图也可以,先将曲线绘制到内存DC中,然后将内存DC中的位图取出就是CBitmap对象了。CBitmap对象保存成位图文件,可以在网上找一下。
      

  2.   

    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pDC,width,height);
    CBitmap* pOldBmp = memDC.SelectObject(&bmp);
    DrawCurve(&memDC);//你的绘制曲线函数
    CBitmap *pMemBmp = memDC.SelectObject(pOldBmp);
    pMemBmp就是画好的图像了
      

  3.   

    你给的代码我明白了,我去研究存盘的问题,我不知道是否和CFile有关。
      

  4.   

    就是说从CBitmap到位图文件的问题吗?不用自己研究的,网上有现成代码的。
      

  5.   

    例程如下:
    BOOL CMapView::SaveBitmapToFile(HBITMAP hBitmap , CString lpFileName)
    {        HDC hDC;
            int iBits;
            WORD wBitCount;
            DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;
            BITMAP Bitmap;
            BITMAPFILEHEADER   bmfHdr;
        BITMAPINFOHEADER   bi;
            LPBITMAPINFOHEADER lpbi;
        HANDLE fh, hDib, hPal,hOldPal=NULL;
            hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
            iBits = GetDeviceCaps(hDC, BITSPIXEL)*GetDeviceCaps(hDC, PLANES);
            DeleteDC(hDC);
            if (iBits <= 1)
                    wBitCount = 1;
            else if (iBits <= 4)
                    wBitCount = 4;
            else if (iBits <= 8)
                    wBitCount = 4;
            else if (iBits <= 24)
                    wBitCount = 24;
            else if (iBits <= 32)
                    wBitCount = 32;
            if (wBitCount <= 8)
                    dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);
        GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
            bi.biSize = sizeof(BITMAPINFOHEADER);
            bi.biWidth = Bitmap.bmWidth;
            bi.biHeight = Bitmap.bmHeight;
            bi.biPlanes = 1;
            bi.biBitCount = wBitCount;
            bi.biCompression = BI_RGB;
            bi.biSizeImage = 0;
            bi.biXPelsPerMeter = 0;
            bi.biYPelsPerMeter = 0;
            bi.biClrUsed = 0;
            bi.biClrImportant = 0;
            dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4 
    *Bitmap.bmHeight ;
            hDib  = 
    GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
            lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
            *lpbi = bi;
            hPal = GetStockObject(DEFAULT_PALETTE);
            if (hPal)
            {
                    hDC  = ::GetDC(NULL);
                    hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
                    RealizePalette(hDC);
            }
            GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
            (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
            (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
            if (hOldPal)
            {
            SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
            RealizePalette(hDC);
            ::ReleaseDC(NULL, hDC);
            }
            fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
            if (fh == INVALID_HANDLE_VALUE)
                    return FALSE;
            bmfHdr.bfType = 0x4D42;  // "BM"
            dwDIBSize    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 
    + dwPaletteSize + dwBmBitsSize;
            bmfHdr.bfSize = dwDIBSize;
            bmfHdr.bfReserved1 = 0;
            bmfHdr.bfReserved2 = 0;
            bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
                    + (DWORD)sizeof(BITMAPINFOHEADER)
                    + dwPaletteSize;
            WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, 
    NULL);
            WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
            GlobalUnlock(hDib);
            GlobalFree(hDib);
            CloseHandle(fh);
            return TRUE;}
      

  6.   

    更多的内容请参考以下地址:
    http://bbs.njupt.edu.cn/cgi-bin/bbscon?board=CPP&file=M.1087698673.A&num=8838
    相信你看了以后绝对会了。
      

  7.   

    http://www.visual-graph.com    Visual Graph 是一个功能非常强大的“交互图形开发引擎”,她和其他编程语言共同工作,弥补了这些语言在图形方面的不足。    Visual Graph尤其适合开发电力、煤炭、化工等各种工业监控软件以及工程绘图、图形管理等应用。http://www.visual-graph.com