图片好放,但是图片一定要平铺,当dialog拉申的时候,图片随着dialog平铺变大。
谢谢

解决方案 »

  1.   

    在内存中根据dialog大小把图进行缩放,然后用BitBlt把内存的图COPY到屏幕上。
      

  2.   

    在dlg的OnSize函数中,用StretchBlt试试
      

  3.   


    void Draw_Picture(CDC *pDC, CRect rect, LPCTSTR pszResourceName)
    {
      ASSERT(pDC);
      ASSERT(!rect.IsRectNull());
      
      CBitmap bitmap;
      if(bitmap.LoadBitmap(pszResourceName))//加载图片成功
      {
        BITMAP  BitMapHead; 
        bitmap.GetBitmap(&BitMapHead); //获取图片信息    CDC memDC;
        memDC.CreateCompatibleDC(pDC); //创建兼容内存DC
        CBitmap *pBitmap = memDC.SelectObject(&bitmap); //将位图选入设备    //绘图
        pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),
          &memDC,
          0,0,BitMapHead.bmWidth,BitMapHead.bmHeight,
          SRCCOPY);    //恢复和释放内存设备
        memDC.SelectObject(pBitmap);
        memDC.DeleteDC();    //释放位图
        bitmap.DeleteObject();
      }
    }加入 LOGO 图片 ID命名为IDB_BITMAP_LOGO 
    OnPaint()中加入 
        CDC *pDrawDC = GetDC();
        CRect rect;
        GetClientRect(&rect);
        Draw_Picture(pDrawDC,rect, MAKEINTRESOURCE(IDB_BITMAP_LOGO) ); 
      

  4.   

    用StretchDIBits试试
    这里有个例子
    // TODO: Add your command handler code here 
    BOOL               bSuccess ; 
    DWORD              dwFileSize, dwHighSize, dwBytesRead ; 
    HANDLE             hFile ; 
    BITMAPFILEHEADER * pbmfh ; 
    BITMAPINFO       * pbmi ; 
    BYTE             * pBits ; 
    int                cxDib, cyDib ; CString pstrFileName="c:\\mypic.bmp"; hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL, 
    OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ; if (hFile == INVALID_HANDLE_VALUE) 
    return ; dwFileSize = GetFileSize (hFile, &dwHighSize) ; if (dwHighSize) 

    CloseHandle (hFile) ; 
    return ; 
    } pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ; 
    if (!pbmfh) 

    CloseHandle (hFile) ; 
    return ; 
    } bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ; 
    CloseHandle (hFile) ; 
    if (!bSuccess || (dwBytesRead != dwFileSize)          
    || (pbmfh->bfType != * (WORD *) "BM")  
    || (pbmfh->bfSize != dwFileSize)) 

    free (pbmfh) ; 
    return  ; 

    this->Invalidate(); if (pbmfh == NULL) 

    MessageBox (TEXT ("Cannot load DIB file"),  
    "ShowDIB", MB_ICONEXCLAMATION | MB_OK) ; 
    return ; 

    // 取得位图信息结构体的指针和位图数据数组的指针 pbmi  = (BITMAPINFO *) (pbmfh + 1) ; 
    pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ; // Get the DIB width and height if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) 

    cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ; 
    cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ; 

    else 

    cxDib =      pbmi->bmiHeader.biWidth ; 
    cyDib = abs (pbmi->bmiHeader.biHeight) ; 
    } PAINTSTRUCT               ps ; 
    HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ; CRect winrect; 
    this->GetClientRect(&winrect); 
    StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(),  
    0, 0, cxDib, cyDib, 
    pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ; 
    ::EndPaint (this->GetSafeHwnd(), &ps) ; 
      

  5.   

    怎么个不行法?
    我这边好用的阿如果要拖动改变 Dialog 大小,对话框属性风格中Border选择Resizing
    映射 WM_SIZE 消息
    在 OnSize(UINT nType, int cx, int cy) 中添加
    Invalidate();
      

  6.   

    //vc6测试通过
    void CTestResizeDlg::OnPaint() 
    {
        //////////////////////////////////////////////////////////////////////////

        //贴图
        CPaintDC  dc(this) ;
        CDC       dcmem    ; 
        CBitmap   bitmap   ;
        BITMAP    bmbitmap ;
        CRect     rcclient ;

        GetClientRect(&rcclient) ;
        bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1)) ;
        bitmap.GetBitmap(&bmbitmap);
        dcmem.CreateCompatibleDC(&dc) ;
        dcmem.SelectObject(&bitmap) ;

        dc.StretchBlt(0,0,rcclient.right,rcclient.bottom, &dcmem, 0,0,bmbitmap.bmWidth,bmbitmap.bmHeight,SRCCOPY) ;
        CDialog::OnPaint() ;    //////////////////////////////////////////////////////////////////////////
    }void CTestResizeDlg::OnSize(UINT nType, int cx, int cy) 
    {
        CDialog::OnSize(nType, cx, cy);

        // TODO: Add your message handler code here
        Invalidate();
    }
    //只是有点闪
      

  7.   

    在WM_SIZE里面做StretchBl的动作就可以了,
      

  8.   

    究竟是要 平铺 还是要 拉伸 ?拉伸的话直接在OnPaint()里面做就行了。OnSize是多余的。
    闪的话,把OnEraseBkground()函数屏蔽掉就OK了。
      

  9.   

    在onerasebkgnd事件中使用StretchBlt来画图就可以了,onsize有时候不好用.......