Почему переменная в инструменте статического текста в mfc не определена

Я создаю статический текст в диалоговом окне mfc, затем изменяю переменную этого статического текста на тип CString, а имя члена — m_process. Затем я буду использовать этот статический текст, чтобы показать процесс времени, но идентификатор не определен.

int64 tm1 = cv::getTickCount();
int64 tm2 = cv::getTickCount();
double sec = (tm2-tm1)/cv::getTickFrequency();
teks.Format(_T("%g"),sec);
m_process.SetWindowTextW(teks);

и это ошибка

Ошибка 9 ошибка C2065: 'm_process': необъявленный идентификатор d:\kuliah\smt 8\bismillah ta\bismillah_dialog\bismillah_dialog\bismillah_dialogdlg.cpp 391 1 Bismillah_Dialog

Ошибка 4 ошибка C2228: слева от '.SetWindowTextW' должен быть класс/структура/объединение d:\kuliah\smt 8\bismillah ta\bismillah_dialog\bismillah_dialog\bismillah_dialogdlg.cpp 268 1 Bismillah_Dialog

это объявление этого статического текста. в Dlg.cpp

CBismillah_DialogDlg::CBismillah_DialogDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CBismillah_DialogDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    modeTampil = 0;
    openProcess = 0;
    modeAuto = 0;
    m_area = _T("");
    m_process = _T("");
}

void CBismillah_DialogDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    //  DDX_Control(pDX, IDC_EDIT1, m_area);
    //  DDX_Control(pDX, IDC_EDIT2, m_process);
    DDX_Control(pDX, IDC_BUTTON2, m_play);
    DDX_Control(pDX, IDC_BUTTON1, m_open);
    //  DDX_Control(pDX, ID_STATIC, m_pic);
    DDX_Control(pDX, ID_STATIC, m_pic);
    DDX_Control(pDX, IDC_MFCEDITBROWSE1, m_name);
    //  DDX_Control(pDX, IDC_EDIT3, m_coba);
    //  DDX_Control(pDX, IDC_EDIT1, m_area);
    DDX_Text(pDX, IDC_EDIT1, m_area);
    DDX_Text(pDX, IDC_EDIT2, m_process);
}

и в заголовочном файле.

public:
CWinThread* thread;

afx_msg void OnEnChangeMfceditbrowse1();
int modeTampil;
int openProcess;
int modeAuto;
static DWORD ThreadPro(LPVOID *x);
afx_msg void threadProcess();


//  CStatic m_area;
//  CStatic m_process;
    CButton m_play;
    CButton m_open;
//  CStatic m_pic;
    CStatic m_pic;
    afx_msg void OnBnClickedButton1();
    CMFCEditBrowseCtrl m_name;
//  CEdit m_coba;
//  CStatic m_area;
    CString m_area;
    CString m_process;
};

Система уже объявила статический текст, но он не обнаруживается при сборке этой программы. Я не знаю, как это решить. Я очень запутался и новичок в этом МФЦ. Мне очень очень нужна помощь. Спасибо :))


person Shabrina Arin    schedule 13.08.2017    source источник
comment
Пожалуйста, покажите нам строки кода, которые сообщают об ошибке...   -  person xMRi    schedule 14.08.2017
comment
Вы пытаетесь использовать m_process вне класса диалога. Вы можете получить к нему доступ только из функции-члена класса CBismillah_DialogDlg.   -  person acraig5075    schedule 15.08.2017
comment
@ acraig5075 acraig5075 Я думаю, вы сделали предположение. В любом случае, оригинальный плакат не дал никаких ответов с разъяснениями.   -  person Andrew Truckle    schedule 15.08.2017
comment
@AndrewTruckle Да, согласен. Но это соответствует ошибкам необъявленный идентификатор и слева от must have class/struct/union. Если, как вы ответили, OP попытался вызвать SetWindowTextW для переменной CString, я бы скорее ожидал, что SetWindowTextW не является членом CString.   -  person acraig5075    schedule 15.08.2017
comment
@ acraig5075 Справедливое замечание.   -  person Andrew Truckle    schedule 15.08.2017


Ответы (1)


Учитывая предоставленный вами код, элемент управления пользовательского интерфейса сопоставляется с CString, а не с CEdit.

Поэтому вы не можете использовать SetWindowTextW, поскольку CString не является объектом управления.

В вашем можно просто использовать:

m_process.Format(_T("%g"),sec);
UpdateData(FALSE);

Я не говорю, что это самый эффективный способ. Но это работает с вашим указанным кодом. Существуют и другие способы передачи управляющего содержимого в переменные (например: SetDlgItemText), но я делаю это так. Без сомнения, есть еще больше методов.

person Andrew Truckle    schedule 14.08.2017
comment
Я не согласен с этим. В зависимости от того, что вы делаете, гораздо проще и быстрее установить данные напрямую. Предположим, у вас есть 50 элементов управления. Почему я должен передавать данные из 50 элементов управления в пользовательский интерфейс, также в этом случае вы должны сначала перенести данные из пользовательского интерфейса во внутреннюю память, иначе вы переопределяете данные, которые пользователь только что вводит. - person xMRi; 15.08.2017
comment
Вы не должны делать это так, как я сказал. Я четко заявляю, что это один из способов, и мой путь. Я также напрямую включаю вторичный способ. В любом случае, я ответил на его вопрос. Он использует CString и не может использовать с ним SetWindowTextW. Я считаю ваш голос против несправедливым. Если бы мой ответ был догматическим, я бы принял его по подбородку. Но это не догма. - person Andrew Truckle; 15.08.2017