Several updates for fixing the subclassing problems and accelerator processing

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8233 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2000-09-01 13:52:31 +00:00
parent 37123da440
commit e604d44b4b
6 changed files with 132 additions and 120 deletions

View File

@@ -102,7 +102,6 @@ public:
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR
WXHMENU GetWinMenu() const { return m_hMenu; } WXHMENU GetWinMenu() const { return m_hMenu; }
WXHWND GetFrame() const { return m_hFrame; }
// Returns the origin of client area (may be different from (0,0) if the // Returns the origin of client area (may be different from (0,0) if the
// frame has a toolbar) // frame has a toolbar)
@@ -205,13 +204,6 @@ private:
WXHWND m_hWndToolTip; WXHWND m_hWndToolTip;
#endif // tooltips #endif // tooltips
//
// The main handle of a frame window, that used for message processing
// is the client handle under PM. But we still need the frame handle
// as well
//
WXHWND m_hFrame;
// //
// Handles to child windows of the Frame that we don't have child objects for // Handles to child windows of the Frame that we don't have child objects for
// //

View File

@@ -90,7 +90,7 @@ wxAcceleratorTable::wxAcceleratorTable(
::WinSetAccelTable( vHabmain ::WinSetAccelTable( vHabmain
,hAccel ,hAccel
,(HWND)pFrame->GetFrame() ,(HWND)pFrame->GetHWND()
); );
} }
M_ACCELDATA->m_hAccel = hAccel; M_ACCELDATA->m_hAccel = hAccel;
@@ -153,7 +153,7 @@ wxAcceleratorTable::wxAcceleratorTable(
::WinSetAccelTable( vHabmain ::WinSetAccelTable( vHabmain
,M_ACCELDATA->m_hAccel ,M_ACCELDATA->m_hAccel
,(HWND)pFrame->GetFrame() ,(HWND)pFrame->GetHWND()
); );
} }

View File

@@ -184,7 +184,7 @@ bool wxApp::RegisterWindowClasses(
if (!::WinRegisterClass( vHab if (!::WinRegisterClass( vHab
,wxFrameClassName ,wxFrameClassName
,(PFNWP)wxWndProc ,(PFNWP)wxWndProc
,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT ,CS_SIZEREDRAW | CS_MOVENOTIFY | CS_SYNCPAINT | CS_FRAME
,sizeof(ULONG) ,sizeof(ULONG)
)) ))
{ {
@@ -651,11 +651,11 @@ int wxApp::MainLoop()
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexGuiLeaveOrEnter(); wxMutexGuiLeaveOrEnter();
#endif // wxUSE_THREADS #endif // wxUSE_THREADS
while (!Pending() && ProcessIdle()) while (!Pending() && ProcessIdle())
{ {
// wxUsleep(10000); // wxUsleep(10000);
} }
DoMessage(); DoMessage();
} }
return (int)svCurrentMsg.mp1; return (int)svCurrentMsg.mp1;
} // end of wxApp::MainLoop } // end of wxApp::MainLoop
@@ -761,11 +761,11 @@ bool wxApp::ProcessMessage(
// //
// Anyone for a non-translation message? Try youngest descendants first. // Anyone for a non-translation message? Try youngest descendants first.
// //
for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent()) // for (pWnd = pWndThis; pWnd; pWnd = pWnd->GetParent())
{ // {
if (pWnd->OS2ProcessMessage(pWxmsg)) // if (pWnd->OS2ProcessMessage(pWxmsg))
return TRUE; // return TRUE;
} // }
return FALSE; return FALSE;
} // end of wxApp::ProcessMessage } // end of wxApp::ProcessMessage

View File

