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

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

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

2019-11-14 08:53:40
字體:
來源:轉載
供稿:網友

頭文件 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);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人拍精品视频午夜网站| 久久久久久久香蕉网| 色哟哟网站入口亚洲精品| 91精品久久久久久久久| 日韩精品久久久久久久玫瑰园| 久久久久久网址| 成人自拍性视频| 欧美中文字幕第一页| 色妞色视频一区二区三区四区| 亚洲永久在线观看| 68精品久久久久久欧美| 国产精品第一第二| 欧美精品video| 精品视频偷偷看在线观看| 97在线视频国产| 久久视频这里只有精品| 国产精品久久二区| 精品久久久一区二区| 91久久国产精品91久久性色| 亚洲欧美中文日韩在线| 国产精品吴梦梦| 精品久久久国产精品999| 最新亚洲国产精品| 欧美xxxx14xxxxx性爽| 亚洲精品一区二区三区婷婷月| 精品视频久久久| 在线观看欧美日韩| 欧美激情女人20p| 在线精品视频视频中文字幕| 一二美女精品欧洲| 日韩欧美黄色动漫| 亚洲国产精品久久久久秋霞蜜臀| 久久精品国产一区二区电影| 久久久久久91| 欧美成人午夜激情| 国产精品三级久久久久久电影| 亚洲成人国产精品| 亚洲激情第一页| 日韩视频永久免费观看| 亚洲美腿欧美激情另类| 欧美人与性动交| 91精品久久久久久综合乱菊| 日韩中文在线不卡| 精品国产一区二区三区久久久| 国产午夜精品一区二区三区| 日韩高清欧美高清| 欧美成人精品xxx| 456国产精品| 中文字幕无线精品亚洲乱码一区| 亚洲毛片在线观看| 成人免费福利视频| 国产成人精品一区二区在线| 亚洲第一区在线观看| 狠狠综合久久av一区二区小说| 亚洲国产精品一区二区久| 色偷偷av一区二区三区乱| 日韩成人在线观看| 中文字幕国产精品| 国产乱肥老妇国产一区二| 情事1991在线| 国产精品永久免费视频| 在线播放日韩专区| 欧美激情一区二区三区久久久| 国产一区二区三区在线视频| 欧美激情久久久久| 欧美日韩成人在线播放| 欧美激情一区二区三区在线视频观看| 亚洲精品成人久久久| 精品中文字幕乱| 夜夜嗨av色一区二区不卡| 国产精品观看在线亚洲人成网| 久久综合网hezyo| 亚洲综合成人婷婷小说| 国模视频一区二区三区| 91精品国产高清久久久久久久久| 日韩在线一区二区三区免费视频| 亚洲精品自拍视频| 夜夜嗨av一区二区三区免费区| 欧美日在线观看| 在线日韩中文字幕| 日韩av在线免费播放| 国产大片精品免费永久看nba| 日韩av色在线| 永久555www成人免费| 欧美色视频日本高清在线观看| 亚洲精品久久久久中文字幕二区| 亚洲欧美制服综合另类| 久久久免费观看| 精品国产91乱高清在线观看| 日本精品久久中文字幕佐佐木| 欧美精品性视频| 国产精品久久一| 欧美床上激情在线观看| 精品成人国产在线观看男人呻吟| 国产精品777| 成人激情在线播放| 欧美老少做受xxxx高潮| 欧美日韩激情网| 久久精品国产2020观看福利| 欧美极品在线播放| 亚洲欧美在线看| 亚洲午夜激情免费视频| 韩国一区二区电影| 日韩视频免费在线| 久久理论片午夜琪琪电影网| 日韩美女视频免费看| 91影院在线免费观看视频| 91精品国产综合久久香蕉| 26uuu久久噜噜噜噜| 亚洲欧美制服另类日韩| 亚洲a在线观看| 久久九九全国免费精品观看| 国产精品人人做人人爽| 亚洲性线免费观看视频成熟| 中文字幕精品www乱入免费视频| 欧美精品日韩三级| 成人美女免费网站视频| 美日韩在线视频| 国产自产女人91一区在线观看| 国产精品久久久久久搜索| 国产精品视频精品视频| 国产精品国内视频| 日韩高清电影免费观看完整版| 91黑丝高跟在线| 欧美国产日本在线| 日韩av黄色在线观看| 国语自产在线不卡| 欧美亚洲国产精品| 国产精品久久久久免费a∨大胸| 欧美野外猛男的大粗鳮| 国产成人精品优优av| 性欧美亚洲xxxx乳在线观看| 欧美有码在线观看视频| 搡老女人一区二区三区视频tv| 8050国产精品久久久久久| 久久久综合av| 久久伊人精品一区二区三区| 国产精品午夜国产小视频| 91成人福利在线| 国产精品综合久久久| 91精品视频网站| 萌白酱国产一区二区| 日韩国产欧美精品一区二区三区| 国产精品视频白浆免费视频| 亚洲成avwww人| 日韩在线视频观看| 亚洲欧洲在线观看| 欧美一级免费视频| 性亚洲最疯狂xxxx高清| 久久视频精品在线| 成人在线中文字幕| 成人黄色片在线| 国产精品免费久久久| 国产精品精品视频| 欧美日本在线视频中文字字幕| 欧美另类99xxxxx| 中文欧美在线视频| 亚洲一级黄色片| www.亚洲成人| 亚洲精品456在线播放狼人| 亚洲区一区二区| 欧美性xxxxx极品娇小| 深夜福利一区二区| 欧美一级大胆视频|