C++ 使用CAxDialogImpl中的ATL CEdit将编辑框添加到ATL对话框
我有一个关于ATL(C++)VS2010的项目。我已经创建了一个对话框类。有两个按钮,并希望添加类似文本框的内容。我已经阅读了负责此组件的CEditC++ 使用CAxDialogImpl中的ATL CEdit将编辑框添加到ATL对话框,c++,visual-studio,atl,cedit,C++,Visual Studio,Atl,Cedit,我有一个关于ATL(C++)VS2010的项目。我已经创建了一个对话框类。有两个按钮,并希望添加类似文本框的内容。我已经阅读了负责此组件的CEdit CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1); 1。但是没有一个地方被称为资源声明IDC_EDIT1。 CWindow textBox(GetDlgItem(IDC_EDIT1)); textBox.SetWindowTextW(L"hello"); 2。必须连接afxwin.h。
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
1。但是没有一个地方被称为资源声明IDC_EDIT1。
CWindow textBox(GetDlgItem(IDC_EDIT1));
textBox.SetWindowTextW(L"hello");
2。必须连接afxwin.h。我在顶部的stdafx.h中插入了库。
CWindow textBox(GetDlgItem(IDC_EDIT1));
textBox.SetWindowTextW(L"hello");
它向我发出了一个错误:
Building MFC application with /MD[d] (CRT dll version) requires MFC
shared dll version. Please #define _AFXDLL or do not use /MD[d]
#error directive: WINDOWS.H already included. MFC apps must not #include
我认为这个问题已经解决了。
然后我得到一个错误:
Building MFC application with /MD[d] (CRT dll version) requires MFC
shared dll version. Please #define _AFXDLL or do not use /MD[d]
#error directive: WINDOWS.H already included. MFC apps must not #include
我删除了所有引用WINDOWS.H,但错误仍然存在
是否有不使用CEdit的解决方案。
CWindow textBox(GetDlgItem(IDC_EDIT1));
textBox.SetWindowTextW(L"hello");
但问题依然存在作为指定IDC_EDIT1的资源?
一般来说,如前所述,应规定的地方是否有任何示例。我什么也找不到。也许是因为我英语不好
我添加了Resource.h
#define IDC_EDIT1 113
在file.rc中,我有两个按钮:
DEFPUSHBUTTON "OK",IDOK,209,179,50,14
PUSHBUTTON "Cancel",IDCANCEL,263,179,50,14
如何在file.rc中添加我的IDC_EDIT1
???? "text",IDC_EDIT1,263,179,50,14
根据stackoverflow的说法,CEdit不是微软标准ATL的一部分,而是一个标准的ATL 看来
listview
和treeview
常用控件确实具有Microsoft提供的ATL支持
从您提到的错误来看,听起来您正在将MFC组件与解决方案中的MFC相关属性一起拉入构建。您需要检查您在构建中是否仅使用ATL包含、属性和库。检查您的标准包含文件stdafx.h
是否正在使用ATL包含
这里有一些要考虑的源代码。这是我使用ATL所做的一个示例应用程序,它显示了一个简单的对话框,其中有一个listview控件,有两列显示Windows注册表中某个键的数据。该对话框允许用户双击
listview
控件的特定行,然后获取与字符串值键关联的值,并允许编辑字符串值
我使用wchar\u t
和std::wstring
保存文本数据,因为Windows API都是宽字符
.rc文件包含以下对话框模板。我使用VisualStudio资源视图中提供的标准对话框设计工具删除对话框上的控件并修改其属性。我还使用对话框设计工具为按钮单击和其他事件添加事件处理程序。该工具将向源文件添加事件处理框架,并更新消息映射
IDD_PROVDIALOG DIALOGEX 0, 0, 224, 209
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Provision control"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",IDOK,167,7,50,16
PUSHBUTTON "Cancel",IDCANCEL,167,26,50,16
CONTROL "",IDC_LIST1,"SysListView32",LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,154,155
EDITTEXT IDC_EDIT_PROP,7,179,154,23,ES_MULTILINE | ES_AUTOHSCROLL
PUSHBUTTON "Save",IDC_BUTTON_SAVE,179,180,38,22
END
将填充对话框的列表视图
,并将对话框显示给用户。然后我有以下两个事件处理程序。第一个事件处理程序用于单击“保存”按钮。第二个事件处理程序用于用户双击listview
控件的行(实际上是第一列)
// Initialize LVITEM members that are common to all items.
LVITEM lvI = {0};
lvI.pszText = LPSTR_TEXTCALLBACK; // Sends an LVN_GETDISPINFO message.
lvI.mask = LVIF_TEXT | LVIF_STATE | LVCF_SUBITEM;
lvI.stateMask = 0;
lvI.state = 0;
// Initialize LVITEM members that are different for each item.
int iCount = m_RegistryData->GetSize();
for (int index = 0; index < iCount; index++)
{
// Insert the item row with the first column into the list.
lvI.iItem = index;
lvI.iSubItem = 0;
if (ListView_InsertItem (pListView.m_hWnd, &lvI) != -1) {
// insert the second column into the listview.
lvI.iSubItem = 1;
ListView_SetItem (pListView.m_hWnd, &lvI);
}
}
数据存储在ATL简单映射中,当创建对话框时,我们提供一个指向映射的指针。因此,对话框有一个指向注册表数据的指针,如CSimpleMap*m_RegistryData代码>
下面是保存按钮单击事件处理程序,它从编辑控件中提取文本并更新数据映射。一旦数据映射被更新,我们就告诉listview
更新自身
LRESULT CProvDialog::OnBnClickedButtonSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL & bHandled)
{
CWindow pEdit = GetDlgItem (IDC_EDIT_PROP);
int iTextSize = pEdit.GetWindowTextLength ();
if (iTextSize > 0 && m_EditKey.length () > 0) {
wchar_t myText[128];
pEdit.GetWindowText(myText, 127);
m_RegistryData->SetAt (m_EditKey, myText);
m_EditKey.clear(); // clear the key area since we have done an update
pEdit.SetWindowText (L""); // clear the edit box before returning for user feedback.
CWindow pListView = GetDlgItem(IDC_LIST1); // Get the listview control window handle
pListView.RedrawWindow(NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
}
bHandled = TRUE;
return 1;
}
这里要完成的是listview
控件中双击的处理程序。这将执行基本的健全性检查,以确保双击有效,然后使用双击行的行号,这是一个基于零的值,我们从地图数据结构的相应行中提取键和值。我们保存密钥以便以后进行更新,并将与密钥关联的值放入编辑框中
reinterpret\u cast
的使用源于使用Microsoft MSDN库示例中的示例。有关重新解释强制转换的讨论,请参见stackoverflow
listview
控件由对话框初始化中的以下源代码创建。我们正在使用LPSTR\u TEXTCALLBACK
以及NMLVDISPINFOW
消息的处理程序来填充listview
控件
// Initialize LVITEM members that are common to all items.
LVITEM lvI = {0};
lvI.pszText = LPSTR_TEXTCALLBACK; // Sends an LVN_GETDISPINFO message.
lvI.mask = LVIF_TEXT | LVIF_STATE | LVCF_SUBITEM;
lvI.stateMask = 0;
lvI.state = 0;
// Initialize LVITEM members that are different for each item.
int iCount = m_RegistryData->GetSize();
for (int index = 0; index < iCount; index++)
{
// Insert the item row with the first column into the list.
lvI.iItem = index;
lvI.iSubItem = 0;
if (ListView_InsertItem (pListView.m_hWnd, &lvI) != -1) {
// insert the second column into the listview.
lvI.iSubItem = 1;
ListView_SetItem (pListView.m_hWnd, &lvI);
}
}
//初始化所有项共有的LVITEM成员。
LVITEM lvI={0};
lvI.pszText=LPSTR_TEXTCALLBACK;//发送LVN_GETDISPINFO消息。
lvI.mask=LVIF_TEXT | LVIF_STATE | LVCF_子项;
lvI.stateMask=0;
lvI.state=0;
//初始化每个项目的不同LVITEM成员。
int iCount=m_RegistryData->GetSize();
对于(int index=0;index
您可以在Visual Studio中以交互方式添加编辑控件。然后可以检查.RC文件中的更改。控件将作为对话框模板的一部分自动创建。然后在代码中,您可以添加GetDlgItem
来“拾取”控件。我在这个领域工作,所以当我有一些代码时,我会发布一个答案。现在,它看起来像是使用Windows API向编辑窗口发送消息,提供使用CEdit和其他类的信息和源代码示例,从错误消息中可以看出,您在MFC标头中与WTL/ATL标头混合,或者您的项目属性在MFC库中混合,从而导致生成错误。