шаблоны добивают
От: gurimu  
Дата: 02.06.05 10:58
Оценка:
#ifndef __swldlgs_h_
#define __swldlgs_h_

#include <windows.h>
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

template <class TChild, WORD t_wDlgTemplateID>
class XDialogImpl
{
public:
    enum { IDD = t_wDlgTemplateID };
    
    XDialogImpl(HINSTANCE hInstance, HWND hWnd) :
        _hInstance(hInstance)
        ,_hWnd(hWnd)
    {};
    
    ///
    /// Create modal dialog
    ///
    INT_PTR doModal()
    {
        TChild* pTChild = static_cast<TChild*>(this);
        //::DialogBoxParam    to create modal dialog
        return ::DialogBoxParam(_hInstance, MAKEINTRESOURCE(IDD), _hWnd, 
            (DLGPROC)startDialogProc, (LPARAM)pTChild);
        return 0;
    };

    BOOL dialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_INITDIALOG:            
            break;
            
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK)
            {
                ::EndDialog(hWnd, 0);
            }
            break;
            
        case WM_NOTIFY:
            break;
        
        default:
            return FALSE;
        };

        return FALSE;    
    };
    
    static BOOL CALLBACK startDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {        
        //TChild* pTChild = reinterpret_cast<TChild*>(::GetWindowLong(hWnd, GWL_USERDATA));
        TChild* pTChild = reinterpret_cast<TChild*>(::SendMessage(0, 0, 0, 0));///::GetWindowLong(hWnd, GWL_EXSTYLE));
        return pTChild->dialogProc(hWnd, uMsg, wParam, lParam);
    };

protected:
    HINSTANCE _hInstance;
    HWND    _hWnd;
};

#endif //__swldlgs_h_


#ifndef __testdialog_h_
#define __testdialog_h_


#include "swldlgs.h"
#include "resource.h"

class XTestDialog : public XDialogImpl<XTestDialog, IDD_DIALOG1>
{
public:
    typedef XDialogImpl<XTestDialog, IDD_DIALOG1> TBase;
    
    XTestDialog(HINSTANCE hInstance, HWND hWnd) :
        TBase(hInstance, hWnd)
    {};

    BOOL dialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_INITDIALOG:            
            break;
            
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK)
            {
                ::EndDialog(hWnd, 0);
            }

            break;
            
        case WM_NOTIFY:
            break;
        
        default:
            return FALSE;
        };
        
        return FALSE;    
    };

};

#endif    //__testdialog_h_


компилировал
msvc.net 2003
gcc version 3.2.3 (mingw special 20030504-1)

Это работает! Почему, я понять не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.