vc++6.0编译出现 error C2065: 'm_StaNumber' : undeclared identifier

还有出现error C2228: left of '.SetWindowTextA' must have class/struct/union type错误
代码段
void CServerSocket::updateinfo()
{
CString strTemp;
strTemp.Format("在线人数:%d",m_Clients.GetSize());
m_StaNumber.SetWindowText(strTemp);

}
m_StaNumber是对话框静态文本框变量名。。。是要申明么还是怎么样改 求指点

第1个回答  推荐于2016-07-02
在m_StaNumber所在对话框的实现类中,找到DoDataExchange(CDataExchange* pDX)函数,修改为
void CXXXDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC1, m_StaNumber);
}
IDC_STATIC1是你的静态文本框ID,不能是默认的IDC_STATIC追问

是的啊 我这段程序就是和你一样的啊 可还是出上面的错

追答

我是这样猜想的,你的程序有两个类和此问题相关,一个是CServerSocket和一个包含IDC_STATIC1静态文本框资源的对话框类,这里假设为CServerDlg。
那么代码应该这样写:
在CServerDlg中声明成员变量
CStatic m_StaNumber;
并修改DoDataExchange函数是该变量和对话框资源中的IDC_STATIC1相关联
void CServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC1, m_StaNumber);
}
此时CServerSocket类中应该包含一个CServerDlg的对象作为成员变量,比如:
CServerDlg m_dlgServer;
那么updateinfo方法应该这样写:
void CServerSocket::updateinfo()
{
CString strTemp;
strTemp.Format("在线人数:%d",m_Clients.GetSize());
m_dlgServer.m_StaNumber.SetWindowText(strTemp);
}

最后,确保你的CServerDlg类对应的对话框资源是包含IDC_STATIC1文本框资源的正确对话框。
就是那个在CServerDlg类头文件中类似enum { IDD = IDD_DIALOG_SERVER };的代码,那个IDD_DIALOG_SERVER必须是包含IDC_STATIC1的那个对话框。

有时资源的修改需要清除一下工程文件中的临时文件,再重新编译才会生效。

追问

CXXXDlgOjb也要定义? 我把m_StaNumber直接改成了IDC_STATIC_NUMBER.SetWindowText(strTemp);然后编译出现了
error C2228: left of '.SetWindowTextA' must have class/struct/union type这一个错误

追答

从你的截图来看,你的对话框类名字应该是CChatServerDlg,他有一个名为m_StaNumber的成员变量是和IDC_STATIC1关联的。这些都没问题。

有问题的地方是,类是不能够直接使用的。你这里定义CChatServerDlg,只是告诉系统你有一类对话框是这个样子的,你可以根据这个样子生成很多个具体的对象。而每一个对象中都有一个资源号为IDC_STATIC_NUMBER的静态文本框。

试想,如果你有很多个这样的对话框对象,接着调用了IDC_STATIC_NUMBER.SetWindowText(strTemp);
那么系统怎么知道你究竟想让哪个对话框中的静态文本框显示你要的内容。
所以你应该这样调用:
1.生成一个CChatServerDlg类的对象:
CChatServerDlg objChatDlg1;
2.调用objChatDlg1对话框对象中m_StaNumber静态框对象的SetWindowText方法来显示你要显示的内容:
objChatDlg1.m_StaNumber.SetWindowText("内容1");
如果你还有另一个对象objChatDlg2
CChatServerDlg objChatDlg2;
那么你同样可以用下面代码让objChatDlg2中的静态文本框你要显示内容
objChatDlg2.m_StaNumber.SetWindowText("内容2");

但是你现在的疑问是,你要让另一个类(CServerSocket)所生成的对象在执行(updateinfo())方法时完成以上工作。还需要做些什么呢?同样你要告诉系统你究竟要让哪个对话框对象的静态文本框来显示你要的内容。
这里一种简单的做法是让这个CChatServerDlg对话框类的对象作为CServerSocket类的一个成员变量,就是在ServerSocket.h文件中加入
#import "ChatServerDlg.h"
并在CServerSocket类的定义中加入
class CServerSocket
{
...
public:
CChatServerDlg m_objChatDlg;
...
};
最后是ServerSocket.cpp文件的updateinfo方法写为
void CServerSocket::updateinfo()
{
CString strTemp;
strTemp.Format("在线人数:%d",m_Clients.GetSize());
m_objChatDlg.m_StaNumber.SetWindowText(strTemp);
}

本回答被提问者采纳
第2个回答  2012-04-09
选中静态文本框,把ID修改一下,随便改成什么 都行,只要别是默认的那个,然后右键,给控件关联一个变量,变量类型选择CStatic,名称m_StaNumber,这样就可以了。追问

已经在classwizard中设置了关联变量了。。。。。

追答

要选择那个带Dlg的类然后关联变量 ,如果类选错了,也是没用的。

第3个回答  2012-04-10
你要把对话框静态文本框变量名添加到对话框类里,然后在对话框类中调用 m_StaNumber.SetWindowText(strTemp);可以通过获取你对话框指针的方法调用
用SetDlgItemText更有效更简单:
pDlg->SetDlgItemText(IDC_STATIC1,strTemp);//IDC_STATIC1是你的静态文本框ID,pDlg为对话框指针
相似回答