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

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

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

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

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


上一篇:P1071 潛伏者

下一篇:P1012 拼數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文字幕| 国色天香2019中文字幕在线观看| 国产美女扒开尿口久久久| 色综合久久中文字幕综合网小说| 欧美成人一区二区三区电影| 啊v视频在线一区二区三区| 欧美成人黑人xx视频免费观看| 91在线高清视频| 91精品国产乱码久久久久久蜜臀| 国产成人一区二| 欧美诱惑福利视频| 久久综合久久美利坚合众国| 一道本无吗dⅴd在线播放一区| 亚洲天堂网站在线观看视频| 亚洲精品久久久久中文字幕欢迎你| 亚洲第一精品福利| 国产综合久久久久| 国产一区二区丝袜| 久久在精品线影院精品国产| 欧美日韩免费网站| 亚洲成人激情在线| 91影视免费在线观看| 992tv成人免费影院| 精品香蕉在线观看视频一| 欧美日韩午夜视频在线观看| 亚洲激情在线观看视频免费| 亚洲性视频网址| 日本免费久久高清视频| 亚洲无线码在线一区观看| 国产精品久久久久免费a∨大胸| 5566成人精品视频免费| 欧美体内谢she精2性欧美| 国产成人精品视| 亚洲视频在线观看视频| 欧美大码xxxx| 亚洲a成v人在线观看| 欧美激情伊人电影| 国产成人精品亚洲精品| 这里只有精品在线播放| 热99精品里视频精品| 国产午夜精品一区理论片飘花| 午夜精品久久久久久久久久久久久| 91大神福利视频在线| 精品久久久一区| 国产视频亚洲精品| 欧美大码xxxx| 欧美成人一区在线| 91九色综合久久| 亚洲欧美中文字幕在线一区| 欧美区二区三区| 久久av资源网站| 永久免费精品影视网站| 日韩精品有码在线观看| 日韩精品免费在线观看| 日韩高清免费在线| 日韩av免费一区| 国产成人精品免高潮在线观看| 国产精品一区二区在线| 欧美电影《睫毛膏》| 欧美一级黑人aaaaaaa做受| 亚洲欧洲在线看| 永久免费精品影视网站| 国产视频精品自拍| 国产精品久久久久久久久久久不卡| 国产69精品久久久久9| 日韩人体视频一二区| 91久久久久久久久久| 高清视频欧美一级| 欧美丰满少妇xxxxx| 国产视频综合在线| 亚洲电影免费观看高清完整版在线观看| 热久久免费视频精品| 亚洲欧美日韩天堂一区二区| 亚洲激情免费观看| 欧美xxxx综合视频| 亚洲欧美在线看| 午夜精品久久久久久久99热| 91精品久久久久久久| 一区二区三区国产在线观看| 日韩av片永久免费网站| 亚洲香蕉在线观看| 亚洲视频视频在线| 亚洲欧洲日本专区| 国产日本欧美在线观看| 国产91露脸中文字幕在线| 欧美色videos| 亚洲影院色在线观看免费| 久久精品国产免费观看| 国产精品久久久久久久久男| 欧美在线视频免费播放| 欧日韩不卡在线视频| 91在线视频一区| 97av在线视频免费播放| 日韩电影免费观看在线观看| 欧美激情喷水视频| 国产人妖伪娘一区91| 欧美大片网站在线观看| 国产91精品最新在线播放| 5566成人精品视频免费| 国产精品吹潮在线观看| 国模视频一区二区三区| 久久夜精品va视频免费观看| 欧洲日本亚洲国产区| 欧美在线视频免费播放| 色中色综合影院手机版在线观看| 欧美日韩国产激情| 在线观看91久久久久久| 欧美—级a级欧美特级ar全黄| 国产成人jvid在线播放| 欧美性xxxx极品hd满灌| 国产成人欧美在线观看| 亚洲一区二区三区xxx视频| 亚洲成人aaa| 国产成人亚洲综合91| 亚洲日韩中文字幕| 成人高清视频观看www| 亚洲欧美激情另类校园| 亚洲天堂男人天堂| 欧美成人精品在线视频| 97视频在线观看免费| 久久久久久国产精品三级玉女聊斋| 69国产精品成人在线播放| 国产一区二区三区免费视频| 亚洲欧美999| 欧美精品在线播放| 91久久久久久久久久| 国产精品毛片a∨一区二区三区|国| 久久久久日韩精品久久久男男| 欧美一级视频在线观看| 中文字幕日韩综合av| 91精品美女在线| 亚洲欧美中文在线视频| 国产999视频| 亚洲欧美日本另类| 欧美在线一区二区三区四| 亚洲iv一区二区三区| 久久久久久久久久久网站| 亚洲大胆美女视频| 亚洲视频在线观看网站| 国产婷婷97碰碰久久人人蜜臀| 亚洲美腿欧美激情另类| 国产欧美va欧美va香蕉在线| 亚洲人成绝费网站色www| 欧美精品videos另类日本| 亚洲黄色在线观看| 日本久久久久久久久| 国产视频福利一区| 91中文字幕一区| 国产精品成人一区二区三区吃奶| 国产一区二区成人| 国产欧美中文字幕| 亚洲自拍小视频免费观看| 欧美在线观看一区二区三区| 亚洲综合第一页| 日本精品久久中文字幕佐佐木| 欧美性xxxxx极品| 国产亚洲欧美日韩一区二区| 久久国产精品亚洲| 在线成人中文字幕| 成人情趣片在线观看免费| 欧美香蕉大胸在线视频观看| 国产精品综合久久久| 亚洲欧美日韩一区在线| 黑人与娇小精品av专区|