怎样在一个对话框里显示一个位图?
位图要是某个路经下文件而不是作为图标资源。

解决方案 »

  1.   

    CClientDC dc(this);
    CDC *cdc1;
    cdc1=new CDC;//定义一暂存DC
    CBitmap *bmp1;
    bmp1=new CBitmap;//位图对象
    cdc1->CreateCompatibleDC(&dc);//将cdc转化为与dc兼容的DC
    bmp1->m_hObject=(HBITMAP)::LoadImage(NULL,".\\res\\icon.bmp",IMAGE_BITMAP,100,100,LR_LOADFROMFILE);//.\\res\\icon.bmp表示文件路径名,100,100分别表示这个图片的宽和高
    cdc1->SelectObject(bmp1);//将位图放在暂存dc中
    dc.BitBlt(30,30,100,100,cdc1,0,0,SRCCOPY);//将放在暂存DC中的位图贴于界面上,其中两个30表示贴图的左上角x,y坐标,100,100表示位图贴到目的地的宽和高,后面的0,0表示从位图的左上角x,y坐标开始贴
    delete cdc1;
    delete bmp1;
      

  2.   

    HBITMAP hBmp = ::LoadBitmap(::AfxGetInstanceHandle(), "文件名");//加载图象
    HDC hDC = ::GetDC(your hWnd);//显示图像的窗口HWND.这里是你的对话框句柄
    HDC hMemDC = ::CreateCompatibleDC(hDC);//内存中建立绘画句柄
    HBITMAP hBmpOld = (HBITMAP)::SelectObject(hMemDC, hBmp);//关联
    ...................................
    你的操作
    ...................................
    ::BitBlt(hDC, 0, 0, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY);
    //可以是StretchBlt以便改变显示大小
    ::SelectObject(hMemDC, hBmpOld);
    ::DeleteObject(hBmp);::DeleteObject(hMemDC);
    ::ReleaseDC(your hWnd, hDC);//显示后处理
      

  3.   


    void LoadPictureFile(LPCTSTR szFile, CBitmap* pBitmap, CSize& mSize)
    {
    // open file
    HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    _ASSERTE(INVALID_HANDLE_VALUE != hFile); // get file size
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    _ASSERTE(-1 != dwFileSize); LPVOID pvData = NULL;
    // alloc memory based on file size
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    _ASSERTE(NULL != hGlobal); pvData = GlobalLock(hGlobal);
    _ASSERTE(NULL != pvData); DWORD dwBytesRead = 0;
    // read file and store in global memory
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    _ASSERTE(FALSE != bRead);
    GlobalUnlock(hGlobal);
    CloseHandle(hFile); LPSTREAM pstm = NULL;
    // create IStream* from global memory
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    _ASSERTE(SUCCEEDED(hr) && pstm); // Create IPicture from image file
    LPPICTURE gpPicture; hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
    _ASSERTE(SUCCEEDED(hr) && gpPicture);
    pstm->Release(); OLE_HANDLE m_picHandle;
    /*
    long hmWidth, hmHeight;
    gpPicture->get_Width(&hmWidth);
    gpPicture->get_Height(&hmHeight);
    int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
    int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
    */
    gpPicture->get_Handle(&m_picHandle);
    pBitmap->DeleteObject();
    pBitmap->Attach((HGDIOBJ) m_picHandle); BITMAP bm;
    GetObject(pBitmap->m_hObject, sizeof(bm), &bm);
    mSize.cx = bm.bmWidth; //nWidth;
    mSize.cy = bm.bmHeight; //nHeight;
    }
      

  4.   

    将以下这段代码加在你的消息处理函数中就可以了!!注意bmp是一个CBitmap对象!!!
      // 设定打开文件的类型
        CString csFilter = "Chart Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
        // 设定默认扩展名
        CString scStr = "dcm";
        // 初始化CFileDialog
        CFileDialog OpenFileDialog ( TRUE, scStr, NULL, 
    OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT ,csFilter );
        
        // 打开文件对话框
        if ( OpenFileDialog.DoModal () == IDOK )
        {
    HBITMAP m_hBitmap=(HBITMAP)::LoadImage(NULL,OpenFileDialog.GetFileName(),
    IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

    bmp.Attach(m_hBitmap); CDC *pDC=GetDC();
    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    CBitmap *pOldBitmap=MemDC.SelectObject(&bmp);
    BITMAP bm;
    bmp.GetObject(sizeof(BITMAP),&bm);
    pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldBitmap);
    bmp.Detach(); 

         }
      

  5.   

    LoadImage()就可以从文件读取啊!!
    怎么画应该不是什么困难的事情吧