Visual c++ MFC:控件的成员变量与资源id

Visual c++ MFC:控件的成员变量与资源id,visual-c++,mfc,Visual C++,Mfc,我是vc++新手。我想知道通过使用控件的成员变量或资源id来处理控件的哪种方法是正确和有效的 m_Name.SetWindowTextW(_T("xyz")); or SetDlgItemText(IDC_EDIT2,_T("xyz")); or CWnd* cwd = GetDlgItem(IDC_EDIT2); cwd->SetWindowTextW(_T("xyz")); 有效的方法是创建一个控制成员变量。您可以在资源编辑器中通过右键单击控件并选择Add Variable

我是vc++新手。我想知道通过使用控件的成员变量或资源id来处理控件的哪种方法是正确和有效的

m_Name.SetWindowTextW(_T("xyz"));
or 
SetDlgItemText(IDC_EDIT2,_T("xyz"));
or 
CWnd* cwd =    GetDlgItem(IDC_EDIT2);
cwd->SetWindowTextW(_T("xyz"));

有效的方法是创建一个控制成员变量。您可以在资源编辑器中通过右键单击控件并选择Add Variable来执行此操作


每次使用带有资源ID的GetDlgItem时,它都会迭代所有子控件,以找到具有指定ID的子控件。每次调用GetDlgItem时,此迭代都是低效的。

您应该关心的是,从长远来看,哪些控件更易于维护,而不是效率,除非您确实具有性能瓶颈在SetWindowText()操作中可能不需要担心这一点

你必须问这样的问题

1) 要设置多少次窗口文本?一次还是多次?如果有一次,您可能只需要使用SetDlgItemText()


2) 除了设置文本之外,您还要做其他操作吗?如果是这样,那么可能将其作为成员变量。如果不是,那么将其作为成员变量和窗口子类化有什么意义?为了节省用户永远不会注意到的毫秒数?

我很好奇,所以我研究了MFC代码(winocc.cpp)。我似乎看不到它在所有子窗口中迭代的位置。这在嵌套的API调用中发生吗?是的,它必须在API调用中发生。而且,当您创建一个成员变量时,它也必须这样做——只有一次。@JoeWillcoxson您能给我指一些说明这一点的文档吗?我的印象是MFC为此维护了一个窗口句柄的内部表(映射)。MFC确实有一个窗口句柄的内部映射。但是,在对话框中,可以使用DDX_control()宏将控件成员变量附加到对话框上的控件。DDX_Control()宏的一个参数是对话框项ID。在内部,它最终调用Windows API函数GetDlgItem(),该函数返回具有请求ID的窗口的HWND。为此,API函数必须枚举子窗口并返回首先匹配控件ID的窗口的HWND。然后,MFC的粘合子类并将HWND附加到CWnd控件。