Совместное использование данных между одной переменной-членом и несколькими элементами управления с DoDataExchange / принудительным обновлением элементов управления во всех Windows - PullRequest
0 голосов
/ 16 июня 2011

У меня есть проект VS 2005 C ++ MFC, который содержит несколько окон на основе CDialog.Программа связывается с нестандартным оборудованием и отображает различные показания в разных окнах.Данные считываются с аппаратного обеспечения с помощью общедоступной статической функции-члена с именем ReadHardWare () класса с именем CTools.ReadHardWare () помещает данные, считанные с аппаратного обеспечения, в массив с глобальной областью действия, и каждое окно имеет возможность чтения из этого массива.В каждом окне у меня загорается индикатор, показывающий, что выполняется операция чтения с оборудования.Этот индикатор является классом управления National Instruments Measurement Studio CNiButton.CTools имеет открытую статическую переменную-член типа CNiButton с именем m_read_in_progress_status, которую я использую, чтобы определить, выполняется операция чтения (m_read_in_progress_status.Value == 1) или нет (m_read_in_progress_status.Value == 0).Моя цель состоит в том, чтобы все индикаторы чтения во всех открытых окнах показывали, что чтение выполняется или не выполняется одновременно.Я регулярно использую DoDataExchange для связи переменных с элементами управления, но всегда один на один.В этом случае я хочу, чтобы несколько элементов управления соединялись с одной переменной и автоматически обновлялись с этой переменной.

Кажется, у меня есть две проблемы:

1) Кажется, я могу одновременно иметь только один элемент управления, связанный с переменной.По-видимому, единственным элементом управления, с которым переменная делится данными, является первый экземпляр (то есть первое открытое окно)

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

Итак, мои вопросы:

1) Как я могу разрешить двум элементам управления в двух разных окнах совместно использовать одну и ту же переменную-член и обновлять сразу после изменения значения этой переменной-члена?

2) Как я могу заставить функцию-член ReadHardWare () (или какое-либо другое событие) принудительно заставить первое окно обновлять свои элементы управления, даже если это окно не активно вызывает эту функцию?

В текущем случае первое окно является родителем второго.Однако это не всегда так.

Ниже приведен отрывок из моего кода.

// Globalvariables.cpp

NI::CNiButton CTools::m_read_in_progress_status;  

// Tools.h

class CTools  
{  
public:  
    static ReadHardWare();  
public:  
    static  NI::CNiButton m_read_in_progress_status;  
}   

// Tools.cpp

CTools::ReadHardWare()  
{  
    //Declare and initialize variables and other setup code is here  

    m_read_in_progress_status.Value == 1  //Set read in progress flag high  
    //Read operations here  
    m_read_in_progress_status.Value == 0  //Reset read in progress flag low  
}    

//FirstWindow.cpp

#include "Tools.h"  
#include "SecondWindow.h"  
void CFirstWindow::DoDataExchange(CDataExchange* pDX)  
{  
    CDialog::DoDataExchange(pDX);  
    DDX_Control(pDX, IDC_First_Window_Read_in_Progress_Indicator,   CTools::m_read_in_progress_status);  
}    

// SecondWindow.cpp

#include "Tools.h"  
#include "FirstWindow.h"  
void CSecondWindow::DoDataExchange(CDataExchange* pDX)  
{  
    CDialog::DoDataExchange(pDX);  
    DDX_Control(pDX, IDC_Second_Window_Read_in_Progress_Indicator, CTools::m_read_in_progress_status);  
}  

1 Ответ

0 голосов
/ 17 июня 2011

DDX_Control устанавливает связь между идентификатором управления в диалоговом окне и конкретным экземпляром объекта на основе CWnd. Я не уверен, что это хорошая идея - использовать один и тот же объект, представляющий кнопку для двух окон. Предлагаю немного изменить дизайн. Вы должны создать таймер для объединения состояния операции чтения. Если состояние изменилось, вы обновите кнопку.

class CTools  
{  
public:  
    static void ReadHardWare();
public:  
    static int m_read_in_progress_status;  
}   

class CFirstWindow: CDialog
{
public:
    void OnTimer(UINT nIDEvent)
    {
        if(m_read_in_progress_status != CTools::m_read_in_progress_status)
        {
            m_read_in_progress_status = CTools::m_read_in_progress_status;
            m_button.SetCheck(m_read_in_progress_status);
        }
    }

private:
    int m_read_in_progress_status;  // Cached status
    NI::CNiButton m_button;
};
...