AxibugEmuOnline/virtuanessrc097-master/Wnd.cpp

136 lines
5.7 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// へなちょこウインドウクラス
//
#include "DebugOut.h"
#include "Wnd.h"
// Instance
CWndList WndList;
list<CWnd*> CWndList::m_WndPtrList;
// 泥臭い…
CWndList::CWndList()
{
// m_WndPtrList.clear();
}
CWndList::~CWndList()
{
// if( !m_WndPtrList.empty() )
// m_WndPtrList.clear();
}
void CWndList::Add( CWnd* pWnd )
{
m_WndPtrList.push_back( pWnd );
}
void CWndList::Del( CWnd* pWnd )
{
for( list<CWnd*>::iterator it=m_WndPtrList.begin(); it!=m_WndPtrList.end(); ) {
if( *it == pWnd ) {
m_WndPtrList.erase(it);
break;
} else {
++it;
}
}
}
BOOL CWndList::IsDialogMessage( LPMSG msg )
{
if( m_WndPtrList.empty() )
return FALSE;
list<CWnd*>::iterator it=m_WndPtrList.begin();
while( it != m_WndPtrList.end() ) {
if( ::IsDialogMessage( (*it)->m_hWnd, msg ) )
return TRUE;
++it;
}
return FALSE;
}
CWnd::CWnd()
{
m_hWnd = NULL;
m_hMenu = NULL;
}
CWnd::~CWnd()
{
}
void CWnd::SetThis()
{
// Dispatch出来るようにCWnd*を埋め込む
if( m_hWnd ) {
::SetWindowLong( m_hWnd, GWL_USERDATA, (LONG)this );
}
}
LRESULT CALLBACK CWnd::g_WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
// ウインドウが開く前にこっそり処理する
if( msg == WM_CREATE ) {
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
CWnd* pWnd = (CWnd*)::GetWindowLong( hWnd, GWL_USERDATA );
if( !pWnd ) {
// CWnd* thisを埋め込む
::SetWindowLong( hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams );
// 自分のウインドウハンドル
pWnd = (CWnd*)lpcs->lpCreateParams;
pWnd->m_hWnd = hWnd;
}
}
// CWnd* thisを埋め込んである
CWnd* pWnd = (CWnd*)::GetWindowLong( hWnd, GWL_USERDATA );
if( pWnd ) {
return pWnd->DispatchWnd( hWnd, msg, wParam, lParam );
} else {
return ::DefWindowProc( hWnd, msg, wParam, lParam );
}
}
BOOL CALLBACK CWnd::g_DlgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
// ディスパッチ前にこっそり処理する
if( msg == WM_INITDIALOG ) {
// Dispatch出来るようにCWnd*を埋め込む(モーダルは必ずDialogBoxParamで起動する事)
// CWnd* thisを埋め込んであるがモーダルでは入っていない
CWnd* pWnd = (CWnd*)::GetWindowLong( hWnd, GWL_USERDATA );
if( !pWnd ) {
::SetWindowLong( hWnd, GWL_USERDATA, (LONG)lParam );
pWnd = (CWnd*)lParam;
}
// 自分のウインドウハンドル
pWnd->m_hWnd = hWnd;
// ダイアログを中央に移動する:)
HWND hWndParent = ::GetParent( hWnd );
if( hWndParent ) {
RECT rcParent, rc;
::GetWindowRect( hWndParent, &rcParent );
::GetWindowRect( hWnd, &rc );
INT x = rcParent.left+(rcParent.right-rcParent.left)/2-(rc.right-rc.left)/2;
INT y = rcParent.top +(rcParent.bottom-rcParent.top)/2-(rc.bottom-rc.top)/2;
// DEBUGOUT( "X=%d Y=%d\n", x, y );
::SetWindowPos( hWnd, NULL, x, y, -1, -1, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
}
}
// CWnd* thisを埋め込んである
CWnd* pWnd = (CWnd*)::GetWindowLong( hWnd, GWL_USERDATA );
if( pWnd ) {
return pWnd->DispatchDlg( hWnd, msg, wParam, lParam );
} else {
return FALSE;
}
}