【问题标题】:Adding edit box to ATL dialog using ATL CEdit in CAxDialogImpl在 CAxDialogImpl 中使用 ATL CEdit 将编辑框添加到 ATL 对话框
【发布时间】:2015-09-23 20:33:53
【问题描述】:

我有关于 ATL(C++) VS2010 的项目。我创建了一个对话框类。有两个按钮,想添加类似文本框的东西。我读过负责这个组件的 CEdit。

CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

1.但无处称为资源声明 IDC_EDIT1。

2。需要连接afxwin.h。我在顶部的 stdafx.h 中插入了库。

它给我一个错误:

Building MFC application with /MD[d] (CRT dll version) requires MFC
shared dll version. Please #define _AFXDLL or do not use /MD[d]

我认为这个问题。 error Please #define _AFXDLL or do not use /MD[d] occurs even after making changes in Project Properties

然后我得到一个错误:

#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

在文件 .rc 我有两个按钮:

DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14

如何在 .rc 文件中添加我的 IDC_EDIT1?

????     "text",IDC_EDIT1,263,179,50,14

【问题讨论】:

  • 您可以在 Visual Studio 中以交互方式添加编辑控件。然后您可以检查 .RC 文件是否有更改。该控件将作为对话框模板的一部分自动创建。然后在代码中您可以添加GetDlgItem 来“拾取”控件。
  • 这篇 MSDN 文章 ATL 3.0 Window Classes: An Introduction 提供了将 ATL 用于窗口和对话框的示例。我在同一领域工作,所以当我有一些代码时,我会发布答案。现在看起来像是使用 Windows API 向编辑窗口发送消息。
  • 这篇 codeproject 文章是关于 WTL 和 ATL 的系列文章之一,提供了使用 CEdit 和其他类 codeproject.com/Articles/4028/… 的信息和源代码示例,并且从错误消息中可以看出您正在混合 MFC 标头WTL/ATL 标头或您的项目属性混合在 MFC 库中,这会导致构建错误。

标签: c++ visual-studio atl cedit


【解决方案1】:

根据 stackoverflow How to get text from CEdit control,CEdit 不是 Microsoft 标准 ATL 的一部分,而是 Windows Template Library (WTL) extension

看来listviewtreeview 通用控件确实有来自 Microsoft 的 ATL 支持。

根据您提到的错误,听起来您正在将 MFC 组件与解决方案中的 MFC 相关属性一起拉入您的构建中。您需要检查您是否仅在构建中使用 ATL 包含以及属性和库。检查您的标准包含文件 stdafx.h 是否使用 ATL 包含。

这里有一些要考虑的源代码。这来自我一直在使用 ATL 执行的示例应用程序,它显示了一个简单的对话框,其中包含一个列表视图控件,其中两列显示来自 Windows 注册表中一个键的数据。该对话框允许用户双击listview 控件的特定行,然后获取与字符串值键关联的值并允许编辑字符串值值。

我使用wchar_tstd::wstring 来保存我的文本数据,因为Windows API 都是宽字符。

.rc 文件包含以下对话框模板。我使用 Visual Studio 资源视图中可用的标准对话框设计工具将控件拖放到对话框上并修改它们的属性。我还使用对话框设计工具为按钮单击和其他事件添加事件处理程序。该工具会将事件处理框架添加到源文件并更新消息映射。

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 被填写,对话框呈现给用户。然后我有以下两个事件处理程序。第一个事件处理程序用于单击“保存”按钮时。第二个事件处理程序用于当用户双击listview 控件的一行(实际上是第一列)时。

数据存储在 ATL 简单地图中,当创建对话框时,我们提供指向地图的指针。所以对话框有一个指向注册表数据的指针CSimpleMap <std::wstring, std::wstring> *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_cast 的使用来自使用 Microsoft MSDN 库示例中的示例。有关reinterpret_cast 的讨论,请参阅stackoverflow When to use reinterpret_cast?

LRESULT CProvDialog::OnNMDblclkList1(int idCtrl, LPNMHDR pNMHDR, BOOL & bHandled)
{
    // Handle a double click in the listview control.
    //   "The iItem, iSubItem, and ptAction members of this
    //    structure [NMITEMACTIVATE] contain information about the item."
    LPNMITEMACTIVATE plvdi  = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

    if (plvdi->iItem >= 0) {
        // we have a valid listview row number so lets update our edit box
        CWindow pEdit = GetDlgItem (IDC_EDIT_PROP);

        pEdit.SetWindowText (m_RegistryData->GetValueAt(plvdi->iItem).c_str());
        m_EditKey = m_RegistryData->GetKeyAt(plvdi->iItem);
    }

    bHandled = TRUE;
    return 1;
}

作为旁注,这里有一些源代码需要允许显示多列listview。该控件需要打开 Details 视图,因此为了确保启用多列视图,我在对话框及其组件的初始化过程中使用了以下代码。

// First of all lets make sure that the listview is in Details or Report style.
// If the control is not in Details or Report style then even though we add columns
// only the first column will be displayed.  Multiple columns only available in Details view.
ULONG  ulWinStyle = pListView.GetWindowLong (GWL_STYLE);
ulWinStyle |= LVS_REPORT;
pListView.SetWindowLong (GWL_STYLE, ulWinStyle);

listview 控件由对话框初始化中的以下源代码创建。我们使用LPSTR_TEXTCALLBACKNMLVDISPINFOW 消息的处理程序来填充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);
    }
}

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2020-04-16
    • 2010-10-10
    • 2021-07-18
    • 2015-07-13
    • 1970-01-01
    • 2013-06-10
    • 2012-06-27
    • 2012-04-24
    相关资源
    最近更新 更多