标签:
#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 函数上面 !
标签:
原文地址:http://www.cnblogs.com/liubaocheng999/p/4350973.html