码迷,mamicode.com
首页 > 其他好文 > 详细

temp

时间:2015-03-19 18:05:49      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

#pragma once

#include "J.h"

class JWnd
{
public:
    JWnd(void);
    virtual ~JWnd(void);

protected:
    static int SubWndProc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam);
    static int SubDlgProc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam);
    static bool RegisterClass(LPCTSTR lpszClassName);
    //virtual int DoWndProc(int message,WPARAM wParam,LPARAM lParam);

    int GetRandomUID();

    // 作为对话框的时候处理
    virtual void OnOK();
    virtual void OnCancel();

    // ***********************************************
    // 自定义的 消息 处理,在派生类里重定义这个函数,处理
    virtual int DoWndProc(int message,WPARAM wParam,LPARAM lParam);

    // ***********************************************
    // 这里可以开始派生一些基本的处理函数,根据需要添加
    // 一定是 MiniGUI 基本消息函数 !
    // MSG_COMMAND
    virtual void OnCommand(int id,int code,HWND hWnd){}

    // 鼠标右键弹起 MSG_RBUTTONUP
    virtual void OnRButtonUp(DWORD dwFlags,int x,int y){}

    // MSG_CLOSE
    virtual void OnClose(){}
    
public:
    int GetUID();

    // 指定之前的窗口处理过程 ,为了兼容之前的代码提供的这个方法,慎用
    void SetOldWndProc(WNDPROC procOld);

    // 模态对话框 ,创建函数
    int DoModal(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp);
    int DoModal(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp,WNDPROC procOld);

    // 非模态对话框创建函数
    HWND CreateDialog(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp);
    HWND CreateDialog(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp,WNDPROC procOld);

    // 创建普通窗口以及控件
    // 可以是自定义类型 或者 系统的控件类
    virtual bool Create(
        int uID,
        tstring strClassName,
        tstring strText,
        DWORD dwStyle,
        DWORD dwExStyle,
        int x,
        int y,
        int nWidth,
        int nHeight,
        HWND hWndParent
        );
    void Destroy();

    // 子类化窗口,更改窗口处理过程
    virtual void SubWnd(int uID,HWND hWnd);


    // 创建完窗口之后,包含模态对话框,会调用这个初始化函数,可以在这个函数里初始化
    virtual void OnInitWnd(){}

    static JWnd *FromHWnd(HWND hWnd);
    static JWnd *FromUID(int uID);

    // 窗口文字
    void SetWindowText(tstring strText);
    tstring GetWindowText();

public:
    HWND m_hWnd;

protected:
    WNDPROC m_pOldWndProc;
    static map<HWND,JWnd *> s_mapHwndSub;
    static map<int,JWnd *> s_mapUID;                            // JWnd UID 映射
    static int s_UIDRandom;                                        // 需要随机 UID 时候的索引下标值
    bool m_bModalDialog;

    int m_uID;                                            
};

#include "JWnd.h"

map<HWND,JWnd *> JWnd::s_mapHwndSub;
map<int,JWnd *> JWnd::s_mapUID;
int JWnd::s_UIDRandom = 1000;

JWnd::JWnd(void)
{
    m_hWnd = 0;
    m_pOldWndProc = NULL;
    m_bModalDialog = false;
}

JWnd::~JWnd(void)
{
    Destroy();
}

bool JWnd::RegisterClass(LPCTSTR lpszClassName)
{
    WNDCLASS wce;
    wce.spClassName = lpszClassName;
    if (!GetWindowClassInfo(&wce))
    {
        wce.dwStyle = 0;
        wce.dwExStyle = WS_EX_NONE;
        wce.WinProc = DefaultWindowProc;      
        wce.hCursor = GetSystemCursor (IDC_ARROW);
        wce.iBkColor = COLOR_lightwhite;

        return RegisterWindowClass(&wce);

    }
    return true;
}

bool JWnd::Create(int uID, tstring strClassName,tstring strText,DWORD dwStyle, DWORD dwExStyle,int x, int y,int nWidth, int nHeight,HWND hWndParent)
{
    if (!RegisterClass(strClassName.c_str()))
        return false;
    
    if (0 == uID)
    {
        uID = GetRandomUID();
    }
    m_uID = uID;
    m_hWnd = CreateWindowEx(strClassName.c_str(),strText.c_str(),dwStyle,dwExStyle,m_uID,x,y,nWidth,nHeight,
        hWndParent,0);

    SubWnd(uID,m_hWnd);
     bool bRet = IsWindow(m_hWnd);
    return bRet;
}

void JWnd::Destroy()
{
    s_mapHwndSub.erase(m_hWnd);
    s_mapUID.erase(m_uID);

    if (IsWindow(m_hWnd))
    {
        DestroyWindow(m_hWnd);
        m_hWnd = NULL;
        m_uID = 0;
    }
}

void JWnd::SubWnd(int uID,HWND hWnd)
{
    if (0 == uID)
        uID = GetRandomUID();
    m_uID = uID;
    m_hWnd = hWnd;

    WNDPROC procOld = (WNDPROC)SetWindowCallbackProc(m_hWnd,SubWndProc);

    // 如果已经指定了原来的处理过程函数,那么这里不再设置
    if (NULL == m_pOldWndProc)
    {
        m_pOldWndProc = procOld;
    }
    s_mapHwndSub[hWnd] = this;
    s_mapUID[uID] = this;

    OnInitWnd();
}

JWnd *JWnd::FromHWnd(HWND hWnd)
{
    map<HWND,JWnd *>::iterator iterWnd = s_mapHwndSub.find(hWnd);
    if (iterWnd != s_mapHwndSub.end())
    {
        return iterWnd->second;
    }

    return NULL;
}

