亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

MFC:三角形按鈕(重繪CButton)

2019-11-14 09:49:46
字體:
來源:轉載
供稿:網友

頭文件 TriangleButton.h:

#ifndef __TRIANGLEBUTTON_H__INCLUDED#define __TRIANGLEBUTTON_H__INCLUDEDenum POINTDIRECTION { POINT_UP, POINT_DOWN, POINT_LEFT, POINT_RIGHT };class CTriangleButton : public CButton{public:    CTriangleButton();    virtual ~CTriangleButton();PRotected:    POINTDIRECTION PointDirection;    CRgn CurrentRegion;public:    public:    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);    protected:    virtual void PreSubclassWindow();    BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );public:    void SetDirection(POINTDIRECTION PointDirection);    //sets the direction of triangle    POINTDIRECTION GetDirection();                        //gets the direction of triangleprotected:    DECLARE_MESSAGE_MAP()};#endif

源文件 TriangleButton.cpp:

#include "stdafx.h"#include "math.h"#include "TriangleButton.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifCTriangleButton::CTriangleButton(){    PointDirection = POINT_RIGHT;}CTriangleButton::~CTriangleButton(){}BEGIN_MESSAGE_MAP(CTriangleButton, CButton)    ON_WM_NCHITTEST()END_MESSAGE_MAP()void CTriangleButton::SetDirection(POINTDIRECTION Direction){    PointDirection = Direction;    PreSubclassWindow();}POINTDIRECTION CTriangleButton::GetDirection(){    return PointDirection;}BOOL CTriangleButton::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags){    //Size must be dividable by two (else triangle will look strange when drawn)    cx -= cx % 2;     cy -= cy % 2;    return CButton::SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);}// CRoundButton message handlersvoid CTriangleButton::PreSubclassWindow() {    CButton::PreSubclassWindow();    CRect rect;    GetClientRect(rect);    rect.bottom = rect.right = min(rect.bottom, rect.right);    //make it square    rect.bottom -= rect.bottom % 2;     rect.right  -= rect.right % 2;    SetWindowPos(NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE | SWP_NOZORDER);    CPoint Head, RightLeg, LeftLeg;    switch (PointDirection)    {        case POINT_UP :            {                Head.x = rect.right / 2;                 Head.y = 0;                RightLeg.x = rect.right;                 RightLeg.y = rect.bottom;                LeftLeg.x = 0;                 LeftLeg.y = rect.bottom;            }            break;        case POINT_DOWN :            {                Head.x = rect.right / 2;                 Head.y = rect.bottom;                RightLeg.x = 0;                 RightLeg.y = 0;                LeftLeg.x = rect.right;                LeftLeg.y = 0;            }            break;        case POINT_LEFT :            {                Head.x = 0;                 Head.y = rect.bottom / 2;                RightLeg.x = rect.right;                 RightLeg.y = 0;                LeftLeg.x = rect.right;                 LeftLeg.y = rect.bottom;            }            break;        case POINT_RIGHT :            {                Head.x = rect.right;                 Head.y = rect.bottom / 2;                RightLeg.x = 0;                 RightLeg.y = rect.bottom;                LeftLeg.x = 0;                 LeftLeg.y = 0;            }            break;        default :            ASSERT(FALSE);    }//switch                                CPoint points[3];    points[0] = Head;     points[1] = RightLeg;     points[2] = LeftLeg;        SetWindowRgn(NULL, FALSE);    CurrentRegion.DeleteObject();    CurrentRegion.CreatePolygonRgn(points, 3, ALTERNATE);    SetWindowRgn(CurrentRegion, TRUE);            ModifyStyle(0, BS_OWNERDRAW);}void CTriangleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {    ASSERT(lpDrawItemStruct != NULL);    CRect rect = lpDrawItemStruct->rcItem;    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);    UINT state = lpDrawItemStruct->itemState;    UINT nStyle = GetStyle();    int nSavedDC = pDC->SaveDC();    //make the rect a square    rect.bottom = rect.right = min(rect.bottom, rect.right);    pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE));        rect.right -= 1; rect.bottom -= 1;    //avoid drawing outside area    CPen HighlightPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DHIGHLIGHT));    CPen DarkShadowPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DDKSHADOW));    CPen ShadowPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));    CPen BlackPen(PS_SOLID, 1, RGB(0,0,0));    CPen FocusPen(PS_DOT, 0, RGB(0,0,0));    //Draw button    switch (PointDirection)     {        case POINT_UP :         {            if (nStyle & BS_FLAT)             {                pDC->SelectObject(BlackPen);                pDC->MoveTo(rect.right / 2, 0);                pDC->LineTo(0, rect.bottom);                pDC->LineTo(rect.right, rect.bottom);                pDC->LineTo(rect.right / 2, 0);                pDC->SelectObject(HighlightPen);                pDC->MoveTo(rect.right / 2, 2);                pDC->LineTo(2, rect.bottom - 1);                pDC->LineTo(rect.right - 2, rect.bottom - 1);                pDC->LineTo(rect.right / 2, 2);            }            else             {                if ((state & ODS_SELECTED))                    {                    pDC->SelectObject(HighlightPen);                    pDC->MoveTo(0, rect.bottom);                    pDC->LineTo(rect.right - 1, rect.bottom);                    pDC->LineTo(rect.right / 2, 0);                    pDC->SelectObject(ShadowPen);                    pDC->LineTo(0, rect.bottom);                                                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(rect.right / 2 - 1, 4);                    pDC->LineTo(1, rect.bottom);                }                else                {                    pDC->SelectObject(HighlightPen);                    pDC->MoveTo(rect.right /2, 0);                    pDC->LineTo(0, rect.bottom - 1);                                        pDC->SelectObject(ShadowPen);                    pDC->LineTo(rect.right - 1, rect.bottom - 1);                    pDC->LineTo(rect.right / 2, 0);                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(rect.right / 2 + 2, 3);                    pDC->LineTo(rect.right + 1, rect.bottom + 1);                                        pDC->MoveTo(rect.right - 1, rect.bottom);                    pDC->LineTo(1, rect.bottom);                }            }        }        break;        case POINT_DOWN :         {            if (nStyle & BS_FLAT)            {                pDC->SelectObject(BlackPen);                pDC->MoveTo(rect.right / 2, rect.bottom);                pDC->LineTo(0, 0);                pDC->LineTo(rect.right, 0);                pDC->LineTo(rect.right / 2, rect.bottom);                                pDC->SelectObject(HighlightPen);                pDC->MoveTo(rect.right / 2, rect.bottom - 2);                pDC->LineTo(2, 1);                pDC->LineTo(rect.right - 2, 1);                pDC->LineTo(rect.right / 2, rect.bottom - 2);            }            else            {                if ((state & ODS_SELECTED))                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(rect.right, 1);                    pDC->LineTo(1, 1);                    pDC->LineTo(rect.right / 2, rect.bottom - 1);                                        pDC->SelectObject(BlackPen);                    pDC->MoveTo(rect.right - 2, 2);                    pDC->LineTo(1, 2);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(rect.right + 1, 0);                    pDC->LineTo(rect.right / 2 + 1, rect.bottom + 1);                }                else                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(0, 0);                    pDC->LineTo(rect.right / 2, rect.bottom);                    pDC->LineTo(rect.right, 0);                    pDC->MoveTo(1, 1);                    pDC->LineTo(rect.right / 2 + 1, rect.bottom);                                        pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(rect.right, 2);                    pDC->LineTo(rect.right / 2 + 1, rect.bottom + 1);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(0, 0);                    pDC->LineTo(rect.right, 0);                                }            }        }        break;        case POINT_LEFT :        {            if (nStyle & BS_FLAT)            {                pDC->SelectObject(BlackPen);                pDC->MoveTo(rect.right, 0);                pDC->LineTo(0, rect.bottom / 2);                pDC->LineTo(rect.right, rect.bottom);                pDC->LineTo(rect.right, 0);                                pDC->SelectObject(HighlightPen);                pDC->MoveTo(rect.right - 1, 2);                pDC->LineTo(3, rect.bottom / 2);                pDC->LineTo(rect.right - 1, rect.bottom - 2);                pDC->LineTo(rect.right - 1, 2);            }            else            {                if ((state & ODS_SELECTED))                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(rect.right, 0);                    pDC->LineTo(0, rect.bottom / 2);                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(rect.right, 1);                    pDC->LineTo(2, rect.bottom / 2);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(rect.right, 0);                    pDC->LineTo(rect.right, rect.bottom);                    pDC->LineTo(0, rect.bottom / 2);                }                else                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(rect.right - 1, 0);                    pDC->LineTo(rect.right - 1, rect.bottom - 1);                    pDC->LineTo(0, rect.bottom / 2);                    pDC->MoveTo(1, rect.bottom / 2 + 1);                    pDC->LineTo(6, rect.bottom / 2 + 4);                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(rect.right, 1);                    pDC->LineTo(rect.right, rect.bottom);                    pDC->LineTo(2, rect.bottom / 2 + 2);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(0, rect.bottom / 2);                    pDC->LineTo(rect.right, 0);                }            }        }        break;        case POINT_RIGHT :        {            if (nStyle & BS_FLAT)            {                pDC->SelectObject(BlackPen);                pDC->MoveTo(0, 0);                pDC->LineTo(rect.right, rect.bottom / 2);                pDC->LineTo(0, rect.bottom);                pDC->LineTo(0, 0);                                pDC->SelectObject(HighlightPen);                pDC->MoveTo(1, 2);                pDC->LineTo(rect.right - 2, rect.bottom / 2);                pDC->LineTo(1, rect.bottom - 2);                pDC->LineTo(1, 2);            }            else            {                if ((state & ODS_SELECTED))                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(0, rect.bottom);                    pDC->LineTo(0, 0);                    pDC->LineTo(rect.right, rect.bottom / 2);                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(1, rect.bottom - 2);                    pDC->LineTo(1, 1);                    pDC->MoveTo(rect.right - 3, rect.bottom / 2);                    pDC->LineTo(0, 1);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(0, rect.bottom);                    pDC->LineTo(rect.right, rect.bottom / 2);                                    }                else                {                    pDC->SelectObject(ShadowPen);                    pDC->MoveTo(0, rect.bottom);                    pDC->LineTo(rect.right, rect.bottom / 2);                    pDC->SelectObject(DarkShadowPen);                    pDC->MoveTo(0, rect.bottom + 1);                    pDC->LineTo(rect.right, rect.bottom / 2 + 1);                                        pDC->SelectObject(HighlightPen);                    pDC->MoveTo(0, rect.bottom);                    pDC->LineTo(0, 0);                    pDC->LineTo(rect.right, rect.bottom / 2);                }            }        }        break;        default :            ASSERT(FALSE);    }//switch    //Draw text    CString strText;    GetWindowText(strText);    if (!strText.IsEmpty())    {        CSize TextExtent = pDC->GetTextExtent(strText);        CPoint TextPos;        pDC->SetBkMode(TRANSPARENT);        switch (PointDirection)        {            case POINT_UP :            {                TextPos = CPoint((int)(rect.right / 2.0 - TextExtent.cx / 2.0), rect.bottom - (int)(rect.bottom / 5.0 + TextExtent.cy));                int iXLimit = (int)((rect.bottom / 5.0 + TextExtent.cy) * 4.0 / 7.0);                CRgn rgn;                 rgn.CreateRectRgn(iXLimit, TextPos.y, rect.right - iXLimit, rect.bottom - 2);                pDC->SelectClipRgn(&rgn);                        }            break;            case POINT_DOWN :            {                TextPos = CPoint((int)(rect.right / 2.0 - TextExtent.cx / 2.0), (int)(rect.bottom / 5.0));                int iXLimit = (int)((rect.bottom / 5.0 + TextExtent.cy) * 4.0 / 7.0);                CRgn rgn; rgn.CreateRectRgn(iXLimit, (int)(rect.bottom / 5.0), rect.right - iXLimit, (int)(rect.bottom / 5.0) + TextExtent.cy + 2);                pDC->SelectClipRgn(&rgn);            }            break;            case POINT_LEFT :            {                TextPos = CPoint((int)((rect.right / 2.0 - TextExtent.cx / 2.0) + (rect.right / 8.0)), (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0) );                int iXLimitLeft = (int)(TextExtent.cy / 2.0 * 7.0 / 4.0) + 4;                int iXLimitRight = rect.right - 4;                            CRgn rgn; rgn.CreateRectRgn(iXLimitLeft, (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0), iXLimitRight, (int)(rect.bottom / 2.0 + TextExtent.cy / 2.0) );                pDC->SelectClipRgn(&rgn);            }            break;            case POINT_RIGHT :            {                TextPos = CPoint((int)((rect.right / 2.0 - TextExtent.cx / 2.0) - (rect.right / 8.0)), (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0) );                int iXLimitLeft = 4;                int iXLimitRight = rect.right - (int)(TextExtent.cy / 2.0 * 7.0 / 4.0) - 4;                                    CRgn rgn; rgn.CreateRectRgn(iXLimitLeft, (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0), iXLimitRight, (int)(rect.bottom / 2.0 + TextExtent.cy / 2.0) );                pDC->SelectClipRgn(&rgn);            }            break;            default :                ASSERT(FALSE);        }//switch        //common for all directions        if (state & ODS_SELECTED)        {            TextPos.Offset(1,1);        }        if (state & ODS_DISABLED)        {            pDC->DrawState(TextPos, TextExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);        }        else        {            pDC->TextOut(TextPos.x, TextPos.y, strText);        }    }    //Draw the focus triangle on the inside of the button if we have focus    if ((state & ODS_FOCUS))    {        CRgn rgn;         rgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);        pDC->SelectClipRgn(&rgn);        pDC->SelectObject(FocusPen);        switch (PointDirection)        {            case POINT_UP:            {                pDC->MoveTo(rect.right / 2, 12);                pDC->LineTo(9, rect.bottom - 6);                pDC->LineTo(rect.right - 9, rect.bottom - 6);                pDC->LineTo(rect.right / 2, 12);            }            break;            case POINT_DOWN:            {                pDC->MoveTo(rect.right / 2 + 1, rect.bottom - 13);                pDC->LineTo(10, 6);                pDC->LineTo(rect.right - 9, 6);                pDC->LineTo(rect.right / 2 + 1, rect.bottom - 13);            }            break;            case POINT_LEFT:            {                pDC->MoveTo(12, rect.bottom / 2);                pDC->LineTo(rect.right - 6, 9);                pDC->LineTo(rect.right - 6, rect.bottom - 9);                pDC->LineTo(12, rect.bottom / 2);            }            break;            case POINT_RIGHT:            {                pDC->MoveTo(6, 9);                pDC->LineTo(rect.right - 12, rect.bottom / 2);                pDC->LineTo(6, rect.bottom - 9);                pDC->LineTo(6, 9);            }            break;            default:                ASSERT(FALSE);        }//switch    }    pDC->RestoreDC(nSavedDC);}


