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.