JWnd *JWnd::FromUID(int uID)
{
    map<int,JWnd *>::iterator iterWnd = s_mapUID.find(uID);
    if (iterWnd != s_mapUID.end())
    {
        return iterWnd->second;
    }

    return NULL;
}

int JWnd::SubWndProc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
    map<HWND,JWnd *>::iterator iterFind = s_mapHwndSub.find(hWnd);
    if (iterFind != s_mapHwndSub.end())
    {
        JWnd *pSub = iterFind->second;
        return pSub->DoWndProc(message,wParam,lParam);
    }
    else
    {
        return DefaultWindowProc(hWnd,message,wParam,lParam);
    }
}


int JWnd::SubDlgProc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
    switch (message)
    {
    case MSG_INITDIALOG:
        {
            s_mapHwndSub[hWnd] = (JWnd *)lParam;
            JWnd *pDlgSub = NULL;
            map<HWND,JWnd *>::iterator iterFind = s_mapHwndSub.find(hWnd);
            if (iterFind != s_mapHwndSub.end())
            {
                pDlgSub = iterFind->second;
                if (NULL != pDlgSub)
                {
                    pDlgSub->SubWnd(pDlgSub->GetUID(),hWnd);
                }
            }
        }
        break;
    }

    map<HWND,JWnd *>::iterator iterFind = s_mapHwndSub.find(hWnd);
    if (iterFind != s_mapHwndSub.end())
    {
        JWnd *pSub = iterFind->second;
        return pSub->DoWndProc(message,wParam,lParam);
    }
    else
    {
        return DefaultDialogProc(hWnd,message,wParam,lParam);
    }
}

void JWnd::OnOK()
{
    if (m_bModalDialog)
        EndDialog(m_hWnd,IDOK);
    else
    {
        // 非模态对话框销毁
        DestroyMainWindowIndirect(m_hWnd);
    }
}

void JWnd::OnCancel()
{
    if (m_bModalDialog)
        EndDialog(m_hWnd,IDCANCEL);
    else
    {
        // 非模态对话框销毁
        DestroyMainWindowIndirect(m_hWnd);
    }
}

int JWnd::GetRandomUID()
{
    while (s_mapUID.find(s_UIDRandom) != s_mapUID.end())
    {
        s_UIDRandom++;
    }
    return s_UIDRandom;
}

int JWnd::DoModal(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp,WNDPROC procOld)
{
    if (0 == uID)
        m_uID = GetRandomUID();
    SetOldWndProc(procOld);
    m_bModalDialog = true;
    return DialogBoxIndirectParam(&dlgTemp,hWndParent,SubDlgProc,(LPARAM)this);
}

int JWnd::DoModal(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp)
{
    return DoModal(uID,hWndParent,dlgTemp,DefaultDialogProc);
}

HWND JWnd::CreateDialog(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp)
{
    return CreateDialog(uID,hWndParent,dlgTemp,DefaultWindowProc);
}

HWND JWnd::CreateDialog(int uID,HWND hWndParent,DLGTEMPLATE &dlgTemp,WNDPROC procOld)
{
    if (0 == uID)
        m_uID = GetRandomUID();
    m_bModalDialog = false;
    SetOldWndProc(procOld);
    m_hWnd = CreateMainWindowIndirect(&dlgTemp,hWndParent,DefaultWindowProc);
    SubWnd(m_uID,m_hWnd);
    return m_hWnd;
}

int JWnd::GetUID()
{
    return m_uID;
}

void JWnd::SetOldWndProc(WNDPROC procOld)
{
    m_pOldWndProc = procOld;
}

void JWnd::SetWindowText(tstring strText)
{
    ::SetWindowText(m_hWnd,strText.c_str());
}

tstring JWnd::GetWindowText()
{
    TCHAR szText[512];
    ::GetWindowText(m_hWnd,szText,512);
    return szText;
}

int JWnd::DoWndProc(int message,WPARAM wParam,LPARAM lParam)
{
    int iRet = 0;
    if (NULL != m_pOldWndProc)
    {
        if (m_pOldWndProc != SubDlgProc)
        {
            iRet = m_pOldWndProc(m_hWnd,message,wParam,lParam);
        }
        else
        {
            iRet = DefaultDialogProc(m_hWnd,message,wParam,lParam);
        }
    }
    else
    {
        iRet = DefaultWindowProc(m_hWnd,message,wParam,lParam);
    }

    // dialog 需要处理的
    switch (message)
    {
    case MSG_INITDIALOG:
        {

        }
        return 1; // set focus
    
    case MSG_COMMAND:
        {
            switch (LOWORD (wParam))
            {
            case   IDOK :
                {
                    OnOK();
                }
                break;
            case   IDCANCEL :
                {
                    OnCancel();
                }
                break;

            default:
                {
                    OnCommand(LOWORD(wParam),HIWORD(wParam),(HWND)lParam);
                }
            }
        }
        break;

    case MSG_RBUTTONDOWN:
        {
            OnRButtonUp(wParam,LOSWORD (lParam),HISWORD (lParam));
        }
        break;

    case MSG_CLOSE:
        {
            OnClose();
            if(m_bModalDialog)
            {
                EndDialog(m_hWnd, 0);
            }
            else if(m_hWnd != GetMainWnd())
            {
                DestroyMainWindowIndirect(m_hWnd);
                MainWindowCleanup(m_hWnd);
            }
            else
            {
                DestroyMainWindow(m_hWnd);
                PostQuitMessage(m_hWnd);
            }
        }
    }
    
    return iRet;
}

// 添加函数,别在这里添加 ,在 DoWndProc 函数上面 !

temp

标签:

原文地址:http://www.cnblogs.com/liubaocheng999/p/4350973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!