上一篇:[leetcode]494. Target Sum

下一篇:策略模式

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
毛片精品免费在线观看| 亚洲成人免费在线视频| 久久久精品一区| 国产一区二区动漫| 欧美大片在线免费观看| 欧美一区二区三区免费观看| 欧美日韩xxxxx| 日本精品久久中文字幕佐佐木| 国产日本欧美一区二区三区在线| 伊人伊成久久人综合网小说| 亚洲欧美精品伊人久久| 亚洲人成网站色ww在线| 日韩精品极品在线观看| 日韩一区视频在线| 美女扒开尿口让男人操亚洲视频网站| 日韩av不卡在线| 91精品国产九九九久久久亚洲| 欧美精品久久久久| 亚洲免费视频一区二区| 亚洲综合社区网| 国产va免费精品高清在线观看| 亚洲精品美女在线观看| 欧美精品在线观看| 91精品国产综合久久久久久蜜臀| 国产精品久久久久久久天堂| 成人免费观看网址| 欧美中文字幕第一页| 精品久久久久久久久中文字幕| 国产成人亚洲精品| 久久久久久久一区二区三区| 国产亚洲精品久久久优势| 亚洲一区二区三区sesese| 久久久精品国产| 色妞欧美日韩在线| 国产精品久久久久久一区二区| 成人免费大片黄在线播放| 88国产精品欧美一区二区三区| 国产亚洲在线播放| 亚洲国产毛片完整版| 亚洲一区亚洲二区亚洲三区| 国产精品视频免费观看www| 亚洲成人动漫在线播放| 8050国产精品久久久久久| 亚洲色图在线观看| 精品性高朝久久久久久久| 精品久久久久人成| 日韩经典中文字幕| 欧美国产日韩xxxxx| 国产日本欧美一区二区三区| 日本亚洲欧美三级| 日韩av在线天堂网| 欧美日韩性视频在线| 日韩中文av在线| 欧美日韩亚洲一区二区三区| 欧美黄色www| 最近2019中文字幕大全第二页| 尤物tv国产一区| 欧美激情综合色综合啪啪五月| 国产91成人video| 欧美精品成人在线| 亚洲成人精品视频在线观看| 中文字幕不卡在线视频极品| 久久久久久美女| 亚洲第一级黄色片| 国产精品影片在线观看| 久久综合色影院| 疯狂做受xxxx高潮欧美日本| 中文字幕亚洲在线| 91成人天堂久久成人| 国产日韩av高清| 性色av一区二区三区红粉影视| 久久99亚洲热视| 欧美精品日韩三级| 国产精品久久久久久久久久久不卡| 国产精品视频导航| 亚洲精品v欧美精品v日韩精品| 日韩在线精品视频| 欧美激情一区二区三级高清视频| 亚洲韩国欧洲国产日产av| 亚洲美女动态图120秒| 欧美电影在线观看完整版| 91精品在线一区| 欧美国产亚洲精品久久久8v| 中文字幕亚洲欧美一区二区三区| 国产一区二区成人| 亚洲韩国青草视频| 亚洲国产精品久久精品怡红院| 性色av香蕉一区二区| 欧美日韩国产一区在线| 欧美在线观看网址综合| 日本中文字幕成人| 日本19禁啪啪免费观看www| 在线精品高清中文字幕| 亚洲精品美女视频| 亚洲欧美制服另类日韩| 国产亚洲一区二区精品| 国产一区视频在线播放| 4k岛国日韩精品**专区| 精品亚洲va在线va天堂资源站| 亚洲第一网中文字幕| 欧美日韩裸体免费视频| 日韩免费在线视频| 在线电影欧美日韩一区二区私密| 欧美乱大交xxxxx另类电影| 97视频在线观看成人| 欧美精品一本久久男人的天堂| 日韩成人在线观看| 精品视频在线播放免| 欧美性猛交丰臀xxxxx网站| 欧美一级电影在线| 欧美午夜精品在线| 久久综合久久88| 亚洲摸下面视频| 国产成人精品a视频一区www| 国产亚洲欧美日韩美女| 最近2019年中文视频免费在线观看| 超碰91人人草人人干| 亚洲人成免费电影| 91在线视频成人| 情事1991在线| 成人国内精品久久久久一区| 亚洲综合在线中文字幕| 国产精品福利观看| 91精品久久久久久久久久另类| 亚洲欧美日韩中文视频| 久久中文字幕在线| 亚洲一区二区免费在线| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲精品免费一区二区三区| 欧美亚洲国产日韩2020| 亚洲视频在线观看免费| 一夜七次郎国产精品亚洲| 韩国一区二区电影| 视频在线观看一区二区| 亚洲性xxxx| 国产一区二区三区三区在线观看| 日韩av在线看| 97在线观看视频| 91夜夜未满十八勿入爽爽影院| 日韩大片免费观看视频播放| 国产精品成人观看视频国产奇米| 欧美国产日韩一区| 亚洲欧美中文在线视频| 成人444kkkk在线观看| 欧美一级黄色网| 欧美性xxxx| 亚洲国产日韩欧美在线图片| 国产午夜精品免费一区二区三区| 国内精品国产三级国产在线专| 96精品视频在线| 亚洲韩国欧洲国产日产av| 美女精品久久久| 久久99国产精品久久久久久久久| 91成人国产在线观看| 久久视频中文字幕| 久久精品视频99| 欧美黑人视频一区| 国产精品成人久久久久| 日韩美女毛茸茸| 欧美日韩国产123| 欧美激情一级精品国产| 国产精品视频资源| 久久91精品国产| 久久精品国产欧美激情|