Histogram Control

À§ÀÇ ±×¸²Àº Áö±ÝºÎÅÍ ¼Ò°³ÇÒ È÷½ºÅä±×·¥À» ½ÇÇàÇÑ °ÍÀÌ´Ù. ÀÌ ÄÚµå´Â codeproject (http://www.codeproject.com)¿¡¼ °¡Á®¿Â ³»¿ëÀ» Á¶±Ý Á¤¸®ÇÑ °ÍÀÌ´Ù.
³»¿ëÀÌ¾ß ¹¹ º¸´Â ±×´ë·ÎÀ̰í, Ç×»ó ±×·¯ÇÏµí ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇØ º¸ÀÚ. ÀÌ ÄÁÆ®·ÑÀº static text ÄÁÆ®·Ñ¿¡¼ ÆÄ»ýµÇ¾î ³ª¿Â °ÍÀÌ´Ù.
´ÙÀ̾ó·Î±× º£À̽º·Î ÇØµµ »ó°ü¾ø°ÚÁö¸¸ ¿©±â¼´Â SDIÀÇ ºä¿¡¼ ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´õºíŬ¸¯Çϸé À§ÀÇ ±×¸²°ú °°Àº ´ÙÀ̾ó·Î±× ¹Ú½º°¡ Çϳª ³ª¿Àµµ·Ï ¸¸µé °ÍÀÌ´Ù.
¼Ò½º ÆÄÀÏ ¹Þ±â ¿¹Á¦ ÇÁ·ÎÁ§Æ® ¹Þ±â
1. SDI ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µç´Ù. ¿©±â¼´Â Histo ¶ó°í
ÇÁ·ÎÁ§Æ®¸íÀ» Áö¾ú´Ù.
¼Ò½ºÆÄÀÏÀ» ¹Þ¾Æ¼ ÇÁ·ÎÁ§Æ®¿¡
Ãß°¡ÇÑ´Ù.
2. ¸®¼Ò½º¿¡ ´ÙÀ̾ó·Î±× ÅÛÇø´À» Çϳª Ãß°¡ÇÑ´Ù. ID´Â IDD_HISTOGRAM À̶ó ÇÑ´Ù.
3. À§ÀÇ ±×¸²Ã³·³ ÄÁÆ®·ÑµéÀ» ¹èÄ¡ÇÑ´Ù. ¿©±â¼ IDC_HISTOGRAMÀº static text ÄÁÆ®·ÑÀÌ´Ù. ¶óµð¿À ¹öưÀ» ¹èÄ¡ÇÒ ¶§ group ¼Ó¼ºÀ» Á¦´ë·Î ÁöÁ¤ÇÏ´Â °É ÀØÁö ¸» °Í. Âü°í·Î À̾߱âÇÏÀÚ¸é ¶óµð¿À ¹öưÀ» ¹èÄ¡ÇÒ ¶§ °°Àº ±×·ìÀ¸·Î ÀνĵǷÁ¸é Ctrl-D ¸¦ ´·¶À» ¶§ ³ª¿À´Â order »Ó¸¸ ¾Æ´Ï¶ó ¸®¼Ò½º °ªµµ ¼ø¼´ë·Î µÇ¾î ÀÖ¾î¾ß Çϰí, ±×·ì³»ÀÇ °¡Àå ¼±µÎÀÇ ¶óµð¿À ¹Ú½º ÄÁÆ®·Ñ¸¸ group ¼Ó¼ºÀ» üũÇÑ´Ù.
4. ÀÌ ´ÙÀ̾ó·Î±× ¹Ú½º¿¡ ¿¬°áµÇ´Â Ŭ·¡½º¸¦ ¸¸µç´Ù. ±×³É ´ÙÀ̾ó·Î±× ÅÛÇø´ À§¿¡¼ ´õºíŬ¸¯ÇÏ¸é µÈ´Ù. Ŭ·¡½º À̸§Àº CHistogramDlg ¶ó°í Áö¾ú´Ù.
5. ÀÌ Å¬·¡½º¿¡¼ Ŭ·¡½º À§Àúµå¸¦ »ç¿ëÇØ¼ ´ÙÀ½°ú °°ÀÌ º¯¼öµéÀ» ¿¬°áÇÑ´Ù. ¿©±â¼ CAlexfStaticHistogramÀº ¹Ù·Î ³ª¿ÀÁö ¾ÊÀ¸¹Ç·Î ¿ì¼± CStatic À¸·Î ¿¬°áÇÑ ÈÄ Çì´õÆÄÀÏÀ» ¿¾î Á÷Á¢ °íÄ¡¸é µÈ´Ù. m_bMotionÀº È÷½ºÅä±×·¥ÀÌ ½ÃÀ۵Ǵ À§Ä¡¸¦ ¿ÞÂÊ ¶Ç´Â ¿À¸¥ÂÊÀ¸·Î Á¤ÇÏ´Â º¯¼öÀ̰í, m_bText´Â ȸ鿡 ³ªÅ¸³ª´Â ÅØ½ºÆ®ÀÇ À§Ä¡¸¦ ¿ÞÂÊ ¶Ç´Â ¿À¸¥ÂÊÀ¸·Î Á¤ÇÏ´Â º¯¼öÀÌ´Ù.
IDC_HISTOGRAM CAlexfStaticHistogram
m_Histogram
IDC_RADIO_MOTION_LEFT
int m_bMotion
IDC_RADIO_TEXT_LEFT
int m_bText
6. ŸÀ̸ӿ¡ »ç¿ëÇÒ º¯¼ö¸¦ ´ÙÀ½Ã³·³ Çϳª ÁöÁ¤ÇÑ´Ù. ÀÌ º¯¼ö´Â ŸÀ̸Ӱ¡ »ì¾ÆÀÖ´ÂÁö È®ÀÎÇϴµ¥ »ç¿ëµÈ´Ù.
public:
BOOL m_bTimerLive;
7. HistogramDlg.cpp ÆÄÀÏÀ» ¿¾î »ý¼ºÀÚ¸¦ ´ÙÀ½°ú °°ÀÌ °íÄ£´Ù. óÀ½¿¡ m_bMotion°ú m_bText´Â -1ÀÌ ´ëÀԵǵµ·Ï µÇ¾îÀÖÀ» °ÍÀÌ´Ù.
CHistogramDlg::CHistogramDlg(CWnd* pParent /*=NULL*/)
:
CDialog(CHistogramDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CHistogramDlg)
m_bMotion
= 0;
m_bText = 0;
//}}AFX_DATA_INIT
m_bTimerLive
= FALSE;
}
8. WM_INITDIALOG ¸Þ½ÃÁöÀÇ Çڵ鷯¸¦ ÀÛ¼ºÇÑ´Ù. ¾Æ·¡ÀÇ Äڵ忡¼ º¸µí ÅØ½ºÆ® ÆøÀº 30, ÁÙ ¼ö´Â 10 ÀÌ´Ù. ±×¸®°í ¸¶Áö¸· ÁÙÀ» º¸¸é óÀ½¿¡ 50ÀÇ °ªÀ¸·Î È÷½ºÅä±×·¥ ÇÑ ÁÙÀ» ±×¸®µµ·Ï µÇ¾îÀÖ´Ù.
BOOL CHistogramDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
TODO: Add extra initialization here
m_Histogram.SetTextWidth(30);
m_Histogram.SetTextLines(10);
m_Histogram.text[0]
= "100";
m_Histogram.text[1]
= "90";
m_Histogram.text[2]
= "80";
m_Histogram.text[3]
= "70";
m_Histogram.text[4]
= "60";
m_Histogram.text[5]
= "50";
m_Histogram.text[6]
= "40";
m_Histogram.text[7]
= "30";
m_Histogram.text[8]
= "20";
m_Histogram.text[9]
= "10";
m_Histogram.Add(50);
// óÀ½ 50ÀÇ °ªÀ¸·Î ÇÑÁÙ ±×¸²
return
TRUE; // return TRUE unless you set the focus to a control
//
EXCEPTION: OCX Property Pages should return FALSE
}
9. ´ÙÀ½°ú °°ÀÌ °¢ ÄÁÆ®·ÑµéÀÇ Çڵ鷯¸¦ ÀÛ¼ºÇÑ´Ù.
void CHistogramDlg::OnButtonAdd()
{
m_Histogram.Add((DOUBLE)
rand() / (DOUBLE) RAND_MAX * 100);
}
void CHistogramDlg::OnRadioTextLeft()
{
m_Histogram.SetTextLeft();
}
void
CHistogramDlg::OnRadioTextRight()
{
m_Histogram.SetTextLeft(FALSE);
}
void
CHistogramDlg::OnRadioMotionLeft()
{
m_Histogram.SetMotionLtoR();
}
void
CHistogramDlg::OnRadioMotionRight()
{
m_Histogram.SetMotionLtoR(FALSE);
}
void
CHistogramDlg::OnTimer(UINT nIDEvent)
{
m_Histogram.Add((DOUBLE)
rand() / (DOUBLE) RAND_MAX * 100);
CDialog::OnTimer(nIDEvent);
}
10. ´ÙÀ½°ú °°ÀÌ Å¸À̸ӿ¡ °ü°èµÈ ¹öưÀÇ Çڵ鷯¸¦ ±¸ÇöÇÑ´Ù. ¿©±â¼´Â 0.1 ÃÊ °£°ÝÀ¸·Î ŸÀ̸Ӱ¡ È£ÃâµÇµµ·Ï ÇÏ¿´´Âµ¥, ¾Ë´Ù½ÃÇÇ Å¸À̸ÓÀÇ À¯È¿ Ãּҽ𣰣°ÝÀº 1/18.2 = 0.055 ÃÊ °¡·®µÈ´Ù. ÀÌ´Â 1ÃÊ¿¡ 18.2¹øÀÇ Å¬·°ÀÌ °É¸®±â ¶§¹®Àε¥, ¸¸¾à À̺¸´Ù ´õ »¡¸® ½Ã°£°£°ÝÀ» Á¤ÇÏ°í ½Í´Ù¸é for¹®À̳ª while¹® °°Àº ¼øÈ¯¹®À» »ç¿ëÇÏ¸é µÈ´Ù. ±×·² °æ¿ì ºüÁ®³ª¿À´Â Á¶°ÇÀ» ÁÖ±âÀ§Çؼ ´ÙÁß ¾²·¹µå¸¦ ÀÌ¿ëÇϰųª ¸Þ½ÃÁö ÆßÇÁ¸¦ »ç¿ëÇÏ¸é µÈ´Ù.(¸Þ½ÃÁö ÆßÇÁ¿¡ °üÇÑ ³»¿ëÀº Ȩ ³»¿ë ÂüÁ¶)
void CHistogramDlg::OnButtonAuto()
{
//
¹öưÀÇ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù.
CButton
*pButton = (CButton *)GetDlgItem(IDC_BUTTON_AUTO);
if(!m_bTimerLive)
{
SetTimer(100,
100, NULL);
pButton->SetWindowText("Auto
Finish");
m_bTimerLive
= TRUE; // ŸÀ̸ÓÀÇ »ýÁ¸ ¿©ºÎ °áÁ¤
}
else {
KillTimer(100);
pButton->SetWindowText("Auto
Start");
m_bTimerLive
= FALSE; // ŸÀ̸ÓÀÇ »ýÁ¸ ¿©ºÎ °áÁ¤
}
}
11. ¸¶Áö¸·À¸·Î HistogramDlg.h ÆÄÀÏ¿¡ ´ÙÀ½Ã³·³ ¼Ò½ºÆÄÀÏÀ» ÀÎŬ·çµåÇÑ´Ù.
#include "AlexfStaticHistogram.h"
12. ¾Õ¿¡¼ ¸»Çß´Ù½ÃÇÇ ºä¿¡¼ ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´õºíŬ¸¯ÇÏ¸é ´ÙÀ̾ó·Î±× ¹Ú½º°¡ ¶ßµµ·Ï ¸¸µç´Ù.
´ÙÀ½°ú °°ÀÌ Çì´õÆÄÀÏÀ» ºä¿¡ ÀÎŬ·çµåÇϰí
#include "HistogramDlg.h"
´ÙÀ½Ã³·³ Çڵ鷯¸¦ ÀÛ¼ºÇÑ´Ù.
void CHistoView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CHistogramDlg
dlg;
dlg.DoModal();
CView::OnLButtonDblClk(nFlags,
point);
}