PRB: ATL Classes Are Not Compatible With ClassWizard
ID: Q192984
|
The information in this article applies to:
-
Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.0a, 4.1, 4.2, 4.2b, 5.0, 6.0
SYMPTOMS
The Visual C++ Resource Editor invokes ClassWizard to add message handlers
to an Active Template Library (ATL) dialog resource. However, ClassWizard
does not recognize classes created with the ATL Object Wizard.
CAUSE
ClassWizard works with MFC classes and does not handle ATL classes or
message maps.
RESOLUTION
Add message maps to ATL classes manually. Use ClassView or the WizardBar to
add member functions and variables.
In Visual C++, version 6.0, WizardBar or ClassView can add generic Windows
messages to ATL classes.
STATUS
This behavior is by design.
MORE INFORMATION
When you right-click on an ATL class name in ClassView a context menu
appears. From the context menu, select the Add Member Function option to
create the message handler function. A generic message handler function
returns an LRESULT and has this prototype:
LRESULT OnMsg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
After adding the message handler function prototype, edit the message map
embedded in the class declaration. Add this macro between the BEGIN_MSG_MAP
and END_MSG_MAP macros:
MESSAGE_HANDLER(message_id, function_name)
Other message map macros are also available. See REFERENCES for articles
explaining the implementation of ATL window objects.
The following sample declaration of an ATL class implements a dialog box
and handles the WM_CTLCOLORDLG message:
class CDlg : public CDialogImpl<CDlg>
{
public:
CDlg();
~CDlg();
enum { IDD = IDD_DLG };
BEGIN_MSG_MAP(CDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
MESSAGE_HANDLER(WM_CTLCOLORDLG, OnCtlColorDlg)
END_MSG_MAP()
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled);
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl,
BOOL& bHandled);
LRESULT OnCtlColorDlg(UINT uMsg, WPARAM wParam, LPARAM lParam,
BOOL& bHandled);
};
Steps to Reproduce Behavior
- Create a new ATL COM AppWizard, using all default settings.
- On the Insert menu, click New ATL Object.
- In the ATL Object Wizard, select the Miscellaneous category, and then
double-click the Dialog object.
- Type "Dlg" into the Short Name field; click OK.
- In the ResourceView pane, expand the project name and Dialog.
- Double-click IDD_DLG.
- Double-click inside the displayed dialog box.
RESULTS: The ClassWizard appears, and displays a dialog box titled "Adding
a Class". It offers the option of creating a new class or selecting an
existing class to associate with the IDD_DLG dialog resource. Selecting an
existing class does not list the class created by the ATL Object Wizard.
REFERENCES
For more information on adding MFC support to an ATL project,
please see the following article in the Microsoft Knowledge Base:
Q181505
PRB: ATL COM AppWizard Doesn't Offer MFC Support for .EXE
For additional information, see the following Help topics:
Visual C++ Online Help: Developer Products; Visual C++; C/C++ Language
and C++ Libraries; Active Template Library; Articles; ATL Window
Classes; Implementing a Window
Visual C++ Online Help: Developer Products; Visual C++; C/C++ Language
and C++ Libraries; Active Template Library; Articles; ATL Window
Classes; Implementing a Dialog Box
Visual C++ Online Help: Developer Products; Visual C++; C/C++ Language
and C++ Libraries; Active Template Library; Class Reference; ATL Macros
and Global Functions
Visual C++ 6.0 Online Help: Visual C++ Documentation; Reference;
Microsoft Foundation Class Library and Templates; Active Template
Library; Articles; ATL Window Classes; Implementing a Window; Adding a
Message Handler
Keywords : kbwizard kbATL kbMFC kbVC400 kbVC410 kbVC420 kbVC500 kbVC600 kbClassWizard kbGrpDSTools
Version : WINNT:4.0,4.0a,4.1,4.2,4.2b,5.0,6.0
Platform : winnt
Issue type : kbprb