点击OnBnClickedCheck1按钮显示十字线功能异常求助
问题排查与修复
核心错误
你代码里的if (bool OnBnClickedCheck1 = true)是局部变量赋值操作,不是状态判断——这行代码会创建一个局部布尔变量并直接设为true,导致这个条件永远成立,所以每次图像抓取时都会绘制十字线,和按钮点击完全无关。
修复步骤
- 添加类成员变量记录状态
在BaslerCode类的头文件中添加一个布尔成员变量,用来标记是否显示十字线:
class BaslerCode { // ... 其他成员 ... private: bool m_bShowCrosshair = false; // 默认不显示十字线 };
- 处理按钮点击事件
实现OnBnClickedCheck1按钮的点击回调,切换十字线的显示状态:
void BaslerCode::OnBnClickedCheck1() { m_bShowCrosshair = !m_bShowCrosshair; // 可选:触发图像控件重绘,立即更新显示 CWnd* pPictureBox = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_PICTUREBOX); if (pPictureBox) { pPictureBox->Invalidate(); } }
- 修正图像抓取函数中的判断逻辑
把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
相关产品推荐
相关产品推荐

