在我的一个软件中,需要把画一些图形
如: 线条、图形等,如果是在对话框或者窗口上画是没有什么问题了,但问题是,现在不能画在窗口上,而要直接输出BMP文件中,这个怎么实现呢? 按理说是先画到内存DC上,再存到BMP文件中,但总是不成功。请高人们指点一二.

解决方案 »

  1.   

    BOOL CNetEyesServerDlg::DrawToBmp(int xx,int yy, CString file)
    {
    HDC hMemDC = NULL;                   
    int     width = xx;
    int height = yy;
    int startX = 0;
    int startY = 0; BYTE     *lpBitmapBits  = NULL; 

    hMemDC   =   CreateCompatibleDC( 0 );    BITMAPINFO   RGB16BitsBITMAPINFO;   
    ZeroMemory(&RGB16BitsBITMAPINFO,   sizeof(BITMAPINFO));  RGB16BitsBITMAPINFO.bmiHeader.biSize  =   sizeof(BITMAPINFOHEADER); 
    RGB16BitsBITMAPINFO.bmiHeader.biWidth  =   width; 
    RGB16BitsBITMAPINFO.bmiHeader.biHeight   =   height; 
    RGB16BitsBITMAPINFO.bmiHeader.biPlanes   =   1; 
    RGB16BitsBITMAPINFO.bmiHeader.biBitCount =   16; 
          
    HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB16BitsBITMAPINFO,DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0); 
    HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);   
    ::MoveToEx( hMemDC,1,1, 0 );
    ::LineTo(hMemDC,100,100);
      
    BITMAPFILEHEADER   bmBITMAPFILEHEADER; 
    ZeroMemory(&bmBITMAPFILEHEADER,   sizeof(BITMAPFILEHEADER));  bmBITMAPFILEHEADER.bfType   =   0x4d42;     //bmp     
    bmBITMAPFILEHEADER.bfOffBits =   sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
    bmBITMAPFILEHEADER.bfSize =   bmBITMAPFILEHEADER.bfOffBits + ((width*height)*2);   ///2=(16   /   8) 
      
    FILE   *mStream   =   NULL; 
    if((mStream   =   fopen(file,   "wb "))) 
    {     
    //write   bitmap   file   header 
    fwrite(&bmBITMAPFILEHEADER,   sizeof(BITMAPFILEHEADER),   1,   mStream); 
    //write   bitmap   info 
    fwrite(&(RGB16BitsBITMAPINFO.bmiHeader),   sizeof(BITMAPINFOHEADER),   1,   mStream); 
    //write   bitmap   pixels   data 
    fwrite(lpBitmapBits,   2*width*height,   1,   mStream); 
    //close   file 
    fclose(mStream); 

    else 

    return   FALSE; 

    return   TRUE;
    }画出来的,却是黑呼呼的一篇...
      

  2.   

    ::MoveToEx( hMemDC,1,1, 0 );
    ::LineTo(hMemDC,100,100);选入的位图后DC默认是黑色的,所以画之前先设定背景颜色,比如设置为白色,这样才能看到画的效果
    比如:
    ::FillRect(hMemDC,CRect(0,0,200,200),(HBRUSH)GetStockObject(WHITE_BRUSH));我把你的width和height都替换为200测试的,可以看到
      

  3.   

    ::FillRect(hMemDC,CRect(0,0,200,200),(HBRUSH)GetStockObject(WHITE_BRUSH));
    放在 MoveTo,LineTo调用之前
      

  4.   

    果然如 HowToP2p 兄所言,那么,要改变线条的颜色怎么弄呢, 用这个SelectObject(hMemDC,&pen );好像参数不对呀.
      

  5.   

    你调用的是全局的SelectObject,那么第二个参数是HPEN..
    你的pen是什么?是CPen类型也要直接传递pen,不是地址
      

  6.   

    多谢HowToP2p 指点, 打完收工.不过,为什么叫HowToP2p 呢?哈哈,是做 Jingle的么