图像的大小是640*480

解决方案 »

  1.   

    把图读取,选入dc,然后在dc上画图,当然必须保存原图,你再用链表去记录你所有的操作,剩下的就是你的问题了
      

  2.   

    如果有兴趣可以看看设计模式的command模式...
      

  3.   

    对于二值图来说,可以很容易地通过重新用"逆值"背景/前景色彩和对应参数画点,线,圆来实现操作的撤销/恢复;
    对于8位彩图,也可以用bitblt函数中SRCAND,SRCINVERT,SRCERASE等进行恰当组合类似处理;
    但是对于24位彩图就更复杂了,需要分色彩通道分别处理才行.
      

  4.   

    把矢量图形和位图数据分开保存。使用Command模式来实现操作矢量图形的 Undo/Redo
      

  5.   

    介绍一个简单的思路:
    一般来说你在VC中要显示图像,要把图像文件转变成位图格式,由位图文件头和位图点阵数据组成,即BITMAPINFO和char buffer[xxx]。显示的时候你调用StretchDIBits即可。在上面做图形还比较简单,你可以利用CDC直接画,但是如果希望能够和图像数据结合在一起,你就要对位图点阵进行操作。
    Redo/Undo比较复杂了,每个图形操作(创建、删除、位置移动、大小修改等等)需要把图形对象复制一份记录到一个栈Vector或者链表中,在Redo/Undo时或者替代对象本身,或者替代当前对象中的属性。
    对于初学者,把第一个问题解决好就不错了,第二个问题不容易搞定,如果公司给你足够的时间,都不成问题。
      

  6.   

    保存原图的话,有很多相关的类来实现,一般是 与设备无关的图,用CDib来实现,New一个对象,用下面的函数来实现保存原图就是了!HDIB CreateDIB(DWORD dwWidth, DWORD dwHeight, WORD wBitCount) 

        BITMAPINFOHEADER    bi;             // bitmap header 
        LPBITMAPINFOHEADER  lpbi;           // pointer to BITMAPINFOHEADER 
        DWORD               dwLen;          // size of memory block 
        HDIB                hDIB; 
        DWORD               dwBytesPerLine; // Number of bytes per scanline 
     
     
        // Make sure bits per pixel is valid 
     
        if (wBitCount <= 1) 
            wBitCount = 1; 
        else if (wBitCount <= 4) 
            wBitCount = 4; 
        else if (wBitCount <= 8) 
            wBitCount = 8; 
        else if (wBitCount <= 24) 
            wBitCount = 24; 
        else 
            wBitCount = 4;  // set default value to 4 if parameter is bogus 
     
        // initialize BITMAPINFOHEADER 
     
        bi.biSize = sizeof(BITMAPINFOHEADER); 
        bi.biWidth = dwWidth;         // fill in width from parameter 
        bi.biHeight = dwHeight;       // fill in height from parameter 
        bi.biPlanes = 1;              // must be 1 
        bi.biBitCount = wBitCount;    // from parameter 
        bi.biCompression = BI_RGB;     
        bi.biSizeImage = 0;           // 0's here mean "default" 
        bi.biXPelsPerMeter = 0; 
        bi.biYPelsPerMeter = 0; 
        bi.biClrUsed = 0; 
        bi.biClrImportant = 0; 
     
        // calculate size of memory block required to store the DIB.  This 
        // block should be big enough to hold the BITMAPINFOHEADER, the color 
        // table, and the bits 
     
        dwBytesPerLine = WIDTHBYTES(wBitCount * dwWidth); 
        dwLen = bi.biSize + PaletteSize((LPBYTE)&bi) + (dwBytesPerLine * dwHeight); 
     
        // alloc memory block to store our bitmap 
     
        hDIB = GlobalAlloc(GHND, dwLen); 
     
        // major bummer if we couldn't get memory block 
     
        if (!hDIB) 
            return NULL; 
     
        // lock memory and get pointer to it 
     
        lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB); 
     
        // use our bitmap info structure to fill in first part of 
        // our DIB with the BITMAPINFOHEADER 
     
        *lpbi = bi; 
     
        // Since we don't know what the colortable and bits should contain, 
        // just leave these blank.  Unlock the DIB and return the HDIB. 
     
        GlobalUnlock(hDIB); 
     
        //return handle to the DIB 
     
        return hDIB;