⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metal.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    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 + -