@@ -164,6 +164,7 @@ bool wxFrame::Create(
wxFrame::~wxFrame() wxFrame::~wxFrame()
{ {
m_isBeingDeleted = TRUE; m_isBeingDeleted = TRUE;
wxTopLevelWindows.DeleteObject(this); wxTopLevelWindows.DeleteObject(this);
DeleteAllBars(); DeleteAllBars();
@@ -174,7 +175,7 @@ wxFrame::~wxFrame()
if (wxTheApp->GetExitOnFrameDelete()) if (wxTheApp->GetExitOnFrameDelete())
{ {
::WinPostMsg(m_hFrame, WM_QUIT, 0, 0); ::WinPostMsg(GetHWND(), WM_QUIT, 0, 0);
} }
} }
wxModelessWindows.DeleteObject(this); wxModelessWindows.DeleteObject(this);
@@ -262,7 +263,7 @@ void wxFrame::DoSetClientSize(
::WinQueryWindowRect(GetHwnd(), &vRect); ::WinQueryWindowRect(GetHwnd(), &vRect);
::WinQueryWindowRect(m_hFrame, &vRect2); ::WinQueryWindowRect(GetHWND(), &vRect2);
// //
// Find the difference between the entire window (title bar and all) // Find the difference between the entire window (title bar and all)
@@ -319,7 +320,7 @@ void wxFrame::DoGetSize(
{ {
RECTL vRect; RECTL vRect;
::WinQueryWindowRect(m_hFrame, &vRect); ::WinQueryWindowRect(GetHWND(), &vRect);
*pWidth = vRect.xRight - vRect.xLeft; *pWidth = vRect.xRight - vRect.xLeft;
*pHeight = vRect.yTop - vRect.yBottom; *pHeight = vRect.yTop - vRect.yBottom;
} // end of wxFrame::DoGetSize } // end of wxFrame::DoGetSize
@@ -332,7 +333,7 @@ void wxFrame::DoGetPosition(
RECTL vRect; RECTL vRect;
POINTL vPoint; POINTL vPoint;
::WinQueryWindowRect(m_hFrame, &vRect); ::WinQueryWindowRect(GetHWND(), &vRect);
vPoint.x = vRect.xLeft; vPoint.x = vRect.xLeft;
// //
@@ -352,7 +353,7 @@ void wxFrame::DoShowWindow(
int bShowCmd int bShowCmd
) )
{ {
::WinShowWindow(m_hFrame, (BOOL)bShowCmd); ::WinShowWindow(GetHWND(), (BOOL)bShowCmd);
m_bIconized = bShowCmd == SWP_MINIMIZE; m_bIconized = bShowCmd == SWP_MINIMIZE;
} // end of wxFrame::DoShowWindow } // end of wxFrame::DoShowWindow
@@ -368,9 +369,9 @@ bool wxFrame::Show(
{ {
wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId); wxActivateEvent vEvent(wxEVT_ACTIVATE, TRUE, m_windowId);
::WinQueryWindowPos(m_hFrame, &vSwp); ::WinQueryWindowPos(GetHWND(), &vSwp);
m_bIconized = vSwp.fl & SWP_MINIMIZE; m_bIconized = vSwp.fl & SWP_MINIMIZE;
::WinEnableWindow(m_hFrame, TRUE); ::WinEnableWindow(GetHWND(), TRUE);
vEvent.SetEventObject(this); vEvent.SetEventObject(this);
GetEventHandler()->ProcessEvent(vEvent); GetEventHandler()->ProcessEvent(vEvent);
} }
@@ -437,7 +438,7 @@ bool wxFrame::IsMaximized() const
SWP vSwp; SWP vSwp;
bool bIconic; bool bIconic;
::WinQueryWindowPos(m_hFrame, &vSwp); ::WinQueryWindowPos(GetHWND(), &vSwp);
return (vSwp.fl & SWP_MAXIMIZE); return (vSwp.fl & SWP_MAXIMIZE);
} // end of wxFrame::IsMaximized } // end of wxFrame::IsMaximized
@@ -449,12 +450,12 @@ void wxFrame::SetIcon(
if ((m_icon.GetHICON()) != NULLHANDLE) if ((m_icon.GetHICON()) != NULLHANDLE)
{ {
::WinSendMsg( m_hFrame ::WinSendMsg( GetHWND()
,WM_SETICON ,WM_SETICON
,(MPARAM)((HPOINTER)m_icon.GetHICON()) ,(MPARAM)((HPOINTER)m_icon.GetHICON())
,NULL ,NULL
); );
::WinSendMsg( m_hFrame ::WinSendMsg( GetHWND()
,WM_UPDATEFRAME ,WM_UPDATEFRAME
,(MPARAM)FCF_ICON ,(MPARAM)FCF_ICON
,(MPARAM)0 ,(MPARAM)0
@@ -487,7 +488,7 @@ wxStatusBar* wxFrame::OnCreateStatusBar(
// so we have to set the parent to actually be the Frame. // so we have to set the parent to actually be the Frame.
// //
hWnd = pStatusBar->GetHWND(); hWnd = pStatusBar->GetHWND();
if (!::WinSetParent(hWnd, m_hFrame, FALSE)) if (!::WinSetParent(hWnd, GetHWND(), FALSE))
{ {
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
@@ -648,14 +649,14 @@ void wxFrame::SetMenuBar(
// //
// Now resize the client to fit the new frame // Now resize the client to fit the new frame
// //
WinQueryWindowPos(m_hFrame, &vSwp); WinQueryWindowPos(GetHWND(), &vSwp);
hTitlebar = WinWindowFromID(m_hFrame, FID_TITLEBAR); hTitlebar = WinWindowFromID(GetHWND(), FID_TITLEBAR);
WinQueryWindowPos(hTitlebar, &vSwpTitlebar); WinQueryWindowPos(hTitlebar, &vSwpTitlebar);
hHScroll = WinWindowFromID(m_hFrame, FID_HORZSCROLL); hHScroll = WinWindowFromID(GetHWND(), FID_HORZSCROLL);
WinQueryWindowPos(hHScroll, &vSwpHScroll); WinQueryWindowPos(hHScroll, &vSwpHScroll);
hVScroll = WinWindowFromID(m_hFrame, FID_VERTSCROLL); hVScroll = WinWindowFromID(GetHWND(), FID_VERTSCROLL);
WinQueryWindowPos(hVScroll, &vSwpVScroll); WinQueryWindowPos(hVScroll, &vSwpVScroll);
hMenuBar = WinWindowFromID(m_hFrame, FID_MENU); hMenuBar = WinWindowFromID(GetHWND(), FID_MENU);
WinQueryWindowPos(hMenuBar, &vSwpMenu); WinQueryWindowPos(hMenuBar, &vSwpMenu);
WinSetWindowPos( GetHwnd() WinSetWindowPos( GetHwnd()
,HWND_TOP ,HWND_TOP
@@ -674,20 +675,20 @@ void wxFrame::InternalSetMenuBar()
// //
// Set the parent and owner of the menubar to be the frame // Set the parent and owner of the menubar to be the frame
// //
if (!::WinSetParent(m_hMenu, m_hFrame, FALSE)) if (!::WinSetParent(m_hMenu, GetHWND(), FALSE))
{ {
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError); wxLogError("Error setting parent for submenu. Error: %s\n", sError);
} }
if (!::WinSetOwner(m_hMenu, m_hFrame)) if (!::WinSetOwner(m_hMenu, GetHWND()))
{ {
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError); wxLogError("Error setting parent for submenu. Error: %s\n", sError);
} }
WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
} // end of wxFrame::InternalSetMenuBar } // end of wxFrame::InternalSetMenuBar
// //
@@ -749,9 +750,9 @@ bool wxFrame::ShowFullScreen(
if (lStyle & wxFULLSCREEN_NOMENUBAR) if (lStyle & wxFULLSCREEN_NOMENUBAR)
{ {
::WinSetParent(m_hMenu, m_hFrame, FALSE); ::WinSetParent(m_hMenu, GetHWND(), FALSE);
::WinSetOwner(m_hMenu, m_hFrame); ::WinSetOwner(m_hMenu, GetHWND());
::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
} }
// //
@@ -864,9 +865,9 @@ bool wxFrame::ShowFullScreen(
if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0))
{ {
::WinSetParent(m_hMenu, m_hFrame, FALSE); ::WinSetParent(m_hMenu, GetHWND(), FALSE);
::WinSetOwner(m_hMenu, m_hFrame); ::WinSetOwner(m_hMenu, GetHWND());
::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
} }
Maximize(m_bFsIsMaximized); Maximize(m_bFsIsMaximized);
@@ -987,33 +988,16 @@ bool wxFrame::OS2Create(
// //
// Create the frame window // Create the frame window
// //
if ((m_hFrame = ::WinCreateWindow( hParent // Frame is parent
,WC_FRAME // standard frame class
,(PSZ)zTitle // Window title
,0 // No styles
,0, 0, 0, 0 // Window position
,NULLHANDLE // Owner
,HWND_TOP // Sibling
,(ULONG)nId // ID
,(PVOID)&vFrameCtlData // Creation data
,NULL // Window Pres Params
)) == 0L)
{
return FALSE;
}
if (!wxWindow::OS2Create( m_hFrame if (!wxWindow::OS2Create( hParent
,wxFrameClassName ,WC_FRAME
,NULL ,(PSZ)zTitle
,0L ,0
,0L ,0, 0, 0, 0
,0L ,NULLHANDLE
,0L
,0L
,m_hFrame
,HWND_TOP ,HWND_TOP
,(unsigned long)FID_CLIENT ,(ULONG)nId
,NULL ,(PVOID)&vFrameCtlData
,NULL ,NULL
)) ))
{ {
@@ -1023,7 +1007,8 @@ bool wxFrame::OS2Create(
// //
// Now size everything. If adding a menu the client will need to be resized. // Now size everything. If adding a menu the client will need to be resized.
// //
if (!::WinSetWindowPos( m_hFrame
if (!::WinSetWindowPos( GetHWND()
,HWND_TOP ,HWND_TOP
,nX ,nX
,nY ,nY
@@ -1033,10 +1018,10 @@ bool wxFrame::OS2Create(
)) ))
return FALSE; return FALSE;
uCtlCount = SHORT1FROMMP(::WinSendMsg(m_hFrame, WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect)); uCtlCount = SHORT1FROMMP(::WinSendMsg(GetHWND(), WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect));
for (int i = 0; i < uCtlCount; i++) for (int i = 0; i < uCtlCount; i++)
{ {
if (vSwp[i].hwnd == m_hFrame) if (vSwp[i].hwnd == GetHWND())
memcpy(&m_vSwp, &vSwp[i], sizeof(SWP)); memcpy(&m_vSwp, &vSwp[i], sizeof(SWP));
else if (vSwp[i].hwnd == m_hVScroll) else if (vSwp[i].hwnd == m_hVScroll)
memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP)); memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP));
@@ -1234,7 +1219,7 @@ bool wxFrame::OS2TranslateMessage(
return FALSE; return FALSE;
const wxAcceleratorTable& rAcceleratorTable = pMenuBar->GetAccelTable(); const wxAcceleratorTable& rAcceleratorTable = pMenuBar->GetAccelTable();
return rAcceleratorTable.Translate(m_hFrame, pMsg); return rAcceleratorTable.Translate(GetHWND(), pMsg);
} // end of wxFrame::OS2TranslateMessage } // end of wxFrame::OS2TranslateMessage
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -1244,7 +1229,7 @@ bool wxFrame::HandlePaint()
{ {
RECTL vRect; RECTL vRect;
if (::WinQueryUpdateRect(GetHwnd(), &vRect)) if (::WinQueryUpdateRect(GetHWND(), &vRect))
{ {
if (m_bIconized) if (m_bIconized)
{ {
@@ -1254,7 +1239,7 @@ bool wxFrame::HandlePaint()
HPOINTER hIcon; HPOINTER hIcon;
if (m_icon.Ok()) if (m_icon.Ok())
hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
else else
hIcon = (HPOINTER)m_hDefaultIcon; hIcon = (HPOINTER)m_hDefaultIcon;
@@ -1289,12 +1274,13 @@ bool wxFrame::HandlePaint()
} }
else else
{ {
/* DosBeep(500,500);
HPS hPS; HPS hPS;
RECTL vRect; RECTL vRect;
hPS = WinBeginPaint(GetHwnd(), 0L, &vRect); hPS = WinBeginPaint(GetHwnd(), 0L, &vRect);
WinFillRect(hPS, &vRect, SYSCLR_WINDOW); WinFillRect(hPS, &vRect, SYSCLR_WINDOW);
WinEndPaint(hPS); WinEndPaint(hPS);*/
return wxWindow::HandlePaint(); return wxWindow::HandlePaint();
} }
@@ -1429,8 +1415,9 @@ bool wxFrame::HandleMenuSelect(
, WXHMENU hMenu , WXHMENU hMenu
) )
{ {
int nMenuItem; // int nMenuItem;
/* This is wrong section according to IBM's documentation
if (nFlags == 0xFFFF && hMenu == 0) if (nFlags == 0xFFFF && hMenu == 0)
{ {
// //
@@ -1450,10 +1437,24 @@ bool wxFrame::HandleMenuSelect(
// //
return FALSE; return FALSE;
} }
wxMenuEvent vEvent(wxEVT_MENU_HIGHLIGHT, nMenuItem); */
vEvent.SetEventObject(this); if( !nFlags )
return GetEventHandler()->ProcessEvent(vEvent); {
MENUITEM mItem;
MRESULT rc;
rc = WinSendMsg(hMenu, MM_QUERYITEM, MPFROM2SHORT(nItem, TRUE), (MPARAM)&mItem);
if(rc && !(mItem.afStyle & (MIS_SUBMENU | MIS_SEPARATOR)))
{
wxMenuEvent vEvent(wxEVT_MENU_HIGHLIGHT, nItem);
vEvent.SetEventObject(this);
GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM
}
}
return TRUE;
} // end of wxFrame::HandleMenuSelect } // end of wxFrame::HandleMenuSelect
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -1514,6 +1515,7 @@ MRESULT wxFrame::OS2WindowProc(
,wFlags ,wFlags
,hMenu ,hMenu
); );
mRc = (MRESULT)TRUE;
} }
break; break;
@@ -1535,7 +1537,7 @@ MRESULT wxFrame::OS2WindowProc(
HPOINTER hIcon; HPOINTER hIcon;
if (m_icon.Ok()) if (m_icon.Ok())
hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
else else
hIcon = (HPOINTER)m_hDefaultIcon; hIcon = (HPOINTER)m_hDefaultIcon;
mRc = (MRESULT)hIcon; mRc = (MRESULT)hIcon;
@@ -1553,6 +1555,6 @@ MRESULT wxFrame::OS2WindowProc(
,wParam ,wParam
,lParam ,lParam
); );
return (MRESULT)0; return (MRESULT)mRc;
} // wxFrame::OS2WindowProc } // wxFrame::OS2WindowProc

View File

@@ -1031,7 +1031,7 @@ void wxMenuBar::Attach(
// Ensure the accelerator table is set to the frame (not the client!) // Ensure the accelerator table is set to the frame (not the client!)
// //
if (!::WinSetAccelTable( vHabmain if (!::WinSetAccelTable( vHabmain
,(HWND)pFrame->GetFrame() ,(HWND)pFrame->GetHWND()
,m_vAccelTable.GetHACCEL() ,m_vAccelTable.GetHACCEL()
)) ))
wxLogLastError("WinSetAccelTable"); wxLogLastError("WinSetAccelTable");

View File

@@ -306,8 +306,11 @@ wxWindow::~wxWindow()
if (m_parent) if (m_parent)
m_parent->RemoveChild(this); m_parent->RemoveChild(this);
DestroyChildren(); DestroyChildren();
if (m_hWnd) if (m_hWnd)
{ {
// UnsubclassWin();
if(!::WinDestroyWindow(GetHWND())) if(!::WinDestroyWindow(GetHWND()))
wxLogLastError(wxT("DestroyWindow")); wxLogLastError(wxT("DestroyWindow"));
// //
@@ -382,6 +385,7 @@ bool wxWindow::Create(
,NULLHANDLE ,NULLHANDLE
,m_windowId ,m_windowId
); );
return(TRUE); return(TRUE);
} // end of wxWindow::Create } // end of wxWindow::Create
@@ -714,28 +718,28 @@ void wxWindow::SubclassWin(
wxCHECK_RET(::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in SubclassWin") ); wxCHECK_RET(::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in SubclassWin") );
wxAssociateWinWithHandle(hwnd, this); // wxAssociateWinWithHandle(hwnd, this);
m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(hwnd, (PFNWP)wxWndProc); m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(hwnd, (PFNWP)wxWndProc);
::WinSetWindowULong(hwnd, QWS_USER, (ULONG)wxWndProc); // ::WinSetWindowULong(hwnd, QWL_USER, (ULONG)wxWndProc);
} // end of wxWindow::SubclassWin } // end of wxWindow::SubclassWin
void wxWindow::UnsubclassWin() void wxWindow::UnsubclassWin()
{ {
wxRemoveHandleAssociation(this); // wxRemoveHandleAssociation(this);
// //
// Restore old Window proc // Restore old Window proc
// //
HWND hwnd = GetHwnd(); HWND hwnd = GetHWND();
if (hwnd) if (m_hWnd)
{ {
m_hWnd = 0; // m_hWnd = 0;
wxCHECK_RET( ::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in UnsubclassWin") ); wxCHECK_RET( ::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in UnsubclassWin") );
PFNWP fnProc = (PFNWP)::WinQueryWindowULong(hwnd, QWS_USER); PFNWP fnProc = (PFNWP)::WinQueryWindowPtr(hwnd, QWP_PFNWP);
if ( (m_fnOldWndProc != 0) && (fnProc != (PFNWP) m_fnOldWndProc)) if ( (m_fnOldWndProc != 0) && (fnProc != (PFNWP) m_fnOldWndProc))
{ {
WinSubclassWindow(hwnd, (PFNWP)m_fnOldWndProc); WinSubclassWindow(hwnd, (PFNWP)m_fnOldWndProc);
@@ -1502,9 +1506,9 @@ MRESULT wxWindow::OS2DefWindowProc(
) )
{ {
if (m_fnOldWndProc) if (m_fnOldWndProc)
return ((MRESULT)m_fnOldWndProc()); return (MRESULT)m_fnOldWndProc(GetHWND(), (ULONG)uMsg, (MPARAM)wParam, (MPARAM)lParam);
else else
return (::WinDefWindowProc(GetHwnd(), (ULONG)uMsg, (MPARAM)wParam, (MPARAM)lParam)); return ::WinDefWindowProc(GetHWND(), (ULONG)uMsg, (MPARAM)wParam, (MPARAM)lParam);
} // end of wxWindow::OS2DefWindowProc } // end of wxWindow::OS2DefWindowProc
bool wxWindow::OS2ProcessMessage( bool wxWindow::OS2ProcessMessage(
@@ -1798,7 +1802,8 @@ MRESULT EXPENTRY wxWndProc(
pWnd->SetHWND((WXHWND)hWnd); pWnd->SetHWND((WXHWND)hWnd);
} }
MRESULT rc; MRESULT rc = (MRESULT)FALSE;
// //
// Stop right here if we don't have a valid handle in our wxWindow object. // Stop right here if we don't have a valid handle in our wxWindow object.
@@ -1813,7 +1818,7 @@ MRESULT EXPENTRY wxWndProc(
{ {
if (pWnd) if (pWnd)
rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam); rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
if (!rc) else
rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam); rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
} }
return rc; return rc;
@@ -1833,22 +1838,26 @@ MRESULT wxWindow::OS2WindowProc(
// Did we process the uMsg? // Did we process the uMsg?
// //
bool bProcessed = FALSE; bool bProcessed = FALSE;
bool bAllow;
MRESULT mResult;
WXHICON hIcon;
WXHBRUSH hBrush;
// //
// The return value // The return value
// //
union // union
{ // {
bool bAllow; // bool bAllow;
MRESULT mResult; // MRESULT mResult;
WXHICON hIcon; // WXHICON hIcon;
WXHBRUSH hBrush; // WXHBRUSH hBrush;
} vRc; // } vRc;
// //
// For most messages we should return 0 when we do process the message // For most messages we should return 0 when we do process the message
// //
vRc.mResult = (MRESULT)0; mResult = (MRESULT)0;
switch (uMsg) switch (uMsg)
{ {
@@ -1864,14 +1873,16 @@ MRESULT wxWindow::OS2WindowProc(
// //
// Return 0 to bAllow window creation // Return 0 to bAllow window creation
// //
vRc.mResult = (MRESULT)(bMayCreate ? 0 : -1); mResult = (MRESULT)(bMayCreate ? 0 : -1);
} }
} }
break; break;
case WM_DESTROY: case WM_DESTROY:
bProcessed = HandleDestroy(); HandleDestroy();
break; bProcessed = TRUE;
delete this;
break;
case WM_MOVE: case WM_MOVE:
bProcessed = HandleMove( LOWORD(lParam) bProcessed = HandleMove( LOWORD(lParam)
@@ -1900,6 +1911,7 @@ MRESULT wxWindow::OS2WindowProc(
bProcessed = HandleActivate( wState bProcessed = HandleActivate( wState
,(WXHWND)hWnd ,(WXHWND)hWnd
); );
bProcessed = FALSE;
} }
break; break;
@@ -1920,7 +1932,7 @@ MRESULT wxWindow::OS2WindowProc(
// ourselves in ~wxWindow // ourselves in ~wxWindow
// //
bProcessed = TRUE; bProcessed = TRUE;
vRc.mResult = (MRESULT)TRUE; mResult = (MRESULT)TRUE;
break; break;
case WM_SHOW: case WM_SHOW:
@@ -1987,14 +1999,14 @@ MRESULT wxWindow::OS2WindowProc(
} }
if ( bProcessed ) if ( bProcessed )
vRc.mResult = (MRESULT)TRUE; mResult = (MRESULT)TRUE;
} }
break; break;
case WM_QUERYDLGCODE: case WM_QUERYDLGCODE:
if ( m_lDlgCode ) if ( m_lDlgCode )
{ {
vRc.mResult = (MRESULT)m_lDlgCode; mResult = (MRESULT)m_lDlgCode;
bProcessed = TRUE; bProcessed = TRUE;
} }
// //
@@ -2093,7 +2105,7 @@ MRESULT wxWindow::OS2WindowProc(
#if defined(__VISAGECPP__) && (__IBMCPP__ >= 400) #if defined(__VISAGECPP__) && (__IBMCPP__ >= 400)
case WM_CTLCOLORCHANGE: case WM_CTLCOLORCHANGE:
{ {
bProcessed = HandleCtlColor(&vRc.hBrush); bProcessed = HandleCtlColor(&hBrush);
} }
break; break;
#endif #endif
@@ -2132,7 +2144,7 @@ MRESULT wxWindow::OS2WindowProc(
// //
// We processed the message, i.e. erased the background // We processed the message, i.e. erased the background
// //
vRc.mResult = (MRESULT)TRUE; mResult = (MRESULT)TRUE;
} }
break; break;
@@ -2147,7 +2159,7 @@ MRESULT wxWindow::OS2WindowProc(
if ( bProcessed ) if ( bProcessed )
{ {
// we never set focus from here // we never set focus from here
vRc.mResult = FALSE; mResult = FALSE;
} }
break; break;
@@ -2158,7 +2170,7 @@ MRESULT wxWindow::OS2WindowProc(
case WM_SYSVALUECHANGED: case WM_SYSVALUECHANGED:
// TODO: do something // TODO: do something
vRc.mResult = (MRESULT)TRUE; mResult = (MRESULT)TRUE;
break; break;
// //
@@ -2175,7 +2187,7 @@ MRESULT wxWindow::OS2WindowProc(
// processing this message - exactly what we need because we've // processing this message - exactly what we need because we've
// just set the cursor. // just set the cursor.
// //
vRc.mResult = (MRESULT)TRUE; mResult = (MRESULT)TRUE;
} }
break; break;
} }
@@ -2186,9 +2198,9 @@ MRESULT wxWindow::OS2WindowProc(
wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."), wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
wxGetMessageName(uMsg)); wxGetMessageName(uMsg));
#endif // __WXDEBUG__ #endif // __WXDEBUG__
vRc.mResult = OS2DefWindowProc(uMsg, wParam, lParam); mResult = OS2DefWindowProc(uMsg, wParam, lParam);
} }
return vRc.mResult; return mResult;
} // end of wxWindow::OS2WindowProc } // end of wxWindow::OS2WindowProc
// //
@@ -2414,6 +2426,12 @@ bool wxWindow::OS2Create(
wxAssociateWinWithHandle((HWND)m_hWnd wxAssociateWinWithHandle((HWND)m_hWnd
,this ,this
); );
//
// Now need to subclass window.
//
SubclassWin(GetHWND());
return TRUE; return TRUE;
} // end of wxWindow::OS2Create } // end of wxWindow::OS2Create
@@ -2806,11 +2824,11 @@ bool wxWindow::HandlePaint()
return FALSE; return FALSE;
} }
m_updateRegion = wxRegion(hRgn); m_updateRegion = wxRegion(hRgn);
/*
hPS = WinBeginPaint(GetHwnd(), 0L, &vRect); hPS = WinBeginPaint(GetHWND(), 0L, &vRect);
WinFillRect(hPS, &vRect, SYSCLR_WINDOW); WinFillRect(hPS, &vRect, SYSCLR_WINDOW);
WinEndPaint(hPS); WinEndPaint(hPS);
*/
vEvent.SetEventObject(this); vEvent.SetEventObject(this);
return (GetEventHandler()->ProcessEvent(vEvent)); return (GetEventHandler()->ProcessEvent(vEvent));
} // end of wxWindow::HandlePaint } // end of wxWindow::HandlePaint