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

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

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

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

頭文件 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
欧美亚洲另类在线| 国产亚洲精品激情久久| 日韩资源在线观看| 啊v视频在线一区二区三区| 最近日韩中文字幕中文| 欧美大片大片在线播放| 欧美国产日韩精品| 91精品啪在线观看麻豆免费| 成人黄在线观看| 777777777亚洲妇女| 国产极品精品在线观看| 青青精品视频播放| 欧美多人乱p欧美4p久久| 精品国产999| 亚洲人成电影网站色www| 日韩激情av在线播放| 国产91|九色| 国内揄拍国内精品少妇国语| 成人免费xxxxx在线观看| 亚洲综合第一页| 久久久久国产精品免费| 国产精品福利网| 国产精品第二页| 亚洲精品91美女久久久久久久| 日韩精品在线观| 欧美电影免费观看高清| 欧美大成色www永久网站婷| 欧美成人中文字幕在线| 国产精品免费一区二区三区都可以| 欧美最猛性xxxxx免费| 亚洲一品av免费观看| 久久人人爽人人爽人人片av高清| 久久天堂av综合合色| 日韩精品在线私人| 2021久久精品国产99国产精品| 国产精品视频在线播放| 亚洲男人天堂网站| 国产精品久久99久久| 久久久久国产视频| 欧美日韩成人在线视频| 成人网欧美在线视频| 欧美黑人一区二区三区| 欧美大片免费观看在线观看网站推荐| 色综合久久久久久中文网| 97激碰免费视频| 日韩在线观看免费高清完整版| 久久久999精品免费| 国产精品美女免费| 亚洲精品天天看| 成人黄色在线播放| 国产精品视频区| 国产精品久久久久久搜索| 日韩美女激情视频| 中文字幕不卡av| 亚洲视频欧洲视频| 91在线免费观看网站| 伊人精品在线观看| 久久久人成影片一区二区三区| 成人免费网视频| 欧美激情视频给我| 中文字幕欧美精品日韩中文字幕| 91在线免费看网站| 国产精品一区二区三| 亚洲国产精品99| 久久久女人电视剧免费播放下载| 成人午夜小视频| 8x拔播拔播x8国产精品| 久久精视频免费在线久久完整在线看| 久久99精品久久久久久琪琪| 国内久久久精品| 亚洲影影院av| 夜夜躁日日躁狠狠久久88av| 国内外成人免费激情在线视频| 亚洲va男人天堂| 欧美成人久久久| 欧美日韩第一页| 欧美日韩国产精品一区二区三区四区| 国产精品午夜视频| 欧美电影在线观看| 亚洲国产女人aaa毛片在线| 国产日韩在线看片| 一区二区三区无码高清视频| 日韩亚洲精品电影| 中文日韩在线观看| 欧美激情乱人伦一区| 欧美亚洲国产视频小说| 日韩电视剧在线观看免费网站| 欧美成aaa人片在线观看蜜臀| 国外成人性视频| 亚洲欧美成人一区二区在线电影| 日本精品视频在线| 久久精品91久久久久久再现| 久久亚洲电影天堂| 欧美极品美女电影一区| 欧美日韩国产丝袜另类| 日韩欧美一区视频| 黑人精品xxx一区一二区| 国产精品白丝jk喷水视频一区| 亚洲欧洲午夜一线一品| 国模吧一区二区三区| 久久久91精品| 国产在线精品一区免费香蕉| 欧美在线一区二区三区四| 国产91在线播放| 亚洲国产精品嫩草影院久久| 亚洲日本欧美日韩高观看| 欧美国产日韩一区二区在线观看| 欧美一级淫片丝袜脚交| 日韩中文字幕av| 国产性猛交xxxx免费看久久| 日本精品一区二区三区在线播放视频| 国产91精品视频在线观看| 国产69精品久久久久9| 欧美极品在线视频| 久久久黄色av| 久久成人综合视频| 国产精品久久av| 精品国产91久久久久久| 日本精品在线视频| 国产在线观看精品一区二区三区| 久久久99免费视频| 国产精品老牛影院在线观看| 国产69精品久久久久9| 亚洲最大的av网站| 日韩精品亚洲精品| 国产福利精品视频| 国产精品久久久久av免费| 777国产偷窥盗摄精品视频| 日韩电影在线观看免费| 亚洲一区av在线播放| 欧美韩国理论所午夜片917电影| 日韩免费观看网站| 亚洲色图25p| 欧美与黑人午夜性猛交久久久| 国产成人免费av| 久久色精品视频| 欧美电影在线观看网站| 68精品国产免费久久久久久婷婷| 久久理论片午夜琪琪电影网| 亚洲在线视频福利| 国产一区二区三区毛片| 92版电视剧仙鹤神针在线观看| 国产精品一区二区久久| 国产精品网站视频| 免费av一区二区| 91精品久久久久久久久久另类| 欧美性生交xxxxx久久久| 日韩精品免费在线视频观看| 亚洲毛茸茸少妇高潮呻吟| 亚洲欧美国产精品va在线观看| 亚洲国产精品yw在线观看| 国产精品日韩电影| 欧美日韩国产丝袜另类| 亚洲美女自拍视频| 久久久之久亚州精品露出| 久久久视频精品| 久久中文字幕一区| 91在线精品播放| 色久欧美在线视频观看| 日韩在线观看网址| 欧美亚洲另类激情另类| 成人黄色激情网| 日韩成人在线视频观看| 91手机视频在线观看|