灰灰灰彦 2024-07-24 09:53 采纳率: 18.8%
浏览 0
已结题

vc6 使用bitbit遇到的问题

使用BITBIT复制位图内容到视图区域后,什么也没有显示出来?不清楚是哪里的问题

public:
    CBitmap m_bitmap; // 位图对象
    CDC m_dcMemory;   // 内存设备上下文

    // 获取视图的设备上下文
            CDC pDC;
            // 创建与当前设备上下文兼容的内存设备上下文
            pDlg->m_dcMemory.CreateCompatibleDC(&pDC);
            // 创建与当前设备上下文兼容的位图
            CRect rect;
            pDlg->GetDlgItem(IDC_WAVEDRAW)->GetWindowRect(&rect);
            pDlg->ScreenToClient(&rect);
            pDlg->m_bitmap.CreateCompatibleBitmap(&pDC, rect.Width(), rect.Height());
            // 将位图选入内存设备上下文
            CBitmap* pOldBitmap = pDlg->m_dcMemory.SelectObject(&(pDlg->m_bitmap));

    for (int i =0 ;i < num; i++)
            {
                dc.SetViewportOrg(610,180);
                dc.MoveTo(0,0);
                // 创建一个点数组来存储所有点
                CPoint* points = new CPoint[200];
                for(int j = 0; j < 200; j++) 
                {
                   points[j] = CPoint(j, -(pDoc->CAL[j] - 128));
                }
                // 使用Polyline一次性绘制所有点
                dc.Polyline(points, 200);
                // 释放内存
                delete[] points;
    //将视图区域绘制到位图上
                BitBlt(pDlg->m_dcMemory, 610, 105, 600, 600, pDC, 0, 0, SRCCOPY);
                //将位图绘制到视图区域
                BitBlt(pDC,600,0,600,600,(pDlg->m_dcMemory),0,0,SRCCOPY);
    }
            //清理资源
            pDlg->m_dcMemory.SelectObject(pOldBitmap);
            pDlg->m_bitmap.DeleteObject();
            DeleteDC(pDlg->m_dcMemory);

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-07-24 09:56
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在使用VC6开发环境时,通过BitBlt函数尝试将位图内容复制到视图区域,但结果什么也没有显示出来。我们需要详细分析代码,找出可能的问题点,并提供解决方案。

    关键问题点

    1. 设备上下文(DC)的创建和使用:确保设备上下文正确创建并与位图兼容。
    2. 位图的创建和选择:确保位图正确创建并被选择到内存设备上下文中。
    3. BitBlt函数的参数:确保BitBlt函数的参数正确,特别是目标和源的坐标及大小。

    解决方案

    1. 设备上下文的创建和使用

    确保设备上下文正确创建并与位图兼容。以下是修改后的代码片段:

    CDC pDC;
    // 获取视图的设备上下文
    pDC.Attach(pDlg->GetDC()->m_hDC);
    
    // 创建与当前设备上下文兼容的内存设备上下文
    pDlg->m_dcMemory.CreateCompatibleDC(&pDC);
    
    // 创建与当前设备上下文兼容的位图
    CRect rect;
    pDlg->GetDlgItem(IDC_WAVEDRAW)->GetWindowRect(&rect);
    pDlg->ScreenToClient(&rect);
    pDlg->m_bitmap.CreateCompatibleBitmap(&pDC, rect.Width(), rect.Height());
    
    // 将位图选入内存设备上下文
    CBitmap* pOldBitmap = pDlg->m_dcMemory.SelectObject(&(pDlg->m_bitmap));
    

    2. 位图的创建和选择

    确保位图正确创建并被选择到内存设备上下文中。上述代码已经包含了这部分内容,确保位图和内存设备上下文正确创建和选择。

    3. BitBlt函数的参数

    确保BitBlt函数的参数正确,特别是目标和源的坐标及大小。以下是修改后的代码片段:

    for (int i = 0; i < num; i++)
    {
        dc.SetViewportOrg(610, 180);
        dc.MoveTo(0, 0);
        // 创建一个点数组来存储所有点
        CPoint* points = new CPoint[200];
        for (int j = 0; j < 200; j++)
        {
            points[j] = CPoint(j, -(pDoc->CAL[j] - 128));
        }
        // 使用Polyline一次性绘制所有点
        dc.Polyline(points, 200);
        // 释放内存
        delete[] points;
    
        // 将视图区域绘制到位图上
        BitBlt(pDlg->m_dcMemory, 0, 0, rect.Width(), rect.Height(), &dc, 610, 105, SRCCOPY);
    
        // 将位图绘制到视图区域
        BitBlt(pDC, 600, 0, rect.Width(), rect.Height(), &(pDlg->m_dcMemory), 0, 0, SRCCOPY);
    }
    
    // 清理资源
    pDlg->m_dcMemory.SelectObject(pOldBitmap);
    pDlg->m_bitmap.DeleteObject();
    pDlg->m_dcMemory.DeleteDC();
    pDC.ReleaseDC();
    

    详细解释

    1. 设备上下文的创建和使用

      • pDC.Attach(pDlg->GetDC()->m_hDC);:确保获取视图的设备上下文。
      • pDlg->m_dcMemory.CreateCompatibleDC(&pDC);:创建与当前设备上下文兼容的内存设备上下文。
    2. 位图的创建和选择

      • pDlg->m_bitmap.CreateCompatibleBitmap(&pDC, rect.Width(), rect.Height());:创建与当前设备上下文兼容的位图。
      • CBitmap* pOldBitmap = pDlg->m_dcMemory.SelectObject(&(pDlg->m_bitmap));:将位图选入内存设备上下文。
    3. BitBlt函数的参数

      • BitBlt(pDlg->m_dcMemory, 0, 0, rect.Width(), rect.Height(), &dc, 610, 105, SRCCOPY);:将视图区域绘制到位图上。
      • BitBlt(pDC, 600, 0, rect.Width(), rect.Height(), &(pDlg->m_dcMemory), 0, 0, SRCCOPY);:将位图绘制到视图区域。

    总结

    通过以上修改,确保设备上下文、位图和BitBlt函数的参数正确,可以解决位图内容无法显示的问题。用户可以将修改后的代码直接粘贴使用。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月24日
  • 已采纳回答 7月24日
  • 创建了问题 7月24日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见