高分求救!在单文档或多文档的视中画图,再保存为BMP图象,不要dialog的。I VC差。谢谢
有人能写一个简单例子就最好了,发邮件到我邮箱,写名是谁我一定快快给分,分不够可以再加100分.想做:
在单文档或多文档的视中画图,然后点一个菜单来将画出的图保存为BMP图象.非常的感谢

解决方案 »

  1.   

    我邮箱
    [email protected]
    再次谢谢
      

  2.   

    这样的例子有很多,差不多每本VC书上都有。
    先创建一个空位图,现跟随踪WM_LBUTTONDOWN和WM_MOUSEMOVE消息,将鼠标坐标点连接起来就可以了。你要想学习编程就自己做,拿别人的你什么也学不到。
    给你个保存位图的函数。
    int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) 
    {      //lpFileName 为位图文件名
     HDC     hDC;   //设备描述表
      WORD    wBitCount;   //位图中每个像素所占字节数
     //定义调色板大小, 位图中像素字节大小 ,  位图文件大小 , 写入文件字节数
     DWORD           dwPaletteSize=0,dwBmBitsSize, dwWritten;
     BITMAP          Bitmap;   //位图属性结构
     BITMAPFILEHEADER   bmfHdr; //位图文件头结构
     BITMAPINFOHEADER   bi;   //位图信息头结构 
     LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
     HANDLE        fh,hPal;
     HPALETTE     hOldPal=NULL;
     //定义文件,分配内存句柄,调色板句柄
     
     //计算位图文件每个像素所占字节数
     hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
     //设置位图信息头结构
     GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
      wBitCount = Bitmap.bmBitsPixel;
     //计算调色板大小
     if (wBitCount <= 8)
          dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD); 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;
     //为位图内容分配内存/*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx 
    //每个扫描行所占的字节数应该为4的整数倍,具体算法为:
     int biWidth = (Bitmap.bmWidth*wBitCount) / 32;
     if((Bitmap.bmWidth*wBitCount) % 32)
      biWidth++; //不是整数倍的加1
     biWidth *= 4;//到这里,计算得到的为每个扫描行的字节数。
     dwBmBitsSize = biWidth * Bitmap.bmHeight;//得到大小
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*///int iSize = dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER);
    // hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
     //HANDLE hHeap = HeapCreate(0,iSize,0);
     lpbi =(LPBITMAPINFOHEADER) HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
     //lpbi =(LPBITMAPINFOHEADER) VirtualAlloc(NULL,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);DWORD dwError = GetLastError();
    DebugOut("LastError = %d",dwError);
    // 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, (BITMAPINFO *)lpbi,DIB_RGB_COLORS);//DIB_PAL_COLORS);//DIB_RGB_COLORS);
     //恢复调色板   
     if (hOldPal)
     {
      SelectPalette(hDC, hOldPal, TRUE);
      RealizePalette(hDC);
      ReleaseDC(NULL, hDC);
     }
     //创建位图文件    
     fh=CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_NEW,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
     if (fh==INVALID_HANDLE_VALUE)  return FALSE;
     // 设置位图文件头
     bmfHdr.bfType = 0x4D42;  // "BM"
     bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;
     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, sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize, &dwWritten, NULL);
     //清除   
     //GlobalUnlock(hDib);
     //GlobalFree(hDib);
      HeapFree(GetProcessHeap(),0,lpbi);
    //  HeapDestroy(hHeap);
     //VirtualFree(lpbi,0,MEM_RELEASE);
      CloseHandle(fh);
     return TRUE;
    }
    int GetRealWindow(HWND *phWnd, POINT ptPoint)
    {
           int nResult = false;
           int nRetCode = false;       HWND hWndTop = NULL;
           HWND hWndChild = NULL; 
           POINT ptCooChild = {0};
           LONG lWindowStyle = 0;       //先得到ptPoint指向的(子)窗口
           hWndTop = ::WindowFromPoint(ptPoint);          if(!IsWindow(hWndTop))
           {
         MessageBox(NULL,TEXT("没有得到窗口!"),NULL,MB_OK);
        DebugBreak();
       }
           ptCooChild = ptPoint;       lWindowStyle = GetWindowLong(hWndTop, GWL_STYLE);           
           
           //通过这个判断找到最上层的父窗口
           if( !GetParent(hWndTop) || 
                GetDesktopWindow() == GetParent(hWndTop) ||
                !(lWindowStyle & WS_CHILDWINDOW))
           {
                  *phWnd = hWndTop; //hWndTop是父窗口
           }
           else
           {
                  *phWnd = GetParent(hWndTop);
           }
           
           // 转换相对坐标
           ::ScreenToClient(*phWnd, &ptCooChild);           
          
           //从父窗口一层一层往下查找子窗口,直到找到最底层的子窗口
           while (TRUE){
                  hWndChild = RealChildWindowFromPoint(*phWnd, ptCooChild);              if (hWndChild && (hWndChild != *phWnd))
                         *phWnd = hWndChild;
                  else
                         break;
           }
           nResult = true;
           return nResult;
    }
      

  3.   

    多了一个函数?
    在ondraw中需要怎么处理呢?听说要专门画在bitmap中,
      

  4.   

    能帮写一个在ondraw中直接画好线,然后用菜单来保存的示例就最好了。
    不用写onLButtonDown这样的响应鼠标的事件。
      

  5.   

    收到你的示例了,是个画图的程序,
    都看不懂是什么工程。画线的部分到是可以看到。你都不爱用MFC向导创建工作,是吗?
    先谢谢,我再试试。
      

  6.   

    那是一个用C语言写的标准WIN32程序。改成MFC项目也很容易。
      

  7.   


    改成MFC,在ondraw中画在CDC里时,还在不好调过去。
    例子中的也是窗口(dialog)式的画图程序.
    再试试吧,如有画在单文档或多文档中的(不用动态画,就预画一条线就可以)保存示例就好了。
    现在找了一个存在 BITMAPINFOHEADER 中的示例,调过去一些,在我项目中还没调过去,不能调上面的方法。
    如有存于CBitmap 然后调用上面的保存方法就好了。耽搁大家时间了.
    还是继续谢谢,问题解决后加分