灰灰灰彦 2024-07-23 17:05 采纳率: 18.8%
浏览 5

vc6如何显示保存在内存中的位图

通过动态曲线的循环绘制,在绘制结束时将实时的曲线图复制到内存位图上,部分代码如下所述:

    // 获取视图的设备上下文
            CDC* pDC = pDlg->GetDC();
            // 创建与当前设备上下文兼容的内存设备上下文
            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;
//继续绘制...

 // 清理
           pDlg->m_dcMemory.SelectObject(pOldBitmap);
                 pDlg->m_bitmap.DeleteObject();
                //将视图区域绘制到位图上
                BitBlt(pDlg->m_dcMemory, 610, 105, 600, 600, dc, 0, 0, SRCCOPY);
    }
            //删除内存设备上下文
            DeleteDC(pDlg->m_dcMemory);
                

需要实现点击暂停按钮时,将保存在内存位图中的曲线图呈现出来,并保证曲线图可以随着绘制的循环而实时更新。该如何去写?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-23 17:05
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    要在Visual C++ 6.0(VC6)中实现你的需求,可以按照以下步骤进行:

    1. 创建内存设备上下文和位图:这一步已经在你提供的代码中实现了。
    2. 循环绘制曲线:在循环中绘制曲线,并在每次绘制后更新内存位图中的内容。
    3. 暂停时显示曲线图:在暂停按钮的事件处理函数中,将内存位图中的曲线图显示到界面上。
    4. 实时更新曲线图:确保每次循环绘制后都更新内存位图中的内容,并在适当时机刷新显示。

    以下是详细的代码实现:

    1. 创建内存设备上下文和位图

    // 获取视图的设备上下文
    CDC* pDC = pDlg->GetDC();
    // 创建与当前设备上下文兼容的内存设备上下文
    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. 循环绘制曲线

    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, 0, 0, SRCCOPY);
    
        // 刷新显示
        pDlg->Invalidate(TRUE);
    }
    

    3. 暂停时显示曲线图

    在暂停按钮的事件处理函数中,将内存位图中的曲线图显示到界面上:

    void CYourDialog::OnPause() {
        // 获取视图的设备上下文
        CDC* pDC = pDlg->GetDC();
    
        // 将内存位图中的内容绘制到视图上
        BitBlt(*pDC, 0, 0, rect.Width(), rect.Height(), &pDlg->m_dcMemory, 0, 0, SRCCOPY);
    
        // 释放设备上下文
        pDlg->ReleaseDC(pDC);
    }
    

    4. 实时更新曲线图

    确保每次循环绘制后都更新内存位图中的内容,并在适当时机刷新显示。这已经在循环绘制曲线的代码中实现了。

    完整代码示例

    void CYourDialog::OnDrawCurve() {
        // 获取视图的设备上下文
        CDC* pDC = pDlg->GetDC();
        // 创建与当前设备上下文兼容的内存设备上下文
        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, 0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
    
            // 刷新显示
            pDlg->Invalidate(TRUE);
        }
    
        // 清理资源
        pDlg->m_dcMemory.SelectObject(pOldBitmap);
        pDlg->m_bitmap.DeleteObject();
        DeleteDC(pDlg->m_dcMemory);
    }
    
    void CYourDialog::OnPause() {
        // 获取视图的设备上下文
        CDC* pDC = pDlg->GetDC();
    
        // 将内存位图中的内容绘制到视图上
        BitBlt(*pDC, 0, 0, rect.Width(), rect.Height(), &pDlg->m_dcMemory, 0, 0, SRCCOPY);
    
        // 释放设备上下文
        pDlg->ReleaseDC(pDC);
    }
    

    请根据你的具体需求和应用程序的架构进行适当的调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月23日

悬赏问题

  • ¥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局部变量对蓝图不可见