DOCUMENT:Q192984 07-MAY-2001 [visualc] TITLE :PRB: ATL Classes Are Not Compatible With ClassWizard PRODUCT :Microsoft C Compiler PROD/VER:WINNT:4.0,4.0a,4.1,4.2,4.2b,5.0,6.0 OPER/SYS: KEYWORDS:kbwizard kbATL kbMFC kbVC400 kbVC410 kbVC420 kbVC500 kbVC600 kbClassWizard kbGrpDSTools ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual C++, versions 4.0, 4.0a, 4.1 - Microsoft Visual C++, 32-bit Enterprise Edition, versions 4.2b, 5.0, 6.0 - Microsoft Visual C++, 32-bit Professional Edition, versions 4.2b, 5.0, 6.0 - Microsoft Visual C++, 32-bit Learning Edition, version 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 { 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 --------------------------- 1. Create a new ATL COM AppWizard, using all default settings. 2. On the Insert menu, click New ATL Object. 3. In the ATL Object Wizard, select the Miscellaneous category, and then double-click the Dialog object. 4. Type "Dlg" into the Short Name field; click OK. 5. In the ResourceView pane, expand the project name and Dialog. 6. Double-click IDD_DLG. 7. 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 Technology : kbVCsearch kbVC400 kbAudDeveloper kbVC410 kbVC500 kbVC600 kbVC32bitSearch kbVC400a kbVC420b kbVC500Search Version : WINNT:4.0,4.0a,4.1,4.2,4.2b,5.0,6.0 Issue type : kbprb ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.