myatlctrl.cpp

来自「VC.net 的一些有用的技巧」· C++ 代码 · 共 61 行

CPP
61
字号
// MyATLCtrl.cpp : CMyATLCtrl 的实现
#include "stdafx.h"
#include "MyATLCtrl.h"


// CMyATLCtrl
STDMETHODIMP CMyATLCtrl::get_Sides(SHORT* pVal)
{
	// TODO: 在此添加实现代码
	*pVal = m_nSides;
	return S_OK;
}

STDMETHODIMP CMyATLCtrl::put_Sides(SHORT newVal)
{
	// TODO: 在此添加实现代码
	if (newVal > 2 && newVal < 21)
	{
		m_nSides = newVal;
		FireViewChange();
		return S_OK;
	}
	else
		return Error(_T("Shape must have between 3 and 20 sides"));
}

void CMyATLCtrl::CalcPoints(const RECT& rc)
{
	const double pi = 3.14159265358979;
	POINT   ptCenter;
	double  dblRadiusx = (rc.right - rc.left) / 2;
	double  dblRadiusy = (rc.bottom - rc.top) / 2;
	double  dblAngle = 3 * pi / 2;          // Start at the top
	double  dblDiff  = 2 * pi / m_nSides;   // Angle each side will make
	ptCenter.x = (rc.left + rc.right) / 2;
	ptCenter.y = (rc.top + rc.bottom) / 2;
	// Calculate the points for each side
	for (int i = 0; i < m_nSides; i++)
	{
		m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
		m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
		dblAngle += dblDiff;
	}
}

LRESULT CMyATLCtrl::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	HRGN hRgn;
	WORD xPos = LOWORD(lParam); 
	WORD yPos = HIWORD(lParam);
    CalcPoints(m_rcPos);
	hRgn = CreatePolygonRgn(&m_arrPoint[0], m_nSides, WINDING);
	if (PtInRegion(hRgn, xPos, yPos))
		Fire_ClickIn(xPos, yPos);
	else
		Fire_ClickOut(xPos, yPos);
	DeleteObject(hRgn);
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?