You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击OnBnClickedCheck1按钮显示十字线功能异常求助

问题排查与修复

核心错误

你代码里的if (bool OnBnClickedCheck1 = true)是局部变量赋值操作,不是状态判断——这行代码会创建一个局部布尔变量并直接设为true,导致这个条件永远成立,所以每次图像抓取时都会绘制十字线,和按钮点击完全无关。

修复步骤

  1. 添加类成员变量记录状态
    在BaslerCode类的头文件中添加一个布尔成员变量,用来标记是否显示十字线:
class BaslerCode {
    // ... 其他成员 ...
private:
    bool m_bShowCrosshair = false; // 默认不显示十字线
};
  1. 处理按钮点击事件
    实现OnBnClickedCheck1按钮的点击回调,切换十字线的显示状态:
void BaslerCode::OnBnClickedCheck1()
{
    m_bShowCrosshair = !m_bShowCrosshair;
    // 可选:触发图像控件重绘,立即更新显示
    CWnd* pPictureBox = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_PICTUREBOX);
    if (pPictureBox)
    {
        pPictureBox->Invalidate();
    }
}
  1. 修正图像抓取函数中的判断逻辑
    把OnImageGrabbed里的错误判断替换为对成员变量的检查,同时修正DC的获取问题(你原代码里直接用dc但没正确获取上下文):
void BaslerCode::OnImageGrabbed(CInstantCamera& camera, const CGrabResultPtr& grabResult)
{
    ptrGrabResult = grabResult;

    if (ptrGrabResult->GrabSucceeded())
    { 
        int Width = ptrGrabResult->GetWidth();
        int Height = ptrGrabResult->GetHeight();
    
        pBitmapInfo->bmiHeader.biWidth = Width;
        pBitmapInfo->bmiHeader.biHeight = -Height;

        SetStretchBltMode(m_pDC->GetSafeHdc(), HALFTONE);
        StretchDIBits(m_pDC->GetSafeHdc(), 0, 0, m_rectWidth, m_rectHeight, 0, 0, Width, Height, ptrGrabResult->GetBuffer(), pBitmapInfo, DIB_RGB_COLORS, SRCCOPY);

        CWnd* pPictureBox = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_PICTUREBOX);
        if (pPictureBox && m_bShowCrosshair) // 这里判断成员变量
        {
            CRect rect;
            pPictureBox->GetClientRect(&rect);
            int rectWidth = rect.Width();
            int rectHeight = rect.Height();

            CDC* dc = pPictureBox->GetDC(); // 正确获取控件的DC
            if (dc)
            {
                CPen whitePen(PS_SOLID, 1, RGB(255, 255, 255)); 
                CPen* pOldPen = dc->SelectObject(&whitePen); 

                dc->MoveTo(0, rectHeight / 2); 
                dc->LineTo(rectWidth, rectHeight / 2);

                dc->MoveTo(rectWidth / 2, 0); 
                dc->LineTo(rectWidth / 2, rectHeight);

                dc->SelectObject(pOldPen);
                pPictureBox->ReleaseDC(dc); // 释放DC
            }
        }
    }
}

额外说明

  • 确保OnBnClickedCheck1函数已经正确绑定到按钮的点击事件(在资源编辑器里设置按钮的消息映射)。
  • 如果你是在对话框类中处理,也可以直接用GetDlgItem(IDC_PICTUREBOX)而不是通过AfxGetApp()->GetMainWnd(),更简洁。

内容的提问来源于stack exchange,提问作者Sanghyeon Woo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:59:55