MFC SDI,
我在保存视图区的内容为图片时,
下拉的菜单也被保存在了图片中,
请问怎么解决?

解决方案 »

  1.   

    参考一下下面这段将视图内容导出为bmp图像的代码: 
    void CGraphSoftView::OnFileExport() 

    // TODO: Add your command handler code here 
    CClientDC dc(this); 
    CDC memDC; 
    CRect rect; 
    GetClientRect(rect); memDC.CreateCompatibleDC(&dc); 
    CBitmap bm; 
    int Width = rect.Width(); 
    int Height = rect.Height(); 
    bm.CreateCompatibleBitmap(&dc, Width, Height); 
    CBitmap*  pOld = memDC.SelectObject(&bm); 
    memDC.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY); 
    memDC.SelectObject(pOld); 
    BITMAP  btm; 
    bm.GetBitmap(&btm); 
    DWORD  size = btm.bmWidthBytes * btm.bmHeight; 
    LPSTR lpData = (LPSTR)GlobalAllocPtr(GPTR, size); BITMAPFILEHEADER  bfh; 
    ///////////////////////////////////////////// 
    BITMAPINFOHEADER  bih; 
    bih.biBitCount = btm.bmBitsPixel; 
    bih.biClrImportant = 0; 
    bih.biClrUsed = 0; 
    bih.biCompression = 0; 
    bih.biHeight = btm.bmHeight; 
    bih.biPlanes = 1; 
    bih.biSize = sizeof(BITMAPINFOHEADER); 
    bih.biSizeImage = size; 
    bih.biWidth = btm.bmWidth; 
    bih.biXPelsPerMeter = 0; 
    bih.biYPelsPerMeter = 0; 
    GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); 
    bfh.bfReserved1 = bfh.bfReserved2 = 0; 
    bfh.bfType = ((WORD)('M' < < 8)|'B'); 
    bfh.bfSize = 54 + size; 
    bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.lld|*.lld|*.*|*.*|")); 
    if (dlg.DoModal()==IDOK) 

    if(dlg.GetFileExt()=="bmp"){ 
    CFile  bf; 
    CString ss=dlg.GetPathName(); 
    if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite)) 

    bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER)); 
    bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER)); 
    bf.WriteHuge(lpData, size); 
    bf.Close(); 
    CString str; 
    str.LoadString(IDS_STRING_SAVE_SUCCESS); 
    AfxMessageBox(str); 

    }else if(dlg.GetFileExt()=="lld"){ 
    FILE *OutStream; 
    OutStream = fopen(dlg.GetPathName(), "w" ); 
    GetDocument()->ExPort(OutStream); fclose(OutStream); 


    GlobalFreePtr(lpData); 
    }
      

  2.   

    问题就是这一句
    bm.CreateCompatibleBitmap(&dc, Width, Height); 
    由于下拉菜单挡住了视图区内容,下拉菜单还没有消失,
    就被保存到了位图中,
      

  3.   

    你可以点菜单之后set一个timer,然后在timer中延时100ms,在timer事件中kill timer,并执行保存时间。