QQ登录

只需一步,快速开始

上位机MFC三角形按钮实例

[ 复制链接 ]
效果演示

上位机MFC三角形按钮实例

上位机MFC三角形按钮实例

例程通过自己编写代码实现按钮自绘,完成三角形按钮功能。
效果如上图,涉及的代码可以在下面复制使用。
或直接下载项目工程,内含编译好的可执行程序,可直接运行查看效果
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CBtn.rar 
文件大小:36.23 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



实现过程
1.新建基于对话框应用程序, 如上图添加控件,并排版。
2.将工程根目录按钮文件TRIANGLEBUTTON.CPP,TRIANGLEBUTTON.h复制到工程根目录。
并导入到自己工程中,这样工程内就新添加一按钮类CTriangleButton

上位机MFC三角形按钮实例

上位机MFC三角形按钮实例

3.在主对话框包含CTriangleButton的头文件,并关联按钮控件,注意控件ID与变量的对应。
然后编译工程,按钮就可以变成三角形状了。
#include "TriangleButton.h"
        CTriangleButton        trif7;
        CTriangleButton        trif6;
        CTriangleButton        tri3d7;
        CTriangleButton        tri3d6;
        CTriangleButton        trif5;
        CTriangleButton        trif4;
        CTriangleButton        trif3;
        CTriangleButton        trif2;
        CTriangleButton trif1;
        CTriangleButton        tri3d5;
        CTriangleButton        tri3d4;
        CTriangleButton        tri3d3;
        CTriangleButton        tri3d2;
        CTriangleButton        tri3d1;


        DDX_Control(pDX, IDTRI_F_7, trif7);
        DDX_Control(pDX, IDTRI_F_6, trif6);
        DDX_Control(pDX, IDTRI_3D_7, tri3d7);
        DDX_Control(pDX, IDTRI_3D_6, tri3d6);
        DDX_Control(pDX, IDTRI_F_5, trif5);
        DDX_Control(pDX, IDTRI_F_4, trif4);
        DDX_Control(pDX, IDTRI_F_3, trif3);
        DDX_Control(pDX, IDTRI_F_2, trif2);
        DDX_Control(pDX, IDTRI_F_1, trif1);
        DDX_Control(pDX, IDTRI_3D_5, tri3d5);
        DDX_Control(pDX, IDTRI_3D_4, tri3d4);
        DDX_Control(pDX, IDTRI_3D_3, tri3d3);
        DDX_Control(pDX, IDTRI_3D_2, tri3d2);
        DDX_Control(pDX, IDTRI_3D_1, tri3d1);


4.然后是实现对按钮文本,三角形方向的控制
依次双击单选框,添加其点击函数
void CCBtnDlg::OnRaDown()
{
        ChangeTriButtonDirection(CTriangleButton:OINT_DOWN);
}
void CCBtnDlg::OnRaRight()
{
        ChangeTriButtonDirection(CTriangleButton:OINT_RIGHT);
}
void CCBtnDlg::OnRaUp()
{
        ChangeTriButtonDirection(CTriangleButton:OINT_UP);       
}
void CCBtnDlg::OnRaLeft()
{
        ChangeTriButtonDirection(CTriangleButton:OINT_LEFT);
}

其中void ChangeTriButtonDirection(CTriangleButton:OINTDIRECTION d);为自己在主对话框添加的函数
void CCBtnDlg::ChangeTriButtonDirection(CTriangleButton:OINTDIRECTION d)
{
        trif1.SetDirection(d);
        trif2.SetDirection(d);
        trif3.SetDirection(d);
        trif4.SetDirection(d);
        trif5.SetDirection(d);
        trif6.SetDirection(d);
        trif7.SetDirection(d);

        tri3d1.SetDirection(d);
        tri3d2.SetDirection(d);
        tri3d3.SetDirection(d);
        tri3d4.SetDirection(d);
        tri3d5.SetDirection(d);
        tri3d6.SetDirection(d);
        tri3d7.SetDirection(d);

        Invalidate();
}

这样就可以通过单选框,设置三角按钮的方向。
5.其他的功能就可以使用MFC按钮类自带的,如按钮 文本的修改
可以在界面编辑中完成,双击添加编辑框文本变化触发函数便可
        CString text;
