在MFC的按钮响应函数中定义一个类,类中要用到GetDlgItem,提示“非静态成员应用必须与特定对象相符”

bollenzhang 2017-06-04 07:00:27
一个MFC界面,点击按钮调用一个识别引擎,识别引擎会不断返回结果,要把结果显示在编辑框中。现在要加入观察者模式实现,当我在按钮的响应函数中定义具体观察者的update函数时要用到GetDlgItem( IDC_STATIC2)->SetWindowText(em);函数,用来在通知者的状态发生改变时,将结果em显示到编辑框中。但是GetDlgItem提示“非静态成员应用必须与特定对象相符”。本人新手,不知怎么解决,求高手解答。
...全文
363 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-06-05
  • 打赏
  • 举报
回复
void CViewDialog::OnBnClickedButton1() 要把 this (对话框对象)传给 Observer Observer 的 构造函数(ctors)加个变量 Observer(string name, Subject *sub,HWND hDlg) { name = name; sub = sub; hdlg=hDlg; }
zgl7903 2017-06-05
  • 打赏
  • 举报
回复
改造一下,从对话框调用时 xx.update(m_hWnd)
void update(HWND hDlg)
{
  //cout << name << " 收到消息:" << sub->action << endl;
  if (sub->action == true)
    SetDlgItemText(hDlg, IDC_STATIC2, em);
}
sichuanwww 2017-06-05
  • 打赏
  • 举报
回复
bollenzhang 2017-06-04
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
“非静态成员应用必须与特定对象相符” 意思就是这个函数(GetDlgItem)必须要有对象 (对话框对象)。因为这个函数是“非静态'成员
这里面没有牵扯到对话框的具体对象,只是在定义对话框这个类的成员函数void CViewDialog::OnBnClickedButton1(),在定义这个按钮响应函数的时候,用到了观察者模式,然后定义具体观察者的update函数时要用到GetDlgItem( IDC_STATIC2)->SetWindowText(em);函数,出现这种错误的
bollenzhang 2017-06-04
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
“非静态成员应用必须与特定对象相符” 意思就是这个函数(GetDlgItem)必须要有对象 (对话框对象)。因为这个函数是“非静态'成员
具体怎么写呢?新手真的有些懵
bollenzhang 2017-06-04
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
GetDlgItem( IDC_STATIC2) HWND GetDlgItem( HWND hDlg, // handle of dialog box int nIDDlgItem // identifier of control ); 要指定 对话框
如何获得对话框的handle呢
schlafenhamster 2017-06-04
  • 打赏
  • 举报
回复
“非静态成员应用必须与特定对象相符” 意思就是这个函数(GetDlgItem)必须要有对象 (对话框对象)。因为这个函数是“非静态'成员
schlafenhamster 2017-06-04
  • 打赏
  • 举报
回复
GetDlgItem( IDC_STATIC2) HWND GetDlgItem( HWND hDlg, // handle of dialog box int nIDDlgItem // identifier of control ); 要指定 对话框
bollenzhang 2017-06-04
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////定义观察者模式
	class Observer;
	//抽象通知者
	class Subject
	{
	protected:
		list<Observer*> observers;
	public:
		int action;                                   //定义状态的数据类型
		virtual void attach(Observer*) = 0;
		virtual void detach(Observer*) = 0;
		virtual void notify() = 0;
	};
	//具体通知者,秘书
	class Secretary :public Subject
	{
		void attach(Observer *observer)
		{
			observers.push_back(observer);
		}
		void detach(Observer *observer)
		{
			list<Observer *>::iterator iter = observers.begin();
			while (iter != observers.end())
			{
				if ((*iter) == observer)
				{
					observers.erase(iter);
				}
				++iter;
			}
		}
		void notify()
		{
			list<Observer *>::iterator iter = observers.begin();
			while (iter != observers.end())
			{
				(*iter)->update();
				++iter;
			}
		}
	};

	//抽象观察者
	class Observer
	{
	protected:
		string name;
		Subject *sub;
	public:
		Observer(string name, Subject *sub)
		{
			this->name = name;
			this->sub = sub;
		}
		virtual void update() = 0;
	};
	//具体的观察者,显示器
	class DisplayObserver :public Observer
	{
	public:
		DisplayObserver(string name, Subject *sub) :Observer(name, sub)
		{
		}
		void update()
			//void DisplayObserver::update()
		{
			//cout << name << " 收到消息:" << sub->action << endl;
			if (sub->action == true)
				GetDlgItem( IDC_STATIC2)->SetWindowText(em);
		}

	};

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