请教各位朋友,MFC的对话框中如何显示Access种的图片,本人没大接触过MFC,请详细说明,或者有代码。谢谢!!

解决方案 »

  1.   

    简化处理:
    1.将 access中的数据写入本地临时文件。
    2.将刚写成的临时文件显示在对话框上。相信这两步LZ都会做了吧?
      

  2.   

    access写成文件://CByteArray m_FivePhoto;
    CFile WriteFile;
    WriteFile.Open(lpszFile,CFile::modeWrite|CFile::modeCreate);
    WriteFile.Write(m_FivePhoto.GetData(),m_FivePhoto.GetSize());
    WriteFile.Close();
      

  3.   

    显示:
    CBitmap hbmp; 
    HBITMAP hbitmap; 
    //将pStatic指向要显示的地方 
    CStatic *pStaic; 
    pStaic=(CStatic*)GetDlgItem(IDC_PHOTO); 
    //装载资源 0.bmp 
    hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),lpszFile,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
    hbmp.Attach(hbitmap); 
    //获取图片格式 
    BITMAP bm; 
    hbmp.GetBitmap(&bm); 
    CDC dcMem; 
    dcMem.CreateCompatibleDC(GetDC()); 
    CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp); 
    CRect lRect; 
    pStaic->GetClientRect(&lRect); 
    //显示位图 
    pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(),&dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
    dcMem.SelectObject(&poldBitmap); 
      

  4.   

    共同学习。我最近也在做MFC,不过还没有做到用图片的这一块。学习一下!
      

  5.   

    把图片存入数据库:
    void CInsertBmpDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialog::OnPaint();
    }
    if(m_hbitmap != NULL)
    {
    CDC* pDC = m_Picture.GetDC();
    CRect r;
    m_Picture.GetClientRect(&r);
    //将位图选进设备场景中
    CDC memdc;
    memdc.CreateCompatibleDC(pDC);
    memdc.SelectObject(m_hbitmap);
    BITMAP bmp;
    GetObject(m_hbitmap,sizeof(bmp),&bmp);
    pDC->StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    memdc.DeleteDC();
    }
    }
    void CInsertBmpDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CFileDialog m_dialog (true,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    "位图文件(*.bmp)|*.bmp",this);
    if(m_dialog.DoModal() == IDOK)
    {
    //取得图片的完整路径
    strText = m_dialog.GetPathName();
    m_hbitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),strText,IMAGE_BITMAP,
    0,0,LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
    if (m_hbitmap != NULL)
    {
    //在控件上绘制图片
    CDC* pDC = m_Picture.GetDC();
    CRect r;
    m_Picture.GetClientRect(&r);
    //将位图选进设备场景中
    CDC memdc;
    memdc.CreateCompatibleDC( pDC );
    memdc.SelectObject(m_hbitmap);
    BITMAP bmp;
    GetObject(m_hbitmap,sizeof(bmp),&bmp);
    pDC->StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    memdc.DeleteDC();
    }
    }
    }void CInsertBmpDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    if(m_Edit.IsEmpty())
    {
    MessageBox("基础信息不能为空.","提示");
    return;
    }
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    m_pRecordset->Open("select * from picture",m_pConnection.GetInterfacePtr(),
    adOpenDynamic,adLockOptimistic,adCmdText);
    try
    {
    m_pRecordset->AddNew();//添加新行
    VARIANT  m_bitdata;
    CFile m_file (strText,CFile::modeRead);
    DWORD m_filelen = m_file.GetLength()+1;
    char * m_bitbuffer = new char[m_filelen];
    m_file.ReadHuge(m_bitbuffer,m_filelen);
    m_file.Close();
    m_bitdata.vt = VT_ARRAY|VT_UI1;
    SAFEARRAY * m_psafe;
    SAFEARRAYBOUND m_band;
    m_band.cElements = m_filelen;
    m_band.lLbound = 0;
    m_psafe = SafeArrayCreate(VT_UI1,1,&m_band);
    for(long i=0;i < m_filelen ; i++)
    {
    SafeArrayPutElement(m_psafe,&i,m_bitbuffer++);
    }
    m_bitdata.parray = m_psafe;

    m_pRecordset->GetFields()->GetItem("编号")->Value = (_bstr_t)m_Edit;
    m_pRecordset->GetFields()->GetItem("图片")->AppendChunk(&m_bitdata);
    m_pRecordset->Update();
    }
    catch(...)
    {
    MessageBox("操作失败");
    return;
    }
    MessageBox("操作成功.");
    }
      

  6.   

    从数据库中取出显示:
    void CDistillBmpDlg::OnSelchangeCombo1() 
    {
    // TODO: Add your control notification handler code here
    OnInitADOConn();
    CString str;
    m_Combo.GetLBText(m_Combo.GetCurSel(),str);
    CString sql;
    sql.Format("select*from picture where 编号='%s'",str);
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    m_pRecordset->Open((_bstr_t)sql,m_pConnection.GetInterfacePtr(),
    adOpenDynamic,adLockOptimistic,adCmdText);
    HBITMAP m_hBitmap;
    //读取图像字段的实际大小
    long lDataSize = m_pRecordset->GetFields()->GetItem("图片")->ActualSize;
    char *m_pBuffer;  //定义缓冲变量
    if(lDataSize > 0)
    {
    //从图像字段中读取数据到varBLOB中
    _variant_t varBLOB;
    varBLOB = m_pRecordset->GetFields()->GetItem("图片")->GetChunk(lDataSize);
    if(varBLOB.vt == (VT_ARRAY | VT_UI1))
    {
    if(m_pBuffer = new char[lDataSize+1]) //分配必要的存储空间
    {
    char *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
    memcpy(m_pBuffer,pBuf,lDataSize); //复制数据到缓冲区m_pBuffer
    SafeArrayUnaccessData (varBLOB.parray);

    //将数据转换为HBITMAP格式
    LPSTR hDIB;
    LPVOID lpDIBBits;
    BITMAPFILEHEADER bmfHeader;  //用于保存BMP文件头信息,包括类型、大小、位移量等
    DWORD bmfHeaderLen;  //保存文件头的长度
    bmfHeaderLen = sizeof(bmfHeader);  //读取文件头的长度
    //将m_pBuffer中文件头复制到bmfHeader中
    strncpy((LPSTR)&bmfHeader, (LPSTR)m_pBuffer, bmfHeaderLen); 
    if (bmfHeader.bfType != (*(WORD*)"BM"))   //如果文件类型不对,则返回
    {
    MessageBox("BMP文件格式不准确");
    return;
    }
    hDIB = m_pBuffer + bmfHeaderLen;  //将指针移至文件头后面
    //读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFOHEADER对象
    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
    //读取BMP文件的图像数据,包括坐标及颜色格式等信息到BITMAPINFO对象
    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
    //根据bfOffBits属性将指针移至文件头后
    lpDIBBits = (m_pBuffer) + ((BITMAPFILEHEADER *)m_pBuffer)->bfOffBits;
    CClientDC dc(this);  //生成一个与当前窗口相关的CClientDC,用于管理输出设置
    //生成DIBitmap数据
    m_hBitmap = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
    }
    }
    }
    ExitConnect();
    if(m_hBitmap != NULL)
    {
    CDC* pDC = m_Picture.GetDC();
    CRect r;
    m_Picture.GetClientRect(&r);
    //将位图选进设备场景中
    CDC memdc;
    memdc.CreateCompatibleDC( pDC );
    memdc.SelectObject(m_hBitmap);
    BITMAP bmp;
    GetObject(m_hBitmap,sizeof(bmp),&bmp);
    pDC->StretchBlt(r.left,r.top,r.Width(),r.Height(),&memdc,0,0,
    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    memdc.DeleteDC();
    }
    }
      

  7.   

    不管删除哪一项,只要恰好删除这一项使滚动条消失,而此时滚动条又不在最顶端的话,就会出现一空白行,
    大家有没有遇到过?大家可以随便找个listctrl试下,上面的代码
    listctrl是用drawitem自绘方式
      

  8.   

    请问有谁知道怎么在picture里面动态的更新图片啊?
    是否有此方面例子,有的话请发到[email protected]里面。不甚感谢