GetDlgItemText(IDC_BUTTONTEXT,text);

        trif1.SetWindowText(text);
        trif2.SetWindowText(text);
        trif3.SetWindowText(text);
        trif4.SetWindowText(text);
        trif5.SetWindowText(text);
        trif6.SetWindowText(text);
        trif7.SetWindowText(text);

        tri3d1.SetWindowText(text);
        tri3d2.SetWindowText(text);
        tri3d3.SetWindowText(text);
        tri3d4.SetWindowText(text);
        tri3d5.SetWindowText(text);
        tri3d6.SetWindowText(text);
        tri3d7.SetWindowText(text);


下面是两文件内代码,可复制使用:
  1. #ifndef __TRIANGLEBUTTON_H__INCLUDED
  2. #define __TRIANGLEBUTTON_H__INCLUDED



  3. class CTriangleButton : public CButton
  4. {
  5. public:
  6.         enum POINTDIRECTION {POINT_UP, POINT_DOWN, POINT_LEFT, POINT_RIGHT};
  7.        
  8.         // Construction
  9. public:
  10.         CTriangleButton();
  11.         virtual ~CTriangleButton();

  12. // Attributes
  13. public:

  14. protected:
  15.         POINTDIRECTION PointDirection;
  16.         CRgn CurrentRegion;

  17. // Operations
  18. public:

  19. // Overrides
  20.         // ClassWizard generated virtual function overrides
  21.         //{{AFX_VIRTUAL(CTriangleButton)
  22.         public:
  23.         virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  24.         protected:
  25.         virtual void PreSubclassWindow();
  26.         //}}AFX_VIRTUAL

  27. public:
  28.         //note: SetWindowPos decreases the cx, cy parameter to nearest number dividable by two
  29.         BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );

  30. // Implementation
  31. public:
  32.         void SetDirection(POINTDIRECTION PointDirection);        //sets the direction of triangle
  33.         POINTDIRECTION GetDirection();                                                                                //gets the direction of triangle

  34.         // Generated message map functions
  35. protected:
  36.         //{{AFX_MSG(CTriangleButton)
  37.         //}}AFX_MSG

  38.         DECLARE_MESSAGE_MAP()
  39. };


  40. #endif // __TRIANGLEBUTTON_H__INCLUDED
