📄 pwnd.cpp
字号:
#include "gos.h"
#include "pwnd.h"
BOOL CPWnd::Create(DWORD nStyle,LPCRECT pRect,CPWnd* pParent,int nID)
{
m_pActiveControl=NULL;
m_pChild=NULL;
nStyle|=WS_PARENT;
return CWnd::Create(nStyle,pRect,pParent,nID);
}
BOOL CPWnd::Create(LPCTSTR pszText,DWORD nStyle,LPCRECT pRect,CPWnd* pParent,int nID)
{
m_pActiveControl=NULL;
m_pChild=NULL;
nStyle|=WS_PARENT;
return CWnd::Create(pszText,nStyle,pRect,pParent,nID);
}
CWnd* CPWnd::GetDlgItem(int nID)
{
PWND pWnd,pChild=m_pChild;
if(pChild)
{
pWnd=pChild;
do
{
if(pWnd->m_nCtrlID==nID)
return pWnd;
pWnd=pWnd->m_pNext;
}while(pWnd!=pChild);
}
return NULL;
}
void CPWnd::SetActiveControl(CWnd* pWnd,int nMode)
{
PWND pAC,pChild=m_pChild;
if(!pChild)
return;
pAC=m_pActiveControl;
switch(DWORD(pWnd))
{
case 0:
break;
case PW_ACTIVECTRL:
if(pAC)
{
pWnd=pAC;
break;
}
case PW_FIRSTCHILD:
pWnd=pChild;
pChild=pChild->m_pPrev;
while(pWnd->GetStyle()&WS_NOFOCUS)
{
if(pWnd==pChild)
{
pWnd=NULL;
break;
}
pWnd=pWnd->m_pNext;
}
break;
case PW_LASTCHILD:
pWnd=pChild->m_pPrev;
while(pWnd->GetStyle()&WS_NOFOCUS)
{
if(pWnd==pChild)
{
pWnd=NULL;
break;
}
pWnd=pWnd->m_pPrev;
}
break;
default:
ASSERT(pWnd->GetParent()==this);
break;
}
if(pAC==pWnd)
{
if(pWnd && !(pWnd->GetStyle()&WS_FOCUSED))
{
pWnd->AddStyle(WS_FOCUSED);
pWnd->MsgProc(WM_SETFOCUS,nMode,0);
if((nMode&PW_FOCUSCHAINSET) && (pWnd->GetStyle()&WS_PARENT))
PPWND(pWnd)->SetActiveControl(HWND_ACTIVECTRL,nMode);
MsgProc(WM_ACTIVECONTROL,WPARAM(pWnd),LPARAM(pWnd));
}
}
else
{
if(pAC && pAC->GetStyle()&WS_FOCUSED)
{
if((nMode&PW_FOCUSCHAINKILL) && (pAC->GetStyle()&WS_PARENT))
PPWND(pAC)->SetActiveControl(NULL,nMode);
pAC->RemoveStyle(WS_FOCUSED);
pAC->MsgProc(WM_KILLFOCUS,nMode,0);
}
if(pWnd)
{
m_pActiveControl=pWnd;
pWnd->AddStyle(WS_FOCUSED);
pWnd->MsgProc(WM_SETFOCUS,nMode,0);
if((nMode&PW_FOCUSCHAINSET) && (pWnd->GetStyle()&WS_PARENT))
PPWND(pWnd)->SetActiveControl(HWND_ACTIVECTRL,nMode);
}
MsgProc(WM_ACTIVECONTROL,WPARAM(pAC),LPARAM(pWnd));
}
}
LRESULT CPWnd::MsgProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_ADDCONTROL:
OnAddControl(PWND(wParam));
break;
case WM_REMOVECONTROL:
OnRemoveControl(PWND(wParam));
break;
case WM_DESTROY:
OnDestroy();
break;
default:
wParam=CWnd::MsgProc(message,wParam,lParam);
}
return wParam;
}
void CPWnd::OnAddControl(CWnd* pWnd)
{
ASSERT(!pWnd->GetParent());
if(m_pChild)
{
pWnd->m_pPrev=m_pChild->m_pPrev;
pWnd->m_pNext=m_pChild;
pWnd->m_pPrev->m_pNext=pWnd;
pWnd->m_pNext->m_pPrev=pWnd;
}
else
{
pWnd->m_pNext=pWnd;
pWnd->m_pPrev=pWnd;
m_pChild=pWnd;
}
pWnd->m_pParent=this;
}
void CPWnd::OnRemoveControl(CWnd* pWnd)
{
ASSERT(pWnd->m_pParent==this);
DEBUG_ONLY(pWnd->m_pParent=NULL);
if(m_pNext==pWnd)
m_pChild=NULL;
else
{
pWnd->m_pNext->m_pPrev=pWnd->m_pPrev;
pWnd->m_pPrev->m_pNext=pWnd->m_pNext;
if(m_pChild==pWnd)
m_pChild=pWnd->m_pNext;
}
if(pWnd==m_pActiveControl)
{
if(m_pChild)
SetActiveControl(m_pChild,TRUE);
else
m_pActiveControl=NULL;
}
}
void CPWnd::OnDestroy()
{
CWnd::OnDestroy();
if(m_pChild)
{
CWnd *pWnd,*pChild;
pChild=m_pChild;
pWnd=pChild->m_pPrev;
for(;;)
{
DEBUG_ONLY(pWnd->m_pParent=NULL);
pWnd->DestroyWindow();
if(pWnd==pChild)
break;
pWnd=pWnd->m_pPrev;
}
DEBUG_ONLY(m_pChild=NULL);
DEBUG_ONLY(m_pActiveControl=NULL);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -