
Introduction
This article shows how to implements the angle custom control, a circle with a line indicating a rotation angle.
This control is a CWnd based control, it includes three classes CBTAngleWnd,
CBTComboBox,
CBTEditBox. We can use this control to attach with another CWnd based control, such as we can attach to
staticbox, button, editbox, combobox etc. The core class is CBTAngleWnd. All source code is included within the zip files.
How to use it
Step1:First off, to use the CBTAngleWnd class, you will need to include the following files in your project:
- BTAngleWnd.h
- BTAngleWnd.cpp
- BTComboBox.h
- BTComboBox.cpp
- BTEditBox.h
- BTEditBox.cpp
Step2: Once you have the class at your disposal, using it is simple. Open dialog resource editor, drag a new picture control from the control toolbar panel
to the dialog, and change it's ID to IDC_ANGLE1. Then you should check the
Notify property value. As the blow shows:

Step3: Add two members to your dialog class like this:
class CTestAngleDlg : public CDialog
{
public:
CTestAngleDlg(CWnd* pParent = NULL);
enum { IDD = IDD_TESTANGLE_DIALOG };
CFOHyperLink m_Home;
CStatic m_Static;
CBTAngleWnd m_AngleCtrl1;
Step4: Now add the following bolded code below to your OnInitDialog() function:
BOOL CTestAngleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_Home.SetColors(RGB(0,0,255), RGB(0,0,255), RGB(51,102,153) );
m_Home.SetURL
(_T("http://www.ucancode.net/Products/free%20product/colorpicker.htm"));
m_AngleCtrl1.SubclassDlgItem(IDC_ANGLE1, this);
m_Static.SubclassDlgItem(IDC_STATIC_ANGLE, this);
m_AngleCtrl1.AttachToEditBox(&m_Static);
m_AngleCtrl1.TurnOnNow(TRUE);
m_Static.SetWindowText("225");
m_AngleCtrl1.SetAngleValue(225, TRUE);
return TRUE;
}
That's all you need to do. If you want to attach the angle control to an edit box or
a combo box, you should use the following code instead:
CBTComboBox m_AngleCombo;
CBTEditBox m_AngleEdit;
CBTAngleWnd m_AngleCtrl2;
CBTAngleWnd m_AngleCtrl3;
m_AngleCtrl3.SubclassDlgItem(IDC_ANGLE3, this);
m_AngleCombo.SubclassDlgItem(IDC_COMBO_ANGLE, this);
m_AngleCtrl3.AttachToEditBox(&m_AngleCombo);
m_AngleCombo.AttachToAngleBox(&m_AngleCtrl3);
m_AngleCtrl3.TurnOnNow(TRUE);
m_AngleCombo.SetWindowText("45");
m_AngleCtrl3.SetAngleValue(45, TRUE);
m_AngleCtrl2.SubclassDlgItem(IDC_ANGLE2, this);
m_AngleEdit.SubclassDlgItem(IDC_EDIT_ANGLE, this);
m_AngleCtrl2.AttachToEditBox(&m_AngleEdit);
m_AngleEdit.AttachToAngleBox(&m_AngleCtrl2);
m_AngleCtrl2.TurnOnNow(TRUE);
m_AngleEdit.SetWindowText("90");
m_AngleCtrl2.SetAngleValue(90, TRUE);
m_AngleCtrl2.SetBackColor(::GetSysColor(COLOR_ACTIVECAPTION));
That's all. If you have any good ideas about this control, feel free to let me know.
Click
here to view my profile and report bugs.