复制代码

  1. #include "stdafx.h"
  2. #include "math.h"
  3. #include "TriangleButton.h"

  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif

  9. /////////////////////////////////////////////////////////////////////////////
  10. // CTriangleButton

  11. CTriangleButton::CTriangleButton()
  12. {
  13.         PointDirection = POINT_RIGHT;
  14. }

  15. CTriangleButton::~CTriangleButton()
  16. {
  17. }

  18. BEGIN_MESSAGE_MAP(CTriangleButton, CButton)
  19.         //{{AFX_MSG_MAP(CRoundButton)
  20.         ON_WM_NCHITTEST()
  21.         //}}AFX_MSG_MAP
  22. END_MESSAGE_MAP()


  23. void CTriangleButton::SetDirection(POINTDIRECTION Direction)
  24. {
  25.         PointDirection = Direction;
  26.         PreSubclassWindow();
  27. }

  28. CTriangleButton::POINTDIRECTION CTriangleButton::GetDirection()
  29. {
  30.         return PointDirection;
  31. }



  32. BOOL CTriangleButton::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags)
  33. {
  34.         //Size must be dividable by two (else triangle will look strange when drawn)
  35.         cx -= cx % 2; cy -= cy % 2;
  36.         //TRACE("x=%i   y=%i\n", cx, cy);
  37.         return CButton::SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);
  38. }


  39. /////////////////////////////////////////////////////////////////////////////
  40. // CRoundButton message handlers

  41. void CTriangleButton::PreSubclassWindow()
  42. {
  43.         CButton::PreSubclassWindow();

  44.         //get client rectangle
  45.         CRect rect;
  46.         GetClientRect(rect);
  47.         rect.bottom = rect.right = min(rect.bottom,rect.right);        //make it square
  48.         rect.bottom -= rect.bottom % 2; rect.right -= rect.right % 2;

  49.         SetWindowPos(NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE | SWP_NOZORDER);

  50.         CPoint Head, RightLeg, LeftLeg;

  51.         switch (PointDirection) {
  52.                 case POINT_UP :
  53.                         Head.x = rect.right / 2; Head.y = 0;
  54.                         RightLeg.x = rect.right; RightLeg.y = rect.bottom;
  55.                         LeftLeg.x = 0; LeftLeg.y = rect.bottom;
  56.                         break;
  57.                 case POINT_DOWN :
  58.                         Head.x = rect.right / 2; Head.y = rect.bottom;
  59.                         RightLeg.x = 0; RightLeg.y = 0;
  60.                         LeftLeg.x = rect.right; LeftLeg.y = 0;
  61.                         break;
  62.                 case POINT_LEFT :
  63.                         Head.x = 0; Head.y = rect.bottom / 2;
  64.                         RightLeg.x = rect.right; RightLeg.y = 0;
  65.                         LeftLeg.x = rect.right; LeftLeg.y = rect.bottom;
  66.                         break;
  67.                 case POINT_RIGHT :
  68.                         Head.x = rect.right; Head.y = rect.bottom / 2;
  69.                         RightLeg.x = 0; RightLeg.y = rect.bottom;
  70.                         LeftLeg.x = 0; LeftLeg.y = 0;
  71.                         break;
  72.                 default :
  73.                         ASSERT(FALSE);
  74.         }//switch
  75.                                                        
  76.         CPoint points[3];
  77.         points[0] = Head; points[1] = RightLeg; points[2] = LeftLeg;
  78.        
  79.         SetWindowRgn(NULL, FALSE);

  80.         CurrentRegion.DeleteObject();
  81.         CurrentRegion.CreatePolygonRgn(points, 3, ALTERNATE);

  82.         SetWindowRgn(CurrentRegion, TRUE);
  83.                
  84.         ModifyStyle(0, BS_OWNERDRAW);
  85. }


  86. void CTriangleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  87. {
  88.         ASSERT(lpDrawItemStruct != NULL);
  89.         CRect rect = lpDrawItemStruct->rcItem;
  90.         CDC* pDC   = CDC::FromHandle(lpDrawItemStruct->hDC);
  91.         UINT state = lpDrawItemStruct->itemState;
  92.         UINT nStyle = GetStyle();

  93.         int nSavedDC = pDC->SaveDC();

  94.         //make the rect a square
  95.         rect.bottom = rect.right = min(rect.bottom, rect.right);
  96.         pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE));
  97.        
  98.         rect.right -= 1; rect.bottom -= 1;        //avoid drawing outside area

  99.         //make some pens
  100.         CPen HighlightPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DHIGHLIGHT));
  101.         CPen DarkShadowPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DDKSHADOW));
  102.         CPen ShadowPen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
  103.         CPen BlackPen(PS_SOLID, 1, RGB(0,0,0));
  104.         //NOTE: If U use this class for NT apps only, use the implementation of FocusPen below
  105.         //                        instead, as WIN95 doesn't support this yet (though the doc says **dang ms-fools**)
  106.         //                        (WIN98 might also support this)
  107.         //LOGBRUSH logbrush; logbrush.lbStyle = BS_SOLID; logbrush.lbColor = RGB(0,0,0); logbrush.lbHatch = NULL;
  108.         //CPen FocusPen(PS_COSMETIC | PS_ALTERNATE, 1, &logbrush);
  109.         CPen FocusPen(PS_DOT, 0, RGB(0,0,0));
  110.        

  111.         //Draw button
  112.         switch (PointDirection) {
  113.                 case POINT_UP : {
  114.                         //Draw the raised/sunken edges of the button (unless flat)
  115.                         if (nStyle & BS_FLAT) {                                        //style is flat
  116.                                 pDC->SelectObject(BlackPen);
  117.                                 pDC->MoveTo(rect.right / 2, 0);
  118.                                 pDC->LineTo(0, rect.bottom);
  119.                                 pDC->LineTo(rect.right, rect.bottom);
  120.                                 pDC->LineTo(rect.right / 2, 0);
  121.                                 pDC->SelectObject(HighlightPen);
  122.                                 pDC->MoveTo(rect.right / 2, 2);
  123.                                 pDC->LineTo(2, rect.bottom - 1);
  124.                                 pDC->LineTo(rect.right - 2, rect.bottom - 1);
  125.                                 pDC->LineTo(rect.right / 2, 2);
  126.                         }        else {                                                                                                //style not flat
  127.                                 if ((state & ODS_SELECTED))        {        //Button is down       
  128.                                         pDC->SelectObject(HighlightPen);
  129.                                         pDC->MoveTo(0, rect.bottom);
  130.                                         pDC->LineTo(rect.right - 1, rect.bottom);
  131.                                         pDC->LineTo(rect.right / 2, 0);

  132.                                         pDC->SelectObject(ShadowPen);
  133.                                         pDC->LineTo(0, rect.bottom);                       
  134.                                        
  135.                                         pDC->SelectObject(DarkShadowPen);
  136.                                         pDC->MoveTo(rect.right / 2 - 1, 4);
  137.                                         pDC->LineTo(1, rect.bottom);
  138.                                 } else {                                                                                        //Button is not down
  139.                                         pDC->SelectObject(HighlightPen);
  140.                                         pDC->MoveTo(rect.right /2, 0);
  141.                                         pDC->LineTo(0, rect.bottom - 1);
  142.                                        
  143.                                         pDC->SelectObject(ShadowPen);
  144.                                         pDC->LineTo(rect.right - 1, rect.bottom - 1);
  145.                                         pDC->LineTo(rect.right / 2, 0);

  146.                                         pDC->SelectObject(DarkShadowPen);
  147.                                         pDC->MoveTo(rect.right / 2 + 2, 3);
  148.                                         pDC->LineTo(rect.right + 1, rect.bottom + 1);
  149.                                        
  150.                                         pDC->MoveTo(rect.right - 1, rect.bottom);
  151.                                         pDC->LineTo(1, rect.bottom);
  152.                                 }//else|if
  153.                         }//else|if       
  154.                         break;
  155.                 }//case
  156.        
  157.                 case POINT_DOWN : {
  158.                         //Draw the raised/sunken edges of the button (unless flat)
  159.                         if (nStyle & BS_FLAT) {                                        //style is flat
  160.                                 pDC->SelectObject(BlackPen);
  161.                                 pDC->MoveTo(rect.right / 2, rect.bottom);
  162.                                 pDC->LineTo(0, 0);
  163.                                 pDC->LineTo(rect.right, 0);
  164.                                 pDC->LineTo(rect.right / 2, rect.bottom);
  165.                                
  166.                                 pDC->SelectObject(HighlightPen);
  167.                                 pDC->MoveTo(rect.right / 2, rect.bottom - 2);
  168.                                 pDC->LineTo(2, 1);
  169.                                 pDC->LineTo(rect.right - 2, 1);
  170.                                 pDC->LineTo(rect.right / 2, rect.bottom - 2);
  171.                         }        else {                                                                                                //style not flat
  172.                                 if ((state & ODS_SELECTED))        {        //Button is down       
  173.                                         pDC->SelectObject(ShadowPen);
  174.                                         pDC->MoveTo(rect.right, 1);
  175.                                         pDC->LineTo(1, 1);
  176.                                         pDC->LineTo(rect.right / 2, rect.bottom - 1);
  177.                                        
  178.                                         pDC->SelectObject(BlackPen);
  179.                                         pDC->MoveTo(rect.right - 2, 2);
  180.                                         pDC->LineTo(1, 2);
  181.                                        
  182.                                         pDC->SelectObject(HighlightPen);
  183.                                         pDC->MoveTo(rect.right + 1, 0);
  184.                                         pDC->LineTo(rect.right / 2 + 1, rect.bottom + 1);

  185.                                 } else {                                                                                        //Button is not down
  186.                                         pDC->SelectObject(ShadowPen);
  187.                                         pDC->MoveTo(0, 0);
  188.                                         pDC->LineTo(rect.right / 2, rect.bottom);
  189.                                         pDC->LineTo(rect.right, 0);
  190.                                         pDC->MoveTo(1, 1);
  191.                                         pDC->LineTo(rect.right / 2 + 1, rect.bottom);
  192.                                        
  193.                                         pDC->SelectObject(DarkShadowPen);
  194.                                         pDC->MoveTo(rect.right, 2);
  195.                                         pDC->LineTo(rect.right / 2 + 1, rect.bottom + 1);
  196.                                        
  197.                                         pDC->SelectObject(HighlightPen);
  198.                                         pDC->MoveTo(0, 0);
  199.                                         pDC->LineTo(rect.right, 0);
  200.                                
  201.                                 }
  202.                         }//else|if
  203.                         break;
  204.                 }//case

  205.                 case POINT_LEFT : {
  206.                         if (nStyle & BS_FLAT) {                                        //style is flat
  207.                                 pDC->SelectObject(BlackPen);
  208.                                 pDC->MoveTo(rect.right, 0);
  209.                                 pDC->LineTo(0, rect.bottom / 2);
  210.                                 pDC->LineTo(rect.right, rect.bottom);
  211.                                 pDC->LineTo(rect.right, 0);
  212.                                
  213.                                 pDC->SelectObject(HighlightPen);
  214.                                 pDC->MoveTo(rect.right - 1, 2);
  215.                                 pDC->LineTo(3, rect.bottom / 2);
  216.                                 pDC->LineTo(rect.right - 1, rect.bottom - 2);
  217.                                 pDC->LineTo(rect.right - 1, 2);
  218.                         }        else {                                                                                                //style not flat
  219.                                 if ((state & ODS_SELECTED))        {        //Button is down       
  220.                                         pDC->SelectObject(ShadowPen);
  221.                                         pDC->MoveTo(rect.right, 0);
  222.                                         pDC->LineTo(0, rect.bottom / 2);

  223.                                         pDC->SelectObject(DarkShadowPen);
  224.                                         pDC->MoveTo(rect.right, 1);
  225.                                         pDC->LineTo(2, rect.bottom / 2);
  226.                                        
  227.                                         pDC->SelectObject(HighlightPen);
  228.                                         pDC->MoveTo(rect.right, 0);
  229.                                         pDC->LineTo(rect.right, rect.bottom);
  230.                                         pDC->LineTo(0, rect.bottom / 2);
  231.                                 } else {                                                                                        //Button is not down
  232.                                         pDC->SelectObject(ShadowPen);
  233.                                         pDC->MoveTo(rect.right - 1, 0);
  234.                                         pDC->LineTo(rect.right - 1, rect.bottom - 1);
  235.                                         pDC->LineTo(0, rect.bottom / 2);
  236.                                         pDC->MoveTo(1, rect.bottom / 2 + 1);
  237.                                         pDC->LineTo(6, rect.bottom / 2 + 4);

  238.                                         pDC->SelectObject(DarkShadowPen);
  239.                                         pDC->MoveTo(rect.right, 1);
  240.                                         pDC->LineTo(rect.right, rect.bottom);
  241.                                         pDC->LineTo(2, rect.bottom / 2 + 2);
  242.                                        
  243.                                         pDC->SelectObject(HighlightPen);
  244.                                         pDC->MoveTo(0, rect.bottom / 2);
  245.                                         pDC->LineTo(rect.right, 0);
  246.                                 }
  247.                         }//else|if
  248.                         break;
  249.                 }//case

  250.                 case POINT_RIGHT : {
  251.                         if (nStyle & BS_FLAT) {                                        //style is flat
  252.                                 pDC->SelectObject(BlackPen);
  253.                                 pDC->MoveTo(0, 0);
  254.                                 pDC->LineTo(rect.right, rect.bottom / 2);
  255.                                 pDC->LineTo(0, rect.bottom);
  256.                                 pDC->LineTo(0, 0);
  257.                                
  258.                                 pDC->SelectObject(HighlightPen);
  259.                                 pDC->MoveTo(1, 2);
  260.                                 pDC->LineTo(rect.right - 2, rect.bottom / 2);
  261.                                 pDC->LineTo(1, rect.bottom - 2);
  262.                                 pDC->LineTo(1, 2);
  263.                         }        else {                                                                                                //style not flat
  264.                                 if ((state & ODS_SELECTED))        {        //Button is down       
  265.                                         pDC->SelectObject(ShadowPen);
  266.                                         pDC->MoveTo(0, rect.bottom);
  267.                                         pDC->LineTo(0, 0);
  268.                                         pDC->LineTo(rect.right, rect.bottom / 2);

  269.                                         pDC->SelectObject(DarkShadowPen);
  270.                                         pDC->MoveTo(1, rect.bottom - 2);
  271.                                         pDC->LineTo(1, 1);
  272.                                         pDC->MoveTo(rect.right - 3, rect.bottom / 2);
  273.                                         pDC->LineTo(0, 1);
  274.                                        
  275.                                         pDC->SelectObject(HighlightPen);
  276.                                         pDC->MoveTo(0, rect.bottom);
  277.                                         pDC->LineTo(rect.right, rect.bottom / 2);
  278.                                        
  279.                                 } else {                                                                                        //Button is not down
  280.                                         pDC->SelectObject(ShadowPen);
  281.                                         pDC->MoveTo(0, rect.bottom);
  282.                                         pDC->LineTo(rect.right, rect.bottom / 2);

  283.                                         pDC->SelectObject(DarkShadowPen);
  284.                                         pDC->MoveTo(0, rect.bottom + 1);
  285.                                         pDC->LineTo(rect.right, rect.bottom / 2 + 1);
  286.                                        
  287.                                         pDC->SelectObject(HighlightPen);
  288.                                         pDC->MoveTo(0, rect.bottom);
  289.                                         pDC->LineTo(0, 0);
  290.                                         pDC->LineTo(rect.right, rect.bottom / 2);
  291.                                 }
  292.                         }//else|if

  293.                         break;
  294.                 }//case

  295.                 default :
  296.                         ASSERT(FALSE);
  297.         }//switch


  298.         //Draw text        if any
  299.         CString strText;
  300.         GetWindowText(strText);
  301.         if (!strText.IsEmpty()) {
  302.                 CSize TextExtent = pDC->GetTextExtent(strText);
  303.                 CPoint TextPos;
  304.                 pDC->SetBkMode(TRANSPARENT);

  305.                 switch (PointDirection) {
  306.                         case POINT_UP : {
  307.                                 TextPos = CPoint((int)(rect.right / 2.0 - TextExtent.cx / 2.0),
  308.                                                                                          rect.bottom - (int)(rect.bottom / 5.0 + TextExtent.cy));

  309.                                 int iXLimit = (int)((rect.bottom / 5.0 + TextExtent.cy) * 4.0 / 7.0);

  310.                                 CRgn rgn; rgn.CreateRectRgn(iXLimit, TextPos.y, rect.right - iXLimit, rect.bottom - 2);
  311.                                 pDC->SelectClipRgn(&rgn);
  312.                                
  313.                                 break;
  314.                         }//case
  315.                         case POINT_DOWN : {
  316.                                 TextPos = CPoint((int)(rect.right / 2.0 - TextExtent.cx / 2.0),
  317.                                                                                          (int)(rect.bottom / 5.0));

  318.                                 int iXLimit = (int)((rect.bottom / 5.0 + TextExtent.cy) * 4.0 / 7.0);

  319.                                 CRgn rgn; rgn.CreateRectRgn(iXLimit, (int)(rect.bottom / 5.0), rect.right - iXLimit, (int)(rect.bottom / 5.0) + TextExtent.cy + 2);
  320.                                 pDC->SelectClipRgn(&rgn);
  321.                                
  322.                                 break;
  323.                         }
  324.                        
  325.                         case POINT_LEFT : {
  326.                                 TextPos = CPoint((int)((rect.right / 2.0 - TextExtent.cx / 2.0) + (rect.right / 8.0)),
  327.                                                                                            (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0) );

  328.                                 int iXLimitLeft = (int)(TextExtent.cy / 2.0 * 7.0 / 4.0) + 4;
  329.                                 int iXLimitRight = rect.right - 4;
  330.                        
  331.                                 CRgn rgn; rgn.CreateRectRgn(iXLimitLeft, (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0),
  332.                                                                                                                                                 iXLimitRight, (int)(rect.bottom / 2.0 + TextExtent.cy / 2.0) );
  333.                                 pDC->SelectClipRgn(&rgn);

  334.                                 break;
  335.                         }//case

  336.                         case POINT_RIGHT : {
  337.                                 TextPos = CPoint((int)((rect.right / 2.0 - TextExtent.cx / 2.0) - (rect.right / 8.0)),
  338.                                                                                            (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0) );

  339.                                 int iXLimitLeft = 4;
  340.                                 int iXLimitRight = rect.right - (int)(TextExtent.cy / 2.0 * 7.0 / 4.0) - 4;
  341.                                        
  342.                                 CRgn rgn; rgn.CreateRectRgn(iXLimitLeft, (int)(rect.bottom / 2.0 - TextExtent.cy / 2.0),
  343.                                                                                                                                                 iXLimitRight, (int)(rect.bottom / 2.0 + TextExtent.cy / 2.0) );
  344.                                 pDC->SelectClipRgn(&rgn);

  345.                                 break;
  346.                         }//case

  347.                         default :
  348.                                 ASSERT(FALSE);
  349.                 }//switch

  350.                 //common for all directions
  351.                 if (state & ODS_SELECTED) TextPos.Offset(1,1);

  352.                 if (state & ODS_DISABLED) {
  353.                         pDC->DrawState(TextPos, TextExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
  354.                 } else {
  355.                         pDC->TextOut(TextPos.x, TextPos.y, strText);
  356.                 }

  357.         }//if                       


  358.         //Draw the focus triangle on the inside of the button if we have focus
  359.         if ((state & ODS_FOCUS)) {
  360.                 CRgn rgn; rgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
  361.                 pDC->SelectClipRgn(&rgn);
  362.                 pDC->SelectObject(FocusPen);
  363.                 switch (PointDirection) {
  364.                         case POINT_UP : {
  365.                                 pDC->MoveTo(rect.right / 2, 12);
  366.                                 pDC->LineTo(9, rect.bottom - 6);
  367.                                 pDC->LineTo(rect.right - 9, rect.bottom - 6);
  368.                                 pDC->LineTo(rect.right / 2, 12);
  369.                                 break;
  370.                         }
  371.                         case POINT_DOWN : {
  372.                                 pDC->MoveTo(rect.right / 2 + 1, rect.bottom - 13);
  373.                                 pDC->LineTo(10, 6);
  374.                                 pDC->LineTo(rect.right - 9, 6);
  375.                                 pDC->LineTo(rect.right / 2 + 1, rect.bottom - 13);
  376.                                 break;
  377.                         }
  378.                         case POINT_LEFT : {
  379.                                 pDC->MoveTo(12, rect.bottom / 2);
  380.                                 pDC->LineTo(rect.right - 6, 9);
  381.                                 pDC->LineTo(rect.right - 6, rect.bottom - 9);
  382.                                 pDC->LineTo(12, rect.bottom / 2);
  383.                                 break;
  384.                         }//case
  385.                         case POINT_RIGHT : {
  386.                                 pDC->MoveTo(6, 9);
  387.                                 pDC->LineTo(rect.right - 12, rect.bottom / 2);
  388.                                 pDC->LineTo(6, rect.bottom - 9);
  389.                                 pDC->LineTo(6, 9);
  390.                                 break;
  391.                         }//case

  392.                         default :
  393.                                 ASSERT(FALSE);
  394.                 }//switch
  395.         }//if

  396.         pDC->RestoreDC(nSavedDC);

  397. }

  398. /*  I'm not sure what this function is supposed to do, but it was in the
  399. CRoundButton class i used to make this class, so I have implemented it, though
  400. I don't know what the function should do ! (if it is nescessary just remove comments)
  401. UINT CTriangleButton::OnNcHitTest(CPoint point)
  402. {
  403.         ScreenToClient(&point);
  404.         if (CurrentRegion.PtInRegion(point)) {
  405.                 //TRACE("HTCLIENT: %i, %i\n", point.x, point.y);
  406.                 return HTCLIENT;
  407.         }
  408.         else {
  409.                 //TRACE("HTNOWHERE: %i, %i\n", point.x, point.y);
  410.                 return HTNOWHERE;
  411.         }
  412. }
  413. */


复制代码
  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索