Мое намерение: при нажатии кнопки появляется прицел.

Вопрос или проблема

Я написал несколько кодов, но они не работают так, как я планировал.

Прицел появляется, если я не нажимаю кнопку.

Моя цель состоит в том, чтобы при нажатии кнопки (OnBnClickedCheck1) прицел появился.

Мой код:

#include "stdafx.h"
#include "BaslerCode.h"
#include <pylon/PylonIncludes.h>
#include <iostream>
#include "resource.h"
#include "CImageEventHandler.h" 
#include  <stdio.h>
#include  <string.h>

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)
        {
        CRect rect;
        pPictureBox->GetClientRect(&rect);

        int rectWidth = rect.Width();
        int rectHeight = rect.Height();

        if (bool OnBnClickedCheck1 = true)
        {
        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);}
        }
    }
}

Пожалуйста, простите меня, если я допустил основную ошибку.

Ответ или решение

Уважаемый(ая) автор вопроса,

Спасибо за представленный код и описание проблемы. Давайте разберемся с вашей задачей, связанной с отображением прицела (crosshair) только при нажатии кнопки OnBnClickedCheck1.

В вашем текущем коде вы пытаетесь использовать условие if (bool OnBnClickedCheck1 = true) для проверки, нажата ли кнопка. Однако в этом случае вы просто создаете новую переменную OnBnClickedCheck1, а не проверяете состояние вашей кнопки. Для решения вашей задачи необходимо использовать переменную-член класса, которая будет отслеживать состояние нажатия кнопки.

Вот как можно модифицировать ваш код.

  1. Добавьте переменную-член в класс BaslerCode, чтобы отслеживать состояние кнопки.
class BaslerCode {
private:
    bool m_bShowCrosshair; // Переменная для отслеживания состояния кнопки
public:
    BaslerCode() : m_bShowCrosshair(false) {} // Инициализация переменной
    void OnBnClickedCheck1(); // Обработчик нажатия кнопки
    void OnImageGrabbed(CInstantCamera& camera, const CGrabResultPtr& grabResult);
};
  1. Реализуйте обработчик нажатия кнопки, который будет менять состояние переменной m_bShowCrosshair.
void BaslerCode::OnBnClickedCheck1() {
    m_bShowCrosshair = !m_bShowCrosshair; // Переключение состояния
}
  1. Измените условие в OnImageGrabbed, чтобы использовать переменную m_bShowCrosshair для отображения прицела.
if (m_bShowCrosshair) {
    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);
}

Теперь вы сможете управлять показом прицела путем нажатия на кнопку, а именно, при каждом нажатии состояние переменной m_bShowCrosshair будет изменяться, что будет приводить к соответственно новому отображению прицела.

Если у вас есть дополнительные вопросы или возникли сложности, не стесняйтесь задать их. Надеюсь, это решение поможет вам добиться желаемого результата.

С уважением,
[Ваше имя]

Оцените материал
Добавить комментарий

Капча загружается...