【VC开源代码栏目提醒】:网学会员在VC开源代码频道为大家收集整理了TRIANGLEBUTTON.CPP提供大家参考,希望对大家有所帮助!
// TriangleButton.cpp : implementation file
//
#include "stdafx.h"
#include "math.h"
#include "TriangleButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTriangleButton
CTriangleButton::CTriangleButton()
{
PointDirection = POINT_RIGHT;
}
CTriangleButton::~CTriangleButton()
{
}
BEGIN_MESSAGE_MAP(CTriangleButton, CButton)
//{{AFX_MSG_MAP(CRoundButton)
ON_WM_NCHITTEST()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CTriangleButton::SetDirection(POINTDIRECTION Direction)
{
PointDirection = Direction;
PreSubclassWindow();
}
CTriangleButton::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;
//TRACE("x=%i y=%i\n", cx, cy);
return CButton::SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);
}
/////////////////////////////////////////////////////////////////////////////
// CRoundButton message handlers
void CTriangleButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
//get client rectangle
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
//make some pens
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));
//NOTE: If U use this class for NT apps only, use the implementation of FocusPen below
// instead, as WIN95 doesn't support this yet (though the doc says **dang ms-fools**)
// (WIN98 might also support this)
//LOGBRUSH logbrush; logbrush.lbStyle = BS_SOLID; logbrush.lbColor = RGB(0,0,0); logbrush.lbHatch = NULL;
//CPen FocusPen(PS_COSMETIC | PS_ALTERNATE, 1, &logbrush);
CPen FocusPen(PS_DOT, 0, RGB(0,0,0));
//Draw button
switch (PointDirection) {
case POINT_UP : {
//Draw the raised/sunken edges of the button (unless flat)
if (nStyle & BS_FLAT) { //style is 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 { //style not flat
if ((state & ODS_SELECTED)) { //Button is down
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 { //Button is not down
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);
}//else|if
}//else|if
break;
}//case
case POINT_DOWN : {
//Draw the raised/sunken edges of the button (unless flat)
if (nStyle & BS_FLAT) { //style is 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 { //style not flat
if ((state & ODS_SELECTED)) { //Button is down
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 { //Button is not down
pDC->SelectObject(ShadowPen);
pDC->MoveTo(0, 0);
pDC->LineTo(rect.right / 2, rect.bottom);
pDC->LineTo(rect.right, 0);
pDC->MoveTo(1, 1);
pDC
上一篇:
TREEVIEWRESOURCE.CPP
下一篇:
浅析普外科围手术期抗菌药物的应用