📄 metal.cpp
字号:
x1++; x2++; } else { x1--; x2--; } } } // draw the shadow for the disabled one dcDisabled.SetPen(m_penHighlight); switch ( n ) { case Arrow_Left: y1 += 2; dcDisabled.DrawLine(x1, y1, x2, y2); break; case Arrow_Right: x1 = ARROW_LENGTH - 1; y1 = (ARROW_WIDTH - 1)/2 + 1; x2 = 0; y2 = ARROW_WIDTH; dcDisabled.DrawLine(x1, y1, x2, y2); dcDisabled.DrawLine(++x1, y1, x2, ++y2); break; case Arrow_Up: x1 += 2; dcDisabled.DrawLine(x1, y1, x2, y2); break; case Arrow_Down: x1 = ARROW_WIDTH - 1; y1 = 1; x2 = (ARROW_WIDTH - 1)/2; y2 = ARROW_LENGTH; dcDisabled.DrawLine(x1, y1, x2, y2); dcDisabled.DrawLine(++x1, y1, x2, ++y2); break; } // create the inverted bitmap but only for the right arrow as we only // use it for the menus if ( n == Arrow_Right ) { m_bmpArrows[Arrow_Inverted][n].Create(w, h); dcInverse.SelectObject(m_bmpArrows[Arrow_Inverted][n]); dcInverse.Clear(); dcInverse.Blit(0, 0, w, h, &dcNormal, 0, 0, wxXOR); dcInverse.SelectObject(wxNullBitmap); mask = new wxMask(m_bmpArrows[Arrow_Inverted][n], *wxBLACK); m_bmpArrows[Arrow_Inverted][n].SetMask(mask); m_bmpArrows[Arrow_InvertedDisabled][n].Create(w, h); dcInverse.SelectObject(m_bmpArrows[Arrow_InvertedDisabled][n]); dcInverse.Clear(); dcInverse.Blit(0, 0, w, h, &dcDisabled, 0, 0, wxXOR); dcInverse.SelectObject(wxNullBitmap); mask = new wxMask(m_bmpArrows[Arrow_InvertedDisabled][n], *wxBLACK); m_bmpArrows[Arrow_InvertedDisabled][n].SetMask(mask); } dcNormal.SelectObject(wxNullBitmap); dcDisabled.SelectObject(wxNullBitmap); mask = new wxMask(m_bmpArrows[Arrow_Normal][n], *wxWHITE); m_bmpArrows[Arrow_Normal][n].SetMask(mask); mask = new wxMask(m_bmpArrows[Arrow_Disabled][n], *wxWHITE); m_bmpArrows[Arrow_Disabled][n].SetMask(mask); m_bmpArrows[Arrow_Pressed][n] = m_bmpArrows[Arrow_Normal][n]; }}void wxMetalRenderer::DrawScrollbarThumb(wxDC& dc, wxOrientation WXUNUSED(orient), const wxRect& rect, int WXUNUSED(flags)){ // we don't use the flags, the thumb never changes appearance wxRect rectThumb = rect; DrawArrowBorder(dc, &rectThumb); DrawMetal(dc, rectThumb);}void wxMetalRenderer::DrawScrollbarShaft(wxDC& dc, wxOrientation WXUNUSED(orient), const wxRect& rectBar, int WXUNUSED(flags)){ DrawMetal(dc, rectBar);}void wxMetalRenderer::GetComboBitmaps(wxBitmap *bmpNormal, wxBitmap * WXUNUSED(bmpFocus), wxBitmap *bmpPressed, wxBitmap *bmpDisabled){ static const wxCoord widthCombo = 16; static const wxCoord heightCombo = 17; wxMemoryDC dcMem; if ( bmpNormal ) { bmpNormal->Create(widthCombo, heightCombo); dcMem.SelectObject(*bmpNormal); DrawArrowButton(dcMem, wxRect(0, 0, widthCombo, heightCombo), Arrow_Down, Arrow_Normal); } if ( bmpPressed ) { bmpPressed->Create(widthCombo, heightCombo); dcMem.SelectObject(*bmpPressed); DrawArrowButton(dcMem, wxRect(0, 0, widthCombo, heightCombo), Arrow_Down, Arrow_Pressed); } if ( bmpDisabled ) { bmpDisabled->Create(widthCombo, heightCombo); dcMem.SelectObject(*bmpDisabled); DrawArrowButton(dcMem, wxRect(0, 0, widthCombo, heightCombo), Arrow_Down, Arrow_Disabled); }}void wxMetalRenderer::DrawArrow(wxDC& dc, wxDirection dir, const wxRect& rect, int flags){ // get the bitmap for this arrow wxArrowDirection arrowDir; switch ( dir ) { case wxLEFT: arrowDir = Arrow_Left; break; case wxRIGHT: arrowDir = Arrow_Right; break; case wxUP: arrowDir = Arrow_Up; break; case wxDOWN: arrowDir = Arrow_Down; break; default: wxFAIL_MSG(_T("unknown arrow direction")); return; } wxArrowStyle arrowStyle; if ( flags & wxCONTROL_PRESSED ) { // can't be pressed and disabled arrowStyle = Arrow_Pressed; } else { arrowStyle = flags & wxCONTROL_DISABLED ? Arrow_Disabled : Arrow_Normal; } DrawArrowButton(dc, rect, arrowDir, arrowStyle);}//// protected functions//void wxMetalRenderer::DrawArrowButton(wxDC& dc, const wxRect& rectAll, wxArrowDirection arrowDir, wxArrowStyle arrowStyle){ wxRect rect = rectAll; DrawMetal( dc, rect ); DrawArrowBorder(dc, &rect, arrowStyle == Arrow_Pressed); DrawArrow(dc, rect, arrowDir, arrowStyle);}void wxMetalRenderer::DrawRect(wxDC& dc, wxRect *rect, const wxPen& pen){ // draw dc.SetPen(pen); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(*rect); // adjust the rect rect->Inflate(-1);}void wxMetalRenderer::DrawShadedRect(wxDC& dc, wxRect *rect, const wxPen& pen1, const wxPen& pen2){ // draw the rectangle dc.SetPen(pen1); dc.DrawLine(rect->GetLeft(), rect->GetTop(), rect->GetLeft(), rect->GetBottom()); dc.DrawLine(rect->GetLeft() + 1, rect->GetTop(), rect->GetRight(), rect->GetTop()); dc.SetPen(pen2); dc.DrawLine(rect->GetRight(), rect->GetTop(), rect->GetRight(), rect->GetBottom()); dc.DrawLine(rect->GetLeft(), rect->GetBottom(), rect->GetRight() + 1, rect->GetBottom()); // adjust the rect rect->Inflate(-1);}void wxMetalRenderer::DrawArrowBorder(wxDC& dc, wxRect *rect, bool isPressed){ if ( isPressed ) { DrawRect(dc, rect, m_penDarkGrey); // the arrow is usually drawn inside border of width 2 and is offset by // another pixel in both directions when it's pressed - as the border // in this case is more narrow as well, we have to adjust rect like // this: rect->Inflate(-1); rect->x++; rect->y++; } else { DrawShadedRect(dc, rect, m_penLightGrey, m_penBlack); DrawShadedRect(dc, rect, m_penHighlight, m_penDarkGrey); }}void wxMetalRenderer::DrawArrow(wxDC& dc, const wxRect& rect, wxArrowDirection arrowDir, wxArrowStyle arrowStyle){ const wxBitmap& bmp = m_bmpArrows[arrowStyle][arrowDir]; // under Windows the arrows always have the same size so just centre it in // the provided rectangle wxCoord x = rect.x + (rect.width - bmp.GetWidth()) / 2, y = rect.y + (rect.height - bmp.GetHeight()) / 2; // Windows does it like this... if ( arrowDir == Arrow_Left ) x--; // draw it dc.DrawBitmap(bmp, x, y, true /* use mask */);}// ----------------------------------------------------------------------------// metal gradient// ----------------------------------------------------------------------------void wxMetalRenderer::DrawMetal(wxDC &dc, const wxRect &rect ){ dc.SetPen(*wxTRANSPARENT_PEN); for (int y = rect.y; y < rect.height+rect.y; y++) { unsigned char intens = (unsigned char)(230 + 80 * (rect.y-y) / rect.height); dc.SetBrush( wxBrush( wxColour(intens,intens,intens), wxSOLID ) ); dc.DrawRectangle( rect.x, y, rect.width, 1 ); }}#endif // wxUSE_THEME_METAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -