From 008089f632e0cd66bd7ff23c5eb4ef13ee52c95c Mon Sep 17 00:00:00 2001 From: David Webster Date: Fri, 25 May 2001 21:12:00 +0000 Subject: [PATCH] Added some extended styles to OS/2 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10330 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/os2/private.h | 8 ++- include/wx/os2/window.h | 4 +- src/os2/utils.cpp | 78 ++++++++++++++++++++++++ src/os2/window.cpp | 127 ++++++++++++++++++++++++++++++++++++--- src/os2/wx23.def | 6 +- 5 files changed, 209 insertions(+), 14 deletions(-) diff --git a/include/wx/os2/private.h b/include/wx/os2/private.h index 3b943d0329..067a3ee8dd 100644 --- a/include/wx/os2/private.h +++ b/include/wx/os2/private.h @@ -117,7 +117,7 @@ extern LONG APIENTRY wxSubclassedGenericControlProc(WXHWND hWnd, WXDWORD message // --------------------------------------------------------------------------- #if !defined(WS_EX_CLIENTEDGE) - #define WS_EX_CLIENTEDGE 0 + #define WS_EX_CLIENTEDGE 0x00000200L #endif #ifndef ENDSESSION_LOGOFF @@ -183,6 +183,11 @@ extern "C" WXDLLEXPORT HINSTANCE wxGetInstance(); } +WXDLLEXPORT void wxDrawBorder( HPS hPS + ,RECTL& rRect + ,WXDWORD dwStyle + ); + WXDLLEXPORT void wxSetInstance(HINSTANCE hInst); WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd); @@ -227,5 +232,6 @@ inline bool wxStyleHasBorder(long style) wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0; } + #endif // _WX_PRIVATE_H_ diff --git a/include/wx/os2/window.h b/include/wx/os2/window.h index 323fa4570a..358c0e849a 100644 --- a/include/wx/os2/window.h +++ b/include/wx/os2/window.h @@ -260,6 +260,7 @@ public: ,unsigned long lId ,void* pCtlData = NULL ,void* pPresParams = NULL + ,WXDWORD dwExStyle = 0L ); virtual bool OS2Command( WXUINT uParam ,WXWORD nId @@ -463,12 +464,13 @@ protected: // the old window proc (we subclass all windows) WXFARPROC m_fnOldWndProc; - // additional (MSW specific) flags + // additional (OS2 specific) flags bool m_bUseCtl3D:1; // Using CTL3D for this control bool m_bBackgroundTransparent:1; bool m_bMouseInWindow:1; bool m_bDoubleClickAllowed:1; bool m_bWinCaptured:1; + WXDWORD m_dwExStyle; // the size of one page for scrolling int m_nXThumbSize; diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index 94a7823eeb..5b5dc109cf 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -950,4 +950,82 @@ wxString WXDLLEXPORT wxPMErrorToStr( return(sError); } // end of wxPMErrorToStr +void wxDrawBorder( + HPS hPS +, RECTL& rRect +, WXDWORD dwStyle +) +{ + POINTL vPoint[2]; + + vPoint[0].x = rRect.xLeft; + vPoint[0].y = rRect.yBottom; + ::GpiMove(hPS, &vPoint[0]); + if (dwStyle & wxSIMPLE_BORDER || + dwStyle & wxSTATIC_BORDER) + { + vPoint[1].x = rRect.xRight; + vPoint[1].y = rRect.yTop; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + } + if (dwStyle & wxSUNKEN_BORDER) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00FFFFFF; // White + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[1].x = rRect.xRight; + vPoint[1].y = rRect.yTop; + ::GpiBox( hPS + ,DRO_OUTLINE + ,&vPoint[1] + ,0L + ,0L + ); + vLineBundle.lColor = 0x00000000; // BLACK + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 2; + vLineBundle.lGeomWidth = 2; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + vPoint[0].x = rRect.xLeft + 2; + vPoint[0].y = rRect.yBottom + 2; + ::GpiMove(hPS, &vPoint[0]); + vPoint[1].x = rRect.xLeft + 2; + vPoint[1].y = rRect.yTop - 2; + ::GpiLine(hPS, &vPoint[1]); + vPoint[1].x = rRect.xRight - 2; + vPoint[1].y = rRect.yTop - 2; + ::GpiLine(hPS, &vPoint[1]); + } + if (dwStyle & wxDOUBLE_BORDER) + { + } + if (dwStyle & wxRAISED_BORDER) + { + } +} // end of wxDrawBorder diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 2aef2aaeff..14abb69cd1 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -399,11 +399,18 @@ bool wxWindow::Create( ulCreateFlags |= WS_CLIPCHILDREN; // - // Empty stuff for now since PM has no custome 3D effects - // Doesn't mean someone cannot make some up though + // // bool bWant3D; - WXDWORD dwExStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &bWant3D); + WXDWORD dwExStyle = Determine3DEffects( WS_EX_CLIENTEDGE + ,&bWant3D + ); + + // + // Add the simple border style as we'll use this to draw borders + // + if (lStyle & wxSIMPLE_BORDER) + dwExStyle |= wxSIMPLE_BORDER; // // Generic OS/2 Windows are created with no owner, no Z Order, no Control data, @@ -420,6 +427,9 @@ bool wxWindow::Create( ,NULLHANDLE ,NULLHANDLE ,m_windowId + ,NULL + ,NULL + ,dwExStyle ); return(TRUE); @@ -992,16 +1002,32 @@ WXDWORD wxWindow::MakeExtendedStyle( ) { // - // PM does not support extended style + // Simply fill out with wxWindow extended styles. We'll conjure + // something up in OS2Create and all window redrawing pieces later // - WXDWORD exStyle = 0; - return exStyle; + WXDWORD dwStyle = 0; + + if (lStyle & wxTRANSPARENT_WINDOW ) + dwStyle |= wxTRANSPARENT_WINDOW; + + if (!bEliminateBorders) + { + if (lStyle & wxSUNKEN_BORDER) + dwStyle |= wxSUNKEN_BORDER; + if (lStyle & wxDOUBLE_BORDER) + dwStyle |= wxDOUBLE_BORDER; + if (lStyle & wxRAISED_BORDER ) + dwStyle |= wxRAISED_BORDER; + if (lStyle & wxSTATIC_BORDER) + dwStyle |= wxSTATIC_BORDER; + } + return dwStyle; } // end of wxWindow::MakeExtendedStyle // -// Determines whether native 3D effects or CTL3D should be used, +// Determines whether simulated 3D effects or CTL3D should be used, // applying a default border style if required, and returning an extended -// style to pass to CreateWindowEx. +// style to pass to OS2Create. // WXDWORD wxWindow::Determine3DEffects( WXDWORD dwDefaultBorderStyle @@ -1011,9 +1037,65 @@ WXDWORD wxWindow::Determine3DEffects( WXDWORD dwStyle = 0L; // - // Native PM does not have any specialize 3D effects like WIN32 does + // Native PM does not have any specialize 3D effects like WIN32 does, + // so we have to try and invent them. + // + + // + // If matches certain criteria, then assume no 3D effects + // unless specifically requested (dealt with in MakeExtendedStyle) + // + if (!GetParent() || + !IsKindOf(CLASSINFO(wxControl)) || + (m_windowStyle & wxNO_BORDER) + ) + { + *pbWant3D = FALSE; + return MakeExtendedStyle(m_windowStyle, FALSE); + } + + // + // 1) App can specify global 3D effects // - *pbWant3D = FALSE; + *pbWant3D = wxTheApp->GetAuto3D(); + + // + // 2) If the parent is being drawn with user colours, or simple border + // specified, switch effects off. + // + if (GetParent() && + (GetParent()->GetWindowStyleFlag() & wxUSER_COLOURS) || + (m_windowStyle & wxSIMPLE_BORDER) + ) + *pbWant3D = FALSE; + + // + // 3) Control can override this global setting by defining + // a border style, e.g. wxSUNKEN_BORDER + // + if ((m_windowStyle & wxDOUBLE_BORDER) || + (m_windowStyle & wxRAISED_BORDER) || + (m_windowStyle & wxSTATIC_BORDER) || + (m_windowStyle & wxSUNKEN_BORDER) + ) + *pbWant3D = TRUE; + + dwStyle = MakeExtendedStyle( m_windowStyle + ,FALSE + ); + + // + // If we want 3D, but haven't specified a border here, + // apply the default border style specified. + // + if (dwDefaultBorderStyle && (*pbWant3D) && + !((m_windowStyle & wxDOUBLE_BORDER) || + (m_windowStyle & wxRAISED_BORDER) || + (m_windowStyle & wxSTATIC_BORDER) || + (m_windowStyle & wxSIMPLE_BORDER) + ) + ) + dwStyle |= dwDefaultBorderStyle; return dwStyle; } // end of wxWindow::Determine3DEffects @@ -2581,6 +2663,7 @@ bool wxWindow::OS2Create( , unsigned long ulId , void* pCtlData , void* pPresParams +, WXDWORD dwExStyle ) { ERRORID vError; @@ -2669,6 +2752,7 @@ bool wxWindow::OS2Create( wxLogError("Can't create window of class %s!. Error: %s\n", zClass, sError); return FALSE; } + m_dwExStyle = dwExStyle; ::WinSetWindowULong(m_hWnd, QWL_USER, (ULONG) this); wxWndHook = NULL; @@ -3236,6 +3320,29 @@ bool wxWindow::HandlePaint() ); ::WinFillRect(hPS, &vRect, GetBackgroundColour().GetPixel()); + + if (m_dwExStyle) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00000000; // Black + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 1; + vLineBundle.lGeomWidth = 1; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + wxDrawBorder( hPS + ,vRect + ,m_dwExStyle + ); + } ::WinEndPaint(hPS); } } diff --git a/src/os2/wx23.def b/src/os2/wx23.def index 88516a1957..4767d69b28 100644 --- a/src/os2/wx23.def +++ b/src/os2/wx23.def @@ -13469,6 +13469,8 @@ EXPORTS wxGetResource__FRC8wxStringT1PfT1 ;wxGetMousePosition(int*,int*) wxGetMousePosition__FPiT1 + ;wxDrawBorder(unsigned long,_RECTL&,unsigned long) + wxDrawBorder__FUlR6_RECTLT1 ;wxPathExists(const wxString&) wxPathExists__FRC8wxString ;wxGetWindowText(unsigned long) @@ -13786,8 +13788,8 @@ EXPORTS GetCharWidth__8wxWindowCFv ;wxWindowBase::FindFocus() FindFocus__12wxWindowBaseFv - ;wxWindow::OS2Create(unsigned long,char*,const char*,unsigned long,long,long,long,long,unsigned long,unsigned long,unsigned long,void*,void*) - OS2Create__8wxWindowFUlPcPCcT1lN35N31PvT12_ + ;wxWindow::OS2Create(unsigned long,char*,const char*,unsigned long,long,long,long,long,unsigned long,unsigned long,unsigned long,void*,void*,unsigned long) + OS2Create__8wxWindowFUlPcPCcT1lN35N31PvT12_T1 ;wxWindow::sm_eventTableEntries sm_eventTableEntries__8wxWindow ;wxWindow::SetTitle(const wxString&) -- 2.45.2