void LoginForm::setFrameRegion() { #ifdef WIN32 wxRect wbr = getWindowsBorderRect(); wxPoint br = wbr.GetBottomRight(); br.x += 2; br.y += 2; wxRegion region = CreateRoundRectRgn(wbr.x, wbr.y, br.x, br.y, 5, 5); // Windows takes ownership of the region, so // we'll have to make a copy of the region to give to it. DWORD noBytes = ::GetRegionData(GetHrgnOf(region), 0, nullptr); RGNDATA *rgnData = (RGNDATA*) new char[noBytes]; ::GetRegionData(GetHrgnOf(region), noBytes, rgnData); HRGN hrgn = ::ExtCreateRegion(nullptr, noBytes, rgnData); delete[] (char*) rgnData; // Now call the shape API with the new region. ::SetWindowRgn((HWND)GetHWND(), hrgn, FALSE); #endif // LINUX TODO }
bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion& region) { // Windows takes ownership of the region, so // we'll have to make a copy of the region to give to it. DWORD noBytes = ::GetRegionData(GetHrgnOf(region), 0, NULL); RGNDATA *rgnData = (RGNDATA*) new char[noBytes]; ::GetRegionData(GetHrgnOf(region), noBytes, rgnData); HRGN hrgn = ::ExtCreateRegion(NULL, noBytes, rgnData); delete[] (char*) rgnData; // SetWindowRgn expects the region to be in coordinates // relative to the window, not the client area. const wxPoint clientOrigin = GetClientAreaOrigin(); ::OffsetRgn(hrgn, -clientOrigin.x, -clientOrigin.y); // Now call the shape API with the new region. if (::SetWindowRgn(GetHwnd(), hrgn, TRUE) == 0) { wxLogLastError(wxT("SetWindowRgn")); return false; } return true; }
bool wxSkinWindow::SetShape(const wxRegion& region) { #if defined(__WXMSW__) && !defined(__WXWINCE__) // The empty region signifies that the shape should be removed from the // window. if ( region.IsEmpty() ) { if (::SetWindowRgn(GetHwnd(), NULL, TRUE) == 0) { wxLogLastError(_T("SetWindowRgn")); return false; } return true; } DWORD noBytes = ::GetRegionData(GetHrgnOf(region), 0, NULL); RGNDATA *rgnData = (RGNDATA*) new char[noBytes]; ::GetRegionData(GetHrgnOf(region), noBytes, rgnData); HRGN hrgn = ::ExtCreateRegion(NULL, noBytes, rgnData); delete[] (char*) rgnData; RECT rect; DWORD dwStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE); DWORD dwExStyle = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE); ::GetClientRect(GetHwnd(), &rect); ::AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle); ::OffsetRgn(hrgn, -rect.left, -rect.top); if (::SetWindowRgn(GetHwnd(), hrgn, TRUE) == 0) { wxLogLastError(_T("SetWindowRgn")); return false; } return true; #elif defined(__WXMAC__) if ( region.IsEmpty() ) { wxSize sz = GetClientSize(); wxRegion rgn(0, 0, sz.x, sz.y); return SetShape(rgn); } // Make a copy of the region RgnHandle shapeRegion = NewRgn(); CopyRgn( (RgnHandle)region.GetWXHRGN(), shapeRegion ); // Dispose of any shape region we may already have RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)GetHandle() ); if ( oldRgn ) DisposeRgn(oldRgn); // Save the region so we can use it later SetWRefCon((WindowRef)GetHandle(), (SInt32)shapeRegion); // Tell the window manager that the window has changed shape ReshapeCustomWindow((WindowRef)GetHandle()); return true; #elif defined(__WXGTK__) if(region.IsEmpty()) { if(m_wxwindow && !GTK_WIDGET_NO_WINDOW(m_wxwindow)) gtk_widget_shape_combine_mask(m_wxwindow,NULL,0,0); if(m_widget && !GTK_WIDGET_NO_WINDOW(m_widget)) gtk_widget_shape_combine_mask(m_widget,NULL,0,0); } else { wxBitmap bmp = region.ConvertToBitmap(); bmp.SetMask(new wxMask(bmp, *wxBLACK)); GdkBitmap* mask = bmp.GetMask()->GetBitmap(); if(m_wxwindow && !GTK_WIDGET_NO_WINDOW(m_wxwindow)) gtk_widget_shape_combine_mask(m_wxwindow,mask,0,0); if(m_widget && !GTK_WIDGET_NO_WINDOW(m_widget)) gtk_widget_shape_combine_mask(m_widget,mask,0,0); } return true; #else return false; #endif }