리스트 박스의 글자색과 배경색은 기존에 해온대로 WM_CTLCOLOR 이벤트를
이용하면 아주 쉽게 해결됩니다..

HBRUSH CSssDlg::OnCtlColor(CDCpDCCWndpWndUINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDCpWndnCtlColor);

    
if(nCtlColor == CTLCOLOR_LISTBOX)
    {
        
if(pWnd->GetDlgCtrlID() == IDC_LIST1)
        {
            
pDC->SetTextColor(RGB(25500));
            
pDC->SetBkColor(RGB(255,255,0));

            
// 노랑색으로 만든 브러쉬. - m_brh.CreateSolidBrush(RGB(255,255,0));
            
return m_brh;
        }
    }
    
return hbr;
}

88.zip
0.03MB


지금까지 다룬 방식으로 아주 쉽게 처리가 되었읍니다. -_-
강좌라고 할만한 껀덕지도 없읍니다.

하지만 컨트롤을 오버라이딩해서 별도로 구현하지 않는이상.. 리스트박스는 별로
다룰만한게 없다보니.. 휴~~

리스트 박스를 사용하면서 주로 쓰이는 기능이 대표적으로 아이템의 추가, 삽입, 삭제 및 선택 기능이다. 기능은 단순하지만, 리스트 박스의 속성에 따라 동작 특성이나 메서드의 응답이 달라진다.

아래의 함수는 리스트박스에 긴 문자열이 들어갔을 경우, 수평 스크롤바를 생성시키는 코드이다.
이전 장에서 다룬것을 조금 확장한 것이고, 앞으로 리스트박스에서 항상 쓰일 함수이다.

static int GetTextLenEx(CListBox& box, LPCTSTR lpszText)
{
    CSize size;
    CDC *pDC = box.GetDC();
   
    CFont* pOld = pDC->SelectObject(box.GetFont());
    if ((box.GetStyle() & LBS_USETABSTOPS) == 0)
    {
        size = pDC->GetTextExtent(lpszText, _tcslen(lpszText));
        size.cx += 3;
    }
    else
    {
        size = pDC->GetTabbedTextExtent(lpszText, _tcslen(lpszText), 0, NULL);
        size.cx += 2;
    }
    pDC->SelectObject(pOld);
    box.ReleaseDC(pDC);
   
    return size.cx;
}
static void AddStringEx(CListBox& box, CString str, int ndx = -1)
{
    if(ndx == -1)
        box.AddString(str);
    else
        box.InsertString(ndx+1, str);
    int iExt = GetTextLenEx(box, str);
    if (iExt > box.GetHorizontalExtent())
        box.SetHorizontalExtent(iExt);
}

우선 리스트 박스 하나를 single 선택 모드로 예제를 하나 작성하였다.
리스트 박스를 선택할  속성에 따라 동작이 다름에 주의하여야 한다.


각각의 기능을 구현한 함수는 다음과 같다.

void CSssDlg::OnButton1()
{
    
AddStringEx(m_list"하나");  AddStringEx(m_list"");
    
AddStringEx(m_list"");     AddStringEx(m_list"");
    
AddStringEx(m_list"다섯");  AddStringEx(m_list"여섯");
    
AddStringEx(m_list"일곱");  AddStringEx(m_list"여덟");
    
AddStringEx(m_list"아홉");  AddStringEx(m_list"임의의 아이템을 10개를 리스트 박스에 삽입함.");
}

void CSssDlg::OnButton2()
{
    
UpdateData(TRUE);
    
AddStringEx(m_listm_str_insertm_list.GetCurSel());
}

void CSssDlg::OnButton3()
{
    
UpdateData(TRUE);

    
m_list.SetCurSel(m_sel_program);
}

void CSssDlg::OnButton4()
{
    
m_list.DeleteString(m_list.GetCurSel());
}

void CSssDlg::OnButton5()
{
    
m_list.ResetContent();
}
single 
선택 모드일 경우는 아이템을 하나씩만 선택할  있기 때문에선택이나 삭제가
위처럼 수월하게 이루어진다.

하지만 multiple extended  다중 선택할 경우.. GetCurSel 응답이 약간 달라진다.
single
   
아이템이 선택되었을 경우 : 선택된 아이템의 인덱스
   
아이템이 선택되어지지 않았을 경우 : -1
multiple or extended
   
아이템이 선택되었을 경우 : 최종 선택된 아이템의 인덱스
   
아이템이 선택되어지지 않았을 경우 : 0

일단 다중 선택이 가능한 상태에서 그럼 어떻게 여러개의 아이템이 선택되어 졌는지를
인식하고 항목들을 가져   있는지 살펴보자.

void DoSomething(CListBoxbox)
{
    
// 몇개의 아이템이 선택되어졌는지 카운트
    
int nCount = box.GetSelCount();

    
// 선택되어진 아이템이 하나도 없으면 리턴.
    
if(nCount <= 0)
        
return;

    
// 배열을 하나 만들고크기를 설정한다.
    
CArray<int,intaryListBoxSel;
    
aryListBoxSel.SetSize(nCount);

    
// 아이템중에서 선택되어진 인덱스를 배열에 읽어온다.
    
box.GetSelItems(nCountaryListBoxSel.GetData());

    
for(int i=0i<nCounti++)
    {
         
// 선택된걸 하나씩 뽑아서 먼가 처리를 하겠지...
         
int sel = aryListBoxSel[i];

        
// do something...
    }
}

위의 함수에서 보았듯이 여러개의 아이템이 선택되어져 있을 경우먼저 선택 아이템 카운트를
읽어온다음 인덱스를 배열에 읽어오는 과정을 거친다.

그럼 다중 선택일 경우에 선택아이템을 지우는 버튼의 코드를 수정해보자.

싱글 선택일 경우는 아래와 같았다.
void CSssDlg::OnButton4()
{
    
m_list.DeleteString(m_list.GetCurSel());
}

멀티 선택일 경우는 다음과 같다.
void CSssDlg::OnButton4()
{
    
int nCount = box.GetSelCount();
    
if(nCount <= 0)
        
return;

    
CArray<int,intaryListBoxSel;
    
aryListBoxSel.SetSize(nCount);
    
box.GetSelItems(nCountaryListBoxSel.GetData());

    
// 앞에꺼 부터 지우게 되면 뒤쪽의 저장해 놓은 인덱스 정보가 틀어지게 되므로
    
// 뒤에꺼 부터 앞으로 하나씩 지우면 된다.
    
for(int i=nCount-1i>=0i--)
          
m_list.DeleteString(aryListBoxSel[i]);
}

86.zip
0.03MB

출처 : http://kr.sun.com/news_market/boardroom/200502/qualified/0105feature.html

난관인 동시에 또 하나의 기회인 Sarbanes Oxley 법


미국 증권거래소에 상장된 각국 기업들은 새로 입안된 내부금융감독 관련 법안 규정 준수를 시도하고 있습니다 . 그러나 문제는 법안이 제공하는 혜택이 과연 그에 따른 비용을 상쇄할 수 있느냐 하는 점입니다 .

본 이사회의록에서는 총 2 부에 걸쳐 사베인 옥슬리 (SOX) 법안에 대한 논의사항을 다루게 됩니다 . 제 1 부는 법안 제정 배경 , 비전 및 전망과 관련하여 , SOX 입안에 참여한 썬 임원 Lynn Turner 씨와의 인터뷰 내용을 담고 있으며 , 2 부에서는 특정 기업의 법안 규정 준수 사례를 들어봅니다 .

See the answers to these questions:

Q: 사베인 옥슬리 법안의 전문가가 된 배경은 무엇입니까 ?

A: 저는 1998 년 7 월부터 2001 년 8 월까지 미국 증권거래위원회 전문심의위원 회계담당직을 맡고 있었습니다 . 그 당시 증권거래위원회는 여러 차례에 걸쳐 개혁을 시도했는데 , 위원장인 Arthur Levitt 씨에게 시장 움직임 , 투자 동향 , 그리고 자본분배방법 분석의 기초가 되는 미국 기업들의 재무제표를 검토하라는 지시가 저에게 떨어졌습니다 .

증권거래위원회에 몸담았던 3 년 동안 재무보고서의 질 ( 質 ) 을 둘러싼 논쟁이 끊임없이 이어졌으며 , 수익의 인식 척도 등 재무제표 기준에 관한 업무 중 일부를 결국 증권거래위원회가 담당하게 되었습니다 . 현재 여러 경영대학에서 교제로 활용되고 있는 "숫자 게임(The Number Game)," 이라는 연설문을 Levitt 위원장이 발표한 것이 바로 이 시기입니다 .

이러한 조치는 부분적으로 성공을 거둔 동시에 의회의 반발을 사기도 했습니다 . 2001 년 10 월 중순 즈음하여 엔론 사태가 불거져 나왔고 , 의회에서 증권거래위원회의 의제를 30 일 내에 검토한 후 Harvey Pitt 의장에게 제안서를 제출했습니다 . 회의가 진행되는 동안 국회 관계자들은 엔론 사태가 더욱 심각해질 경우 법안 제정과정에 합류하라는 지시를 받았습니다 . 본인은 증권거래위원회에 몸담고 있을 동안 Ernst & Young 의 CEO 를 도와 새로 설립되는 회계감독위원회 법안 제정에 참여한 경험이 있었습니다 . 바로 이 경험을 살려 그룹 구성 및 법안 제정 작업을 진행했던 것이며 , 그 당시 작성된 초고가 현재의 사베인 옥슬리 법안의 기초가 된 동시에 공공기업회계감독위원회의 기본원칙으로 사용되고 있습니다 .

Q: 법안에 대한 워싱턴 정가의 반응은 어땠습니까 ?

A: 법안이 통과되기까지의 과정은 순탄하지만은 않았습니다 . 저는 그 당시 포츈지가 선정한 25 대 기업의 간부 250 명이 참석하는 강연 때문에 캘리포니아에 머물고 있었으며 , 강의를 진행하면서 내부감사나 해외부패 실무법 관련 연수 경험이 있는 청중에게 지원과 도움을 요청했지만 겨우 한 사람만이 협조를 약속했을 뿐입니다 . 이 때 저는 확신을 갖게 되었습니다 . 업계의 반대에 부딪히는 한이 있더라도 경영인들의 내부감사에 대한 인지도를 높이려면 반드시 SOX 404 항을 포함시켜야 한다는 사실을 말입니다 .

솔직하게 말씀 드리면 , 월드컴 사태가 발생하지 않았다면 법안은 통과되지 못했을 것입니다 . 이 사태 이후 진행된 설문 조사 결과를 보면 월드컴 사태가 차기 선거에 얼마나 커다란 영향을 미쳤는지 그 영향력의 비중을 가늠해 볼 수 있습니다 . 놀랍게도 7 월 넷째 주말 바로 일주일전 , 법안 통과를 반대하던 위원들은 너나 할 것 없이 몰려와 법안 통과에 찬성했습니다 . 결국 대중의 목소리가 반영된 설문 조사가 SOX 법을 통과시킨 것입니다 .




Q: 귀하께서는 사베인 옥슬리법이 기업 , 소비자 그리고 증권 시장에게 어떤 혜택을 제공하게 되리라 생각하십니까 ?

A: 소비자와 투자자들이 망설임 없이 자본을 투자하고 기업 간부들이 제공하는 정보를 신뢰할 수 있었으면 하는 바람입니다. 자본시장 운영이 가능한 이유는 실적이 우수한 기업에 자본을 투자하고 이를 통해 투자자 수익 극대화를 실현할 수 있기 때문입니다. 투자자들에게 정확한 정보가 제공되지 않을 경우, 우리는 효과적인 자본분배를 할 수 없게 됩니다. 99년 후반, Levitt의장과 저는 비즈니스 원탁회의(Business Roundtable : BRT)의 두 의장과 저녁식사를 할 기회가 있었습니다. BRT는 미국의 200대 기업 간부들로 구성되어 있었으며, 이 시기에 업계에는 기술 혁명의 바람이 불고 있었습니다. 산업 관계자들은 효율적인 자본시장 운영에 대해 우려를 하고 있었고, 우리들에게 대책 강구를 촉구했습니다. 두 의장은 수 많은 벤처 기업들이 합법적 비즈니스 활동 외의 다른 영역으로 자본을 유출시키는 것에 대해 매우 걱정을 하고 있었고 이 기업들의 실패 또한 예상하고 있었습니다. 경제 전반에 걸쳐 유치된 자본은 산업부문별로 적절하게 분배되지 못한 채, 오히려 고용 창출, 생산량 증가, 가치 창출을 통해 경제 성장에 기여할 수 있는 기업들은 자금난을 겪고 있다는 것이었습니다. 결국 이들의 예상은 적중했습니다.

Q: 그렇다면 SOX 법이 앞으로 이러한 사태를 어떻게 예방할 수 있겠습니까 ?

A: 이와 같은 상황에서 투자자가 최적의 의사결정을 할 수 있도록 정보를 제공할 의무가 바로 우리에게 있습니다. 한편, SOX법을 통해 증권거래위원회는 투자자들에게 보다 투명한 양질의 정보를 제공할 수 있도록 하는 규정들을 통과시켰습니다. 이는 결국 보다 확실하고 정확한 근거의 자료들을 제공하게 함으로써 투자자들은 최적의 의사결정을 내릴 수 있게 됨은 물론이고, 이 투자 자본을 가장 효율적으로 활용할 기업들에게 자본이 유입되도록 함으로써 사회 전반에 걸쳐 보다 건전한 경제흐름을 유도하기 위한 것입니다.




본인이 생각하는 궁극적 목표는 기업이 소유주에 대한 책임을 다할 수 있도록 정확하고 투명한 정보를 시의적절하게 제공하는 메커니즘을 구축하는 것입니다 . 공공신탁이사위원회 회의 설문조사에 의하면 , 미국인의 73% 가 거대기업의 간부들을 신임하지 않고 있는 것으로 밝혀졌습니다 . 따라서 기업간부들은 SOX 법 준수에 총력을 기울임은 물론이고 미국 기업들에 대한 대중의 부정적인 이미지를 종식시킬 수 있도록 노력해야만 합니다 .

Q: 여러 반대에도 불구하고 결국 국회를 통과한 Sarbanes-Oxley 법이 비즈니스 활동에 긍정적인 영향을 줄 수 있을까요 ?

A: 그렇다고 생각합니다 . 비즈니스위크 11 월호 기사에 의하면 , 기업들은 사베인 옥슬리법 준수를 위해 평균 미화 3 백만 달러와 총 30,000 시간을 투입하는 것으로 밝혀졌습니다 . 이에 대한 이견은 있을 수 없죠 . 하지만 기업이 부정을 저지를 경우 , 투자자는 물론이고 경제와 국민은 더 많은 비용과 대가를 치르게 된다는 사실을 우리는 기억해야 합니다 . SOX 법을 위해서 미국이 치르게 될 비용이 미화 100-200 억 달러인 반면 , 엔론 , 월드콤 등의 사태 이후 시장자본의 손실이 무려 7 조 달러에 달한다는 사실을 보더라도 법 준수를 위한 투자 비용은 극히 일부에 해당한다는 사실을 알 수 있습니다 . 더군다나 해당 기업의 경영진들에 대한 투자자의 불신을 비용으로 환산한다면 그 액수는 그야말로 천문학적인 수준일 뿐 아니라 정직하고 바르게 회사를 경영해온 다른 기업의 경영진들과 직원들까지 억울한 누명까지 쓰게 되는 상황이 발생하게 되는 것입니다 .

우리는 흔히 “ 옥에 티 ” 또는 “ 물 흐린 미꾸라지 ” 등과 같은 표현을 자주 씁니다 . 하지만 , 아주 소수인 것처럼 여겨지는 이런 미꾸라지와 같은 기업들은 예상보다 상당히 많습니다 . 더군다나 재무제표를 재작성해야 하는 기업이 무려 1,000 개 이상에 달하고 있는 이 마당에 “ 옥에 ‘ 티 ' 라는 말은 어울리지 않습니다 . 물론 많은 비용이 발생하게 되겠지만 수 개월에 걸쳐 내부 통제 작업을 진행하다 보면 보다 효율적인 운영 시스템을 분명히 발견할 수 있을 것입니다 . 즉 , 투자자의 자본과 수익을 확실하게 보호하고 보다 양질의 정보를 투자자에게 제공할 수 있는 그런 시스템을 말입니다 .

최근에 본인이 공공기업회계감독기구 자문위원 자격으로 워싱턴 D.C. 를 방문했을 당시 , 회계 분야의 감독과 규제를 위한 사베인 옥슬리법이 새로이 제정된 상태였습니다 . 포츈지가 선정한 500 대 기업의 재무담당 임원진 4 명이 참석하여 제시한 의견들이 아직까지도 제 기억에 강하게 남아있습니다 . 즉 , 그들은 법안 준수에 따른 고충을 토로하면서 지속적인 평가를 통해서 법안 준수를 진행해야 한다는 점을 분명히 했습니다 .

또한 , 그들은 이처럼 강제로 이뤄지는 내부 통제로 인해 보다 개선된 방향을 기업들에게 제시할 수 있게 되었다며 법안 자체에 대해서는 매우 긍정적인 평가를 내렸습니다 . 감사가 진행되면서 업무분장이 제대로 이뤄지지 않고 있었다는 사실이 밝혀졌으며 , 이 과정을 통해 기업이 보다 나은 방향으로 나아갈 수 있게 하는 통제 수단이 강구되기에 이르렀습니다 . 본인의 경험에 비추어봤을 때 내부 통제가 부실한 기업은 절대로 발전할 수 없습니다 . 지난 300 년 동안 수많은 기업들이 내부 통제 문제와 관련하여 근본적 결함을 지니고 있는 것으로 보고되어 왔음에도 불구하고 , 이들 기업의 CEO 와 CFO 는 전혀 아무런 문제가 없는 것처럼 투자자들을 속여 온 것이 사실입니다 . 그 동안 은폐되어 왔던 문제들이 차츰 불거져 나오는 이 시점에서 우리는 이 문제들을 하나씩 해결해 나갈 것입니다 .

단 , SOX 법의 성공 여부는 법 시행 후 적어도 5 년은 지나야 알 수 있을 것입니다 .




Q: 법안 준수로 인해 고충을 겪는 기업들에게 조언 한 마디 해주십시오 .

A: 기업들이 법안 준수를 통해 경영 전반을 신선한 시각으로 관찰할 수 있는 기회로 삼았으면 좋겠습니다 . 경영 개선 여지가 있는지 찾아보십시오 . 체계적이고 단계적으로 조직을 낱낱이 분석평가하고 싶다면 하룻밤으로는 부족합니다 . 힘들고 실망스러운 순간도 있겠지만 여러분이 이런 절호의 기회를 제대로 포착할 수만 있다면 경영 실적 상위 25% 에 드는 기업들을 찾느라 혈안이 되어 있는 기관투자자들의 환심을 곧 살 수 있을 것입니다 . 이러한 성과를 올리는 기업들은 투자자들에게 기대 이상의 수익을 안겨 주게 되고 반대로 기업은 적절한 선물 보따리를 투자자들로부터 받을 수 있습니다 . 즉 , 상생 (win-win) 전략이 성공하는 순간입니다 .

Q: 사베인 옥슬리법이 앞으로 공영화 보다는 민영화를 보조한다는 견해에 대해서는 어떻게 생각하십니까 ? 근거 있는 이야기입니까 ?

A: 어떤 측면에서는 맞는 이야기입니다 . 민영화가 절실히 필요한 기업들이지만 아직까지도 공기업으로 남아있는 기업들이 꽤 있는 것으로 알고 있습니다 . 미국 공기업은 유럽과는 사뭇 다른데 , 공영화가 진행되고 있는 일부 기업들의 경우 투자자들이 주식을 통해 기대 이상의 수익을 창출하도록 하는 능력을 갖추고 있지 못합니다 . 이들 공기업은 수익 창출은커녕 투자자들의 관심조차 끌지 못하고 있습니다 . 전문 애널리스트 분석이나 언론 보도는 물론이고 기관투자자들의 주목조차 받지 못하는 이런 기업의 CEO 들은 불만이 이만 저만이 아닙니다 . 이를 통해 여러 사실을 발견할 수 있는데 , 첫째 , 우리 경제는 철저히 시장논리에 의해 운영되고 있으며 , 둘째 , 공기업의 경우 불이익이 발생하므로 반드시 민영기업을 운영해야만 시장에서 생존할 수 있다는 점입니다 .

SOX 법이 기업들에게 부정적인 영향을 끼치지 않는다고 NASDAQ 회장은 말합니다 . 또한 그는 월스트리트저널誌 사설을 통해 미국 시장 IPO 와 각국 기업 유치에 어려움을 전혀 겪고 있지 않다고 설명합니다 .

기업의 공영화에 대한 본인의 입장은 중립적입니다 . 하지만 , 일단 투자를 유치하면 경영자는 투자자들에게 정확한 정보를 시의적절히 제공하고 관련 규칙과 규정을 성실하게 준수할 의무가 있습니다 . 이러한 의무를 이행할 수 없는 기업들은 투자 유치를 자체를 받아 들여서는 안 됩니다 .




Q: 썬社의 임원으로서 SOX 법 관련 전반 상황에 대한 개인적인 견해는 어떻습니까 ? 또 , 귀하께서는 구체적으로 어떻게 기여하고 계십니까 ?

A: 썬의 임원 재직하게 되면서 받은 임금은 천문학적인 금액입니다 . 우리 이사회의 구성원들을 보면 쟁쟁한 인물들이 눈에 들어옵니다 . Intuit 社의 Steve Bennett, Kleiner Perkins 社의 John Doerr, Naomi Seligman, Scott McNealy 등과 같은 지식인들과 회의를 진행하는데 , 정말이지 모두 내로라 하는 인재들이죠 .

본인의 역할에 대해 물으셨죠 ? 마이크로소프트 社와 관련한 결산 그리고 회계 관련 업무에 대해 본인의 전문지식을 제공하고 있습니다 . 또한 , 필요에 따라 증권거래위원회와의 커뮤니케이션 창구 역할을 하기도 하며 , 인수 , 사업 계획 , 전략을 검토하면서 피드백을 제공합니다 .

한 회사의 임원으로 발탁되면 비윤리적인 스캔들에 연루될 위험성도 생기기 마련이죠 . 하지만 , 썬의 경우 Scott McNealy 와 Steve McGowan 의 도덕성은 매우 신뢰할 만 합니다 . 사실 McNealy 회장은 SOX 법에 대해 아주 호의적이지는 않지만 법규 준수 과정에서 그 특유의 완고한 표정으로 주변 사람들에게 바른 길을 가도록 강력하게 방향을 제시해 왔습니다 . 바로 이것이 SOX 법이 담고 있는 메시지라 할 수 있습니다 .

Lynn Turner 소개

Lynn Turner 는 전문심의위원 회계담당 , 회계학 전공 교수 , 기업이사회 회원 , 유명 다국적 회계법인 파트너 , 리서치 회사의 임원 , CFO 겸임 임원 등의 화려한 경력의 소유자입니다 .

Turner 씨는 1998 년 7 월부터 2001 년 8 월까지 증권거래위원회장이 임명하는 전문심의위원 회계 담당직을 역임했으며 , 전문심의위원으로써 증권거래위원회장과 미국 자본시장 내 기업재무감사 , 기업공시 , 기업지배구조 관련 문제를 다루는 상임 자문위원을 맡기도 했습니다 .

Turner 씨는 현재 Glass Lewis & Co. 의 리서치부 임원으로 재직 중입니다 . Glass Lewis 社는 특허 리서치와 총체분석을 통해 기업의 청렴도 및 재무 투명성을 객관적으로 평가하는 분석 프록시 / 재무 리서치 회사입니다 . Turner 氏는 Kroll Zolfo Cooper 社의 선임자문위원 직도 맡고 있는데 , Kroll Zolfo Cooper 社는 기업 자문 , 기업구조조정 , 과학수사 및 소송 전문기업 입니다 . 그는 또한 썬 마이크로시스템즈社의 임원으로 재임 중이며 기업회계감독기구 내 표준자문그룹의 회원이기도 합니다 .
SEC. 404. MANAGEMENT ASSESSMENT OF INTERNAL CONTROLS.
(a) RULES REQUIRED.—The Commission shall prescribe rules
requiring each annual report required by section 13(a) or 15(d)
of the Securities Exchange Act of 1934 (15 U.S.C. 78m or 78o(d))
to contain an internal control report, which shall—
(1) state the responsibility of management for establishing
and maintaining an adequate internal control structure and
procedures for financial reporting; and
(2) contain an assessment, as of the end of the most recent
fiscal year of the issuer, of the effectiveness of the internal
control structure and procedures of the issuer for financial
reporting.
(b) INTERNAL CONTROL EVALUATION AND REPORTING.—With
respect to the internal control assessment required by subsection
(a), each registered public accounting firm that prepares or issues
the audit report for the issuer shall attest to, and report on, the
assessment made by the management of the issuer. An attestation
made under this subsection shall be made in accordance with standards
for attestation engagements issued or adopted by the Board.
Any such attestation shall not be the subject of a separate engagement.

http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=107_cong_bills&docid=f:h3763enr.txt.pdf
http://www.sec.gov/rules/proposed/s74002/card941503.pdf


사베인 옥슬리법(SOX) 준수: 심층 분석
[출처 http://kr.sun.com/news_market/boardroom/200503/0305leadingvision.html]
[원문
http://www.sun.com/emrkt/boardroom/newsletter/0305leadingvision.html]

Sun 사의 재정담당 이사인 Sue Patterson 씨는 기업의 사베인 옥슬리법 404 조항 준수에 관한 분야를 책임지고 있습니다. 총 2부로 구성된 본 연재물의 2 부분에서는 법안 준수와 관련한 그녀의 경험과 법안 준수 노력 전반에 관한 의견을 들어보는 자리를 마련하였습니다.

주어진 질문은 다음과 같습니다.

질문: 사베인 옥슬리법(SOX)이 회사와 경영진에 미치는 영향은 무엇입니까? 회사는 내부 재정 담당자를 추가로 고용해야 합니까?

답변: 전술적인 면에서는 막대한 자원이 필요합니다 . 내부 인력으로 이를 충당할 수 있는 회사도 있고 외부 컨설턴트를 고용해야 하는 회사도 있겠습니다. 우리 회사는 가능한 한 내부 인력을 강화하려고 노력해 왔지만 외부 인사를 일부 고용해야 했습니다.

소규모 회사들의 경우 외부 자원을 활용하지 않으면 법안 준수가 더 어려울 전망입니다 . 이 법안, 특히 404 조항에 대하여 소규모 회사들의 항의가 계속해서 있어 왔습니다. 중/대기업의 경우에는 법안 준수가 그다지 어렵지는 않지만 소기업들에게는 커다란 난관이 아닐 수 없습니다.




경영자들은 법안 준수 노력을 지원하고 이를 위한 적절한 조건을 만들어 주어야 합니다 . 조직의 최상부에서 설정한 조건들은 통치 환경의 나머지 부분에 영향을 주며 궁극적으로 재정 보고에도 영향을 미칩니다.

썬의 경영진은 윤리 실현 , 올바른 행동, 부정 행위 보고에 대해 특히 강한 어조로 강조한 바 있습니다. 결국, 이 모든 것들이 재정 보고에까지 영향을 미치게 됩니다. 다른 회사의 경영진은 이를 본보기로 삼아 윤리 기준과 바른 기업 관리를 강조하는 기회로 활용하면 될 것입니다.

질문: 법 준수를 위해서 해야 할 일에 대하여 간단히 설명해 주십시오.

답변: 먼저 모든 재정 절차를 문서화할 필요가 있습니다 . 예를 들어, 우리 회사에는 임금 대장, 자재공급에서부터 대금지불, 장려 보조금 등의 재정 절차가 있습니다. 전체 절차를 문서화하고 핵심 제어(또는 관리) 요소가 무엇인지 우선 파악해야 합니다. 예를 들어, 자재조달과 대금지불의 핵심 제어 포인트는 구매주문서를 공급자에게 보내기에 앞서 필요한 관계자들의 승인을 모두 받아내는 것입니다. .

둘째 , 한 발 뒤로 물러 서서 이러한 절차들과 관리 상태를 관찰하고 본인이 포함되어 있는지 확인하고 설계를 평가하는 것입니다. 그 다음, 많은 시간이 소요되는 작업은 그 절차를 시험하는 것입니다. 예를 들어, 구매주문서에 필요한 수만큼의 서명을 받았는지 확인해야 하는데, 이를 위해서는 일정 수의 구매주문서를 표본으로 뽑아서 이들 하나하나가 올바른 수의 서명을 받았는지 확인해야 합니다. 기본적으로 거래내용을 테스트하는 것입니다.

테스트를 통과하지 못했다면 관리 요소를 수정하여 다시 테스트할 필요가 있습니다 . 여러분의 독립 감사들 또한 이러한 일을 모두 거치면서 그들 자체적으로 테스트를 수행할 것임을 기억하십시오.

관련 절차는 다음과 같습니다 :

  1. 서류
  2. 설계평가
  3. 테스트
  4. 교정
  5. 재테스트
  6. 독립 감사로부터 허가 획득

질문: SOX가 부정 행위를 억제할 수 있다고 믿으십니까?

답변: 시간이 지나면 알 수 있을 것입니다 . 대립되는 관점들이 존재하고 있으니까요. 마음만 먹으면 속일 수 있다는 의견도 있습니다. 판매주문서에서 속임수를 쓰고자 하거나 장부를 조작하려 하면 404 인증 역시 속이게 되는 것입니다.

그러나 , 이 법안에 의하면 다른 수표나 잔고처럼, 독립 감사들을 대상으로 그러한 속임수를 쓰는 것이 어렵습니다. 만약 간부 팀이 제대로 일을 하지 않고 404 인증에 서명을 한다면 그들이 어떻게 감사를 통과할 수 있겠습니까? 이것은 전체 절차에 대한 신뢰를 구현하는 일환이라 할 수 있습니다.

사베인 옥슬리 법안의 일부로 설립된 것이 주식회사 회계 감독위원회 (PCAOB)입니다. 그들의 임무는 감사들을 규제하는 것인데, 특히 Enron 스캔들의 경우 비난의 일부는 감사들에게 돌아가야 한다는 의견도 있었습니다. Enron의 경우, 경영진은 물론이고 감사들도 올바르지 못했다는 평을 듣고 있는 것이 사실입니다.

따라서 , 이 법안은 PCAOB를 통해 감사들을 규제하게 한 것인데, 감찰 및 업무 서류 검사가 수행되고, 잘못된 감사가 있을 경우 이를 찾아 내어 업무에서 제외시킵니다. 모든 상황에 많은 변화가 있어 왔습니다.

질문: 다소 강요적인 측면은 없습니까?

답변: 어느 정도 그렇다고 볼 수도 있지만 , 이는 매우 의미가 있는 일입니다. 기업과 규제자 양측 모두에게 그렇습니다. 한편, 규제자 입장에서는 미국 의회로부터 거의 거침 없이 예산 승인을 받습니다. 그들은 PCAOB를 위해서 사람들을 고용하는데 그들이 대규모 감찰 프로그램을 보유하고 있으며 이 프로그램을 통해 감사 기관을 감사하게 됩니다.




질문: 만약 효과가 있다면, 투자자의 신뢰 측면에서는 어떻습니까?

답변: 신뢰라는 것이 변화 발생 측면에서 쉽사리 측정할 수 없는 무형의 것 중의 하나라고 생각하지만 , 이론적으로는 그렇습니다.

질문: Sun 사의 법안 준수를 위하여 일해 오신 경험을 근거로 해서, 서로 다른 규모의 회사들을 위한 충고를 한 마디 해주십시오.

답변: 세 단계로 요약해서 말씀 드리겠습니다 . .

  1. 성공의 열쇠는 노력을 강구함에 있어서 적절한 자원을 지원 받는 것입니다 . 며칠 또는 몇 주 만에 할 수 있는 일이 아니며, 또한 준수하지 않을 경우의 위험은 너무나 큽니다. 준수하지 않을 경우 처벌 그 이상의 곤경에 빠질 수 있습니다. 여러분은 중대한 취약성을 가지게 됨으로써 비리가 있는 것으로 여겨질 수도 있습니다. 재정 보고에 대한 내부 제어에 있어서 중대한 취약성이 있을 경우 여러분은 재무제표 상의 중대한 오류를 초래할 수 있을 만큼 커다란 약점을 갖게 되며 이는 매우 심각한 결과를 초래할 수 있습니다. 이 경우, 독립적 감사들은 어느 회사가 재정 보고에 있어서 효과가 없는 내부 제어 시스템을 가지고 있는지를 나타내는 반대 의견 (adverse opinion)을 피력해야 합니다. 그러한 경우에 기업의 주가와 기업 이미지에 어떤 충격파가 발생할 지 상상이 가실 것입니다.
  2. 성공 열쇠는 그러한 노력에 대한 지원을 경영진으로부터 실질적으로 받아내는 것입니다 .

  3. 아직 시작하지 않았다면 가능한 한 즉시 시작을 하고 이를 유지하십시오 . 감사, 감사 위원회 그리고 간부 팀과의 정기적인 대화를 통해 동료들이 상황을 알 수 있도록 하십시오.

질문: 이 규정을 썬에서 시행함에 있어서 도전 과제와 이득은 무엇입니까?

답변: 썬에서 직면한 도전 가운데 하나는 우리가 일을 수행함에 있어서 분산적인 즉 , 중앙집권화를 배제하고 있다는 점입니다. 우리는 여러 나라에 진출해 있고 서로 다른 사업부를 운영하고 있기 때문에 어떤 절차를 시행함에 있어서 다양한 방법들이 사용될 수 있습니다. 따라서 우리가 이것들을 글로벌 프로세스라고 부르고는 있지만 실제로 보면 그렇지 않습니다.

반대로 , 우리가 단일 기업으로서 노력해 온 것은 국제화, 절차 개선 그리고 효율성을 증진하는 지렛대로서 404 인증 절차를 활용하는 것인데 저는 이것이 다른 회사에도 이익이 된다고 생각합니다. 만약 모든 자원과 자금이 법안 준수로만 흘러 들어갈 것이라면 우리의 프로세스도 개선해야 할 것입니다. 실제로 수정이 필요한 제어 장치들이 발견되었으며 우리는 이것을 수정했습니다.

내부의 제어 장치를 개선하고 노력과 지출 부분을 강화했다는 것이 우리가 얻은 이익입니다 . 다시 말하지만, 여러분이 할 수 있는 것이 법 준수 뿐이라면 여전히 홈런을 친 것이나 다름 없습니다.




질문: SOX 404에 관한 다음의 질문을 할 때 Scott McNealy 씨는 무슨 말을 했습니까? “누가 어느 시스템에 액세스하고 있는지 알고 있습니까? 확신합니까? SEC는 동의할까요?”

답변: Scott McNealy 씨는 프로세스 업데이트와 문서화를 통해서 재정 데이터의 일관성을 보장하는 것이 SOX 준수가 요구하는 전부는 아니라고 언급했습니다. 효과적인 사용자 인증 관리 솔루션 등과 같은 기술적인 보호책을 사용하는 것이 매우 중요합니다. 왜냐하면, 이것은 재정 보고 절차를 구성하는 데이터 및 애플리케이션 대한 액세스 권한의 내부 제어와 관련한 준수 요구사항을 다루기 때문입니다.

간단히 말해서 , 만약 귀사의 재정 시스템에 누가 접속할 수 있는지 여러분이 알지 못한다면 어떻게 보고의 일관성을 유지할 수 있겠습니까? 썬은 이 문제를 자세히 다룰 수 있는 유용한 백서를 보유하고 있습니다.

질문: SOX는 회사의 프라이버시에 어떤 영향을 줍니까?

답변: 이 법안은 정부가 여러분의 장부를 열람할 수 있도록 하는 권한을 강화시켜 주며 , 또한 귀사의 CEO 또는 CFO가 허위 진술로 감옥에 갈 수도 있다는 점에서 매우 심각한 사안이라 할 수 있습니다. Enron이나 다른 경우를 보면 이것이 꼭 나쁜 일만은 아니지만 말입니다. 그러므로, 정부당국은 유연성을 두면서 그들이 이를 심각하게 여기면서 기업들을 주시하고 있다는 메시지를 경영 간부들에게 보내고 있다고 저는 생각합니다.

질문: 회사의 경영진들의 경우, 다른 개인적 또는 재정적인 영역에 대해서도 영향을 받을 수 있습니까?

답변: 정부는 적어도 불미스러운 행위로 축적된 이익에 대해서는 그들의 개인적인 재정을 추적할 수 있습니다 . 이것은 간부들이 회사의 상황에 대해서 몰랐다는 이유를 내세울 수 없도록 하기 위한 것입니다. 그들은 회사에서 어떤 일이 일어나고 있는지 알아야 할 개인적 책임과 의무를 가지고 있습니다.

질문: 이 프로그램으로 인해 회사가 치러야 할 비용은 무엇입니까?

답변: SOX를 준수할 경우 10억 달러의 돈을 벌면 약 1백만 달러의 비용이 발생하게 된다는 말을 들었습니다. 2004년 7월에 META Group은 전체 주식회사의 약 64%가 재정 규정을 준수하기 위한 예산을 설정해 놓고 있으며 2005년 평균 예산은 720만 달러라고 발표된 바 있습니다. 회사의 감사에 드는 비용이 50% 증가할 것이라는 통계를 들은 적도 있습니다. 이 정도 규모의 비용이라면 대단한 것입니다. 한 해가 마무리되고 기업들이 3월 말에 보고서를 SEC에 제출하게 되면 실질적 효과가 무엇인지 알 수 있을 것입니다.

질문: 이 법안이 미국 기업과의 비즈니스를 보다 안전하게 할 수 있다는 점에서 세계적으로도 영향을 미친다고 생각하십니까?

답변: 그것은 SOX 목표의 일부라고 저는 생각합니다. 기업들의 스캔들로 인하여 미국 자본 시장에서 세계적인 투자자로서의 신뢰에 금이 갔습니다. 유럽과 캐나다 등의 국가는 사베인 옥슬리법과 유사한 프로그램을 이미 시행하고 있다고 들었습니다. 따라서 강화된 기업 통제와 재정적 투명성의 분위기가 널리 확산될 것으로 예상됩니다. 다시 말하지만, 이 법안의 결과로 미국 시장에 대한 신뢰가 회복될 수 있는지는 시간이 지나면 알 수 있을 것입니다.




 

샤베인 옥슬리 법안이라고 불리우며 투자자 및 정보보호를 위한 법률이라고 할 수 있습니다.

SOX법안은 는 철저한 사내 견제와 균형을 통한 경영의 투명성 증가, 기업회계 및 재무보고의 투명성을 목적으로 하여, 기업지배구조(Corporate Governance)의 본연의 모습과 감사제도를 근본적으로 개혁함과 동시에 투자자에 대한 기업경영자의 책임과 의무, 벌칙을 규정한 미국연방법.

정식명칭은 "Public Company Accounting Reform and Investor Protection Act of 2002:상장기업회계개혁 및 투자가보호법" 이며, 법안은 제출한 폴 사베인(Paul Sarbanes) 상원의원, 마이클 G 옥슬리(Michael G.Oxley) 하원의원의 이름에 유래하여 "사베인-옥슬리법」이라 불린다. "기업개혁법"이라 의역되는 경우가 많다.

1929년 대공황 이후 투자자들을 보호하기 위해 입법된 증권법을 통한 노력들에도
불구하고 최근 몇년간 커다란 기업 스캔들이 잇달아 일어나자 , 기존 연방 증권법 중 기업 지배 구조 부분을 대폭 강화한 이 개정안은 기업 활동과 문화에 엄청난 파급 효과를 가져오고 있고 그 여파는 미국을 넘어 유럽과 아시아에도 미치고 있으며 한국 기업도 그 예외일 수 없습니다.

전 11장 69개 조문으로 구성되며, 상장회사회계감사심의회(PCAOB:Public Company Accounting Oversight Board)의 설치, 감사인의 독립성, 재무 디스클로저(기업정보 공개, disclosure)의 확장, 내부통제의 의무화, 경영자에 의한 부정행위에 대한 벌칙강화, 증권분석가 등에 대한 규제, 내부고발자의 보호 등이 규정되어 있다.

이 법은 미국의 공개기업과 그 연결대상 자회사가 적용대상이 될 뿐 아니라, 외국기업이라도 미국의 각 증권시장에서 주식을 공개한 경우에는 원칙적으로 적용된다.
[나스닥에 상장한 국내회사는 이미 이 법에 적용되어 데이터베이스에 대한 보안을 실시하고 있다.]

특히, 주목되는 것이 제404조. 이것은 CEO와 CFO에 대하여 SEC(미국증권거래위원)에 제출하는 서류에 "허위나 기재 누락이 없을 것", "내부통제의 유효성 평가의 開示" 등을 보증하는 증명서와 서명을 첨부하도록 요구하고 있다. 허위가 있을 경우에는 개인적인 책임을 묻게 되며, 벌칙으로 벌금이나 5~20년의 금고형이라는 엄한 형사벌이 마련되어져 있다.

또한 재무보고의 투명성 확보를 위하여 그 기초가 되는 기업 내의 각종 데이터, 업무 프로세스를 포함하여 명확화, 문서화할 것을 의무짓고 있다.

이는 ERP나 회계시스템 등의 정보시스템이나 시스템 개발/보수/운용이라는 업무 프로세스에까지 미쳐 시스템에 대한 접근권한 룰 및 관리, 외부IT벤더에의 위탁계약방법을 포함하여, 공정하고 명확학 절차에 따라 수행되고 그것을 증명할 수 있어야 한다.

데이터베이스 측면에서 바라보면 개인정보 및 이를 포함하는 금융정보를 저장/관리하는 메인 데이터베이스 뿐만 아니라, 이에 액세스하여 서브정보를 수집 하는 영역까지 이 테두리를 벗어날 수 없으며, 이러한 DB에 대한 접근 내역을 모두 기록으로 남겨야 하며 지정된 기간까지 별도로 저장하고 있어햐 한다.

참고.
http://www.tech-faq.com/lang/ko/sarbanes-oxley.shtml
http://www.soxlaw.com/
http://www.sarbanes-oxley-forum.com/
http://www.atmarkit.co.jp/aig/04biz/sox.html
http://en.wikipedia.org/wiki/Sarbanes-Oxley_Act
http://fl1.findlaw.com/news.findlaw.com/hdocs/docs/gwbush/sarbanesoxley072302.pdf






잠시 늦어졌던 장을 다시 시작하겠습니다.
회사도 좀 바밨었구, 흠.. 오랜만에 친구 몇명을 만나느라 주말도 좀 시간이 않나고..
이제서야 다시 글을 쓰게 되었습니다.

이번장은 리스트박스에 대하여 간단하게 설명해 봅니다.
리스트 박스는 이전 장에서 다룬 콤보박스에서도 언급되었었지만..

아주 단순하게 아이템을 열거해 놓고, 하나 혹은 여러개를 선택할 수 있는 직관적인
인터페이스를 제공해주는 컨트롤입니다.

컨트롤을 어느정도 다루다 보면 리스트박스(ListBox)보다는 리스트컨트롤(ListCtrl)을 주로
사용하게 되지만 컨트롤 자체의 기능은 나무랄데가 없습니다.


리스트 박스의 일반적인 속성은 스타일 페이지에 다 모여있습니다.
대부분의 속성들은 기존 장들과 겹치는 부분이 있으니,

Selection, Owner draw, Multi-column, Horizontal scroll
이 속성에 대하여 설명드리겠습니다.

1. Selection Property
선택 속성은 다음 그림처럼 4개의 속성으로 분리되어 있습니다

 - None
    이 속성은 아이템을 선택할 수 없고, 어떤 아이템에 포커스만 보여집니다.
    그림처럼 점선 박스만 보여지고, 사실 잘 사용되지 않는 속성입니다.

- Single
   이 속성은 아이템을 단 하나만 선택할 수 있습니다. 화면에 여러가지 아이템중에 단 하나만
   사용자가 선택할 수 있도록제공 함으로써, 중복선택을 인터페이스상에서 차단할 수 있습니다.

- Multiple
   이 속성은 아이템을 여러개 동시에 선택할 수 있습니다. 단 shift 혹은 ctrl 키와 조합하여
   선택하는 것이 아닌 마우스로 클릭하면 선택되고, 다시 클릭하면 해제되는 방법으로
   사용되기 때문에 상당히 불편하죠. 만약 여러개를 선택했다가 해제하려면 일일이 하나씩
   다 클릭해주어 해제시켜야 합니다.

- Extended
   확장 선택 속성으로써, 아이템을 여러개 동시에 선택할 수 있는건 Multiple과 같습니다. 단
   차이점은 Shift키와 Ctrl키를 마우스와 조합하여 선택할 수 있으며, 마우스 왼쪽 버튼만 클릭하면
   아이템을 하나만 선택할 수 있고, Shift키를 조합하여 누르면 이전 선택항목부터 현재까지 사이에
   있는 모든 아이템을 선택할 수 있습니다. 또한 Ctrl키와 조합하여 누르면 이전의 선택 항목은
   보존되고 있는 상태에서 Multiple 속성 처럼 추가적으로 아이템을 하나씩 선택하거나 해제가
   가능해집니다. 가장 일반적으로 사용되는 속성이죠.

 

2. Owner draw Property

MFC에서 제공해주는 확장 기능으로 다음과 같은 3가지가 있습니다. 몇몇 기본 컨트롤에서
제공해주는 기능으로 컨트롤의 내부를 사용자가 원하는 방식으로 구현할 수 있도록 그 바탕을
제공해 줌으로써 좀더 확장된 사용을 가능하게 해줍니다.

- No
   화장된 사용자 정의 그리기 기능을 사용하지 않고, 제공된 기능만을 사용함을 알립니다.
   일반적으로 모든 컨트롤의 디폴트 속성입니다.

- Fixed
   Owner Draw를 선택하게 되면 기본적으로 제공되는 가상함수
   virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
   위 함수를 사용자가 재 정의하여 (오버라이딩), 주어진 정보를 기준으로 그림을 내맘대로
   그릴 수 있도록 제공해줍니다.
   단, Fixed일 경우는 각각의 아이템마다 높이가 일률적으로 같습니다.

- Variable
   Fixed 처럼 DrawItem을 이용하여 사용자가 직접 그림을 그려주는 부분은 동일하지만,
   virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
   위의 가상함수를 이용하여 아이템의 높이도 개별적으로 다르게 설정할 수 있다는 점이 다릅니다.

3. Multi column Property
리스트 박스에서 제공해주는 속성중에 가장 직관성이 떨어지는 속성으로...
영문을 해석하면 멀티 컬럼을 지원해준다.. 라고 이해할 수 있습니다. 버뜨!!!~~

멀티컬럼이긴 합니다. 단, 사용자가 생각하는 리스트 컨트롤의 멀티 컬럼과는 개념이 좀 많이 다른
환경이라 첨에 좀 당황스럽다는 점만 빼면요.. -_-

아래는 속성을 적용해 놓은 화면입니다아이템 크기에 따라 그냥 지맘대로 쪼갭니다 스크롤바도
없고 아무것도 없습니다화면에 보이지 않는 아이템을 선택하려면 그냥 마우스로 드래그 해야하고
멀티로 아이템을 선택할 경우는 선택도 지지리 이상해지죠..

 컬럼의 너비는 SetColumnWidth()라는 함수를 이용하여 조절하실  있습니다.
또한  속성은 Owner draw 사용시에 Variable에서는 조합하여 사용하실  없습니다.

대충 사용목적을 생각해보면 쫍은 공간에 많은 항목을 넣어놓고하나씩 선택할 경우라면
어떻게든 써볼만 하겠다는 생각이 드네요.. ~

4. Horizonal scroll Property
 속성을 내용대로 이해하면 수평 스크롤바를 자동으로 지원해주는  같지만..
그렇지는 못하다수평 스크롤바를 이용할  있도록 내부적인 동작만 지원한다는 의미이다.

 아이템의 글자가 너무 길어 화면폭을 넘어갈 경우리스트박스에서는 그냥 잘려 보인다.
   속성을 첨부하고 아래와 같은 코드를 이용하여 수평 스크롤바를 생성할  있다.

// 주어진 글자가 리스트박스 내에서 길이가 얼마나 되는지 계산한다.
static int GetTextLenEx(CListBoxboxLPCTSTR lpszText)
{
    
CSize size;
    
CDC *pDC = box.GetDC();

    
// 현재 리스트박스의 폰트를 얻어와 DC 적용시킨다.
    
CFontpOld = pDC->SelectObject(box.GetFont());

    
// 스타일에 따라 약간의 오프셑 차이가 있다.
    
if ((box.GetStyle() & LBS_USETABSTOPS) == 0)
    {
        
size = pDC->GetTextExtent(lpszText_tcslen(lpszText));
        
size.cx += 3;
    }
    
else
    {
        
size = pDC->GetTabbedTextExtent(lpszText_tcslen(lpszText), 0NULL);
        
size.cx += 2;
    }
    
pDC->SelectObject(pOld);
    
box.ReleaseDC(pDC);

    
// 구한 문자열의 Pixel 단위를 넘긴다.
    
return size.cx;
}

// 문자열을 리스트박스에 추가하는 함수.
static void AddStringEx(CListBoxboxCString str)
{
    
// 우선 리스트박스에 문자열을 추가시킨다.
    
box.AddString(str);

    
// 길이를 계산하여 기존 길이보다 넓으면 새로운 길이를 적용시킨다.
    
int iExt = GetTextLenEx(boxstr);
    
if (iExt > box.GetHorizontalExtent())
        
box.SetHorizontalExtent(iExt);
}

108.zip
0.03MB

콤보박스를 투명하게 만들일이야 없겠지만, 한번 도전해봤습니다.
하지만 불완전한 구현이 되고 말았습니다.
리스트박스가 보일경우 리스트의 스크롤바 무브 이벤트를 처리하지 못하겠더군요.. -_-;

스크롤바를 드래그해서 움직일 경우 잔상이 남습니다.

[요 부분에 대한 아이디어가 있으신 분은.. 메시지좀 남겨주시와요 ^^]

기본적인 아이디어:
리스트 박스가 그려질 영역만큼, 보여지기 전에 미리 화면을 캡처 해놓은 다음에..
드롭된 리스트의 배경에 캡처된 화면을 그려주면 투명한 것처럼 보일 것이다.


//
윈도우 화면에서 주어진 사격형 만큼을 캡처해서 비트맵으로 넘겨준다.
//
저 콤보박스의 리스트 영역의 배경을 직접 그려주어 투명한것 처럼 보여주는
//
꽁수를 쓰기 위해서 필요한 함수.

BOOL Capture(CRect rc, CBitmap& m_Bitmap)
{
    //
화면 사이즈를 읽어온다.
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
   
    //
스크린 캡처를 위한 DC를 맹근다.
    CDC ScreenDC;
    ScreenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
   
    //
비트맵을 로딩할 임시 DC를 만든다.
    CDC memDC;
    memDC.CreateCompatibleDC(&ScreenDC);
   
    //
비트맵이 살아있으면, 살짝 날려준다.
    if(m_Bitmap.m_hObject)
        m_Bitmap.DeleteObject();

    //
스크린 호환용 비트맵을 주어진 크기만큼 만든다.
    m_Bitmap.CreateCompatibleBitmap(&ScreenDC, rc.Width(), rc.Height());
   
    //
비트맵에 캡처된 화면을 그린다.
    memDC.SelectObject(&m_Bitmap);
    memDC.BitBlt(0,0,rc.Width(), rc.Height(),&ScreenDC,rc.left,rc.top, SRCCOPY);
   
    return TRUE;
}

 

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
    switch(nCtlColor)
    {
    case CTLCOLOR_STATIC:
    case CTLCOLOR_EDIT:
            pDC->SetTextColor(RGB(0, 0, 255));
            pDC->SetBkMode(TRANSPARENT);
            return (HBRUSH)GetStockObject(NULL_BRUSH);
    case CTLCOLOR_LISTBOX:
        {
            pDC->SetTextColor(RGB(255, 0, 0));
            pDC->SetBkMode(TRANSPARENT);

             // 리스트 영역의 크기를 구한다.
            CRect rc;
            pWnd->GetClientRect(rc);

            //
임시 DC를 하나 만든다.
            CDC mdc;
            mdc.CreateCompatibleDC(pDC);
            mdc.SelectObject(&m_bmp);

            //
아까 캡처해두었던 배경을 리스트의 바탕에 그려준다.
            pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &mdc, 0, 0, SRCCOPY);
            return (HBRUSH)GetStockObject(NULL_BRUSH);
        }
    }

  return hbr;
}

BOOL CSssDlg::PreTranslateMessage(MSG* pMsg)
{
    if(m_combo2.GetDroppedState())
    {
        //
리스트가 보여지고 있을 때 마우스 무브 이벤트시 리스트를 갱신해준다.
        if(pMsg->message == WM_MOUSEMOVE && ::GetDlgCtrlID(pMsg->hwnd) == 1000)
            CWnd::FromHandle(pMsg->hwnd)->Invalidate();
    }

  return CDialog::PreTranslateMessage(pMsg);
}

 

// 콤보박스의 리스트가 드롭될 때 발생하는 이벤트.
void CSssDlg::OnDropdownCombo2()
{
    //
현재 콤보박스의 위치를 읽어온 후..
    CRect rc;
    m_combo2.GetWindowRect(rc);

    //
대략 오프셑을 넣은 후, 드롭된 리스트의 크기를 예상하여 넣는다.
    //
실제 드롭이 되기 전까지는 크기를 알수 없어, 적당하게 높이를 200으로 주었다.
    //
만든 사람은 본인이 높이를 아니, 적당하게 값을 주면 된다.

    rc.left += 1;
    rc.top = rc.bottom+1;
    rc.bottom += 200;

     Capture(rc, m_bmp);
}

원하는 만큼 깔끔한 코드가 나오지는 못했지만, 드롭리스트에 스크롤바만 않생기면..
그럭저럭 설렁 설렁 넘어갈만 하다고.. 생각만 해봅니다. ㅜㅜ

105.zip
0.03MB

 



이번장 에서는 콤보박스의 이벤트에 대하여 다루어 보겠습니다.

콤보에서 제공하는 이벤트는 다음과 같습니다.

CBN_EDITCHANGE
CBN_CLOSEUP
CBN_DBLCLK
CBN_DROPDOWN
CBN_EDITUPDATE
CBN_ERRSPACE
CBN_KILLFOCUS
CBN_SELCHANGE
CBN_SELENDCANCEL
CBN_SELENDOK
CBN_SETFOCUS

이렇게 사용되며, 색상이 파란색 인건 보통 자주사용되는 이벤트이고, 나머지는 잘 사용되지 않죠.
어디까지나 개인적으로 사용해본 경험을 바탕으로 추린 내용이니..흠..

1. CBN_EDITCHANGE, CBN_EDITUPDATE
CBN_EDITCHANGE 은 드롭다운과 심플 스타일일 경우에만 발생하는 이벤트로, 에디트 박스 영역의 글자에 변화가 생길 경우에 발생하는 이벤트입니다. 보통 내부에 들어있는 콤보 아이템을 선택하는 목적으로 사용할 때는 잘 쓰이지 않습니다만, 인터넷 익스프롤러나 탐색기, 최근 들어 자주 볼수 있는 오토 컴프리트 기능들을 다룰 때 사용됩니다.

사용자가 문자열을 입력할 때, 내부 아이템중에서 선택적으로 일치하는 항목을 보여주거나 할 때
주로 사용되죠.

CBN_EDITUPDATE는 문자열의 변화뿐 아니라, 그 영역이 먼가에 가려져있다바 보인다던가..
화면을 갱신해야 할경우 발생하는 이벤트입니다. 한번 들어본 말이죠?

에디트 컨트롤의 EN_CHANGE와 EN_UPDATE와 100% 일치하는 이벤트입니다.
콤보박스에 에디트 컨트롤이 달여있는 것이니 당연한거겠지요.

2. CBN_DROPDOWN, CBN_CLOSEUP
CBN_DROPDOWN는 콤보박스의 에디트 영역 우측에 버튼을 누르면 리스트박스가 주욱 열립니다.
이때 발생하는 이벤트고, 열린 리스트박스에서 아이템을 마우스로 선택하거나 엔터를 쳐서 리스트가
닫힐 때 발생하는 이벤트가 CBN_CLOSEUP 이죠.

3. CBN_DBLCLK
요 스타일은 콤보박스의 리스트박스상에서 아이템을 더블클릭 할 경우에만 발생합니다. 드롭 다운 스타일이나 드롭 리스트 스타일일 경우, 아무리 순발력이 좋아도 절대 일으킬 수 없는 메시지죠..
심플 스타일일 경우에만 발생하는 메시지입니다. ^^;

4. CBN_ERRSPACE
이것도 에디트를 다룰 때 한번 봤던 이벤트인데, 아이템을 추가하거나 삽입할 경우, 내부적으로
주소 공간을 할당해야 하겠죠? 이 때 할당 공간이 부족하면 발생하는 경고성 이벤트입니다.

5. CBN_KILLFOCUS, CBN_SETFOCUS
기본적인 윈도우 컨트롤이 가지고 있는 포커스 이벤트입니다.
예를 들어 선택해야 하는 아이템들이 잔뜩 모여있는 필수 아이템 그룹이 있다고 가정했을 때,
보통 라디오 버튼 그룹이나 콤보박스 혹은 리스트를 사용하게 됩니다. 라디오가 직관적이긴 한데
많은 아이템일 경우 공간이 부족하게 되죠, 리스트도 마찬가지고..

이럴 경우 콤보가 첨에 생기면 빨간색 글자로

<필수 선택 항목>

이라고 써있다가 포커스가 옮겨
가게 되면 경고문구가 지워지고 아이템을 선택할 수 있는 원래의 환경으로 돌아오는 겁니다.

6. CBN_SELCHANGE
일반적인 콤보 기능을 담당할 경우 가장 많이 사용되는 이벤트 중에 하나입니다. 마우스나 키보드로
아이템을 선택하거나 변경할 경우 발생하는 이벤트죠.

7. CBN_SELENDOK, CBN_SELENDCANCEL
콤보박스에서 아이템을 선택할 경우, 나열된 리스트에서 마우스로 콕 찍거나 엔터키를 치면
발생하는 이벤트입니다. CBN_SELCHANGE와 같다고 볼수 있는데 이는 변경되는 내내 발생하지만
CBN_SELNDOK는 선택되어지는 그 순간에 한번만 발생한다는 차이점이 있습니다. 물론 이 후에
CBN_SELCHANGE도 당연히 발생하죠.

CBN_SELENDCANCEL은 키보드의 방향키로 아이템을 고르고 있다가 혹은 마우스로 찾아다니다가
이건 아닌가바.. ESCAPE 키를 딱 누르는 순간에 발생하는 이벤트입니다. 선택을 취소했다고 나오는
이벤트인데 콤보박스에서 동작특성이 상당히 불안한 이벤트이기도 하죠..
믿고 쓸만한 이벤트가 못됩니다.

-------------------------------------------------------------------------------------
위 이벤트를 모두 사용하는 샘플을 제작하기가 여간 까다로운게 아니네요..
그래서 여러스타일의 콤보를 놓고 사용자가 하나씩 클릭해 보면서
이벤트가 어떤 순서로 어떻게 발생하는 지를 관찰할 수 있는 아주 간단한 -_- 샘플을 올립니다.


샘플을 제작하면서 각각의 컨트롤의 이벤트 핸들러를 클래스위저드를 이용해서 추가할 수 도
있겠지만 코드가 길어지니, 셀체인지 이벤트만 클래스 위저드에서 콤보박스마다 넣고, 나머지는
ON_CONTROL_RANGE를 이용하겠습니다.

ON_CONTROL_RANGE는 어떤 이벤트를 잡아줄건지를 명시하여 원하는 컨트롤의 이벤트를
묶음으로 건질수 있다는 차이가 있습니다.

ON_CONTROL_RANGE(event, begin, end, handler)
event : 처리하고자 하는 대상 이벤트
begin : 범주의 시작이 되는 컨트롤의 아이디
end : 범주가 끝나는 컨트롤의 아이디
handler : LRESULT 함수명(UIND nID) 타입의 멤버함수

저것들도 다 한방에 묶어서 처리할 수 있으면 좋겠지만, 거기까지는 자동으로 지원하는 매크로는
없구요, PreTranslateMessage 에서 처리하면 가능하겠죠. 하지만 코드가 지저분 해진다는거..

지금까지 콤보박스에서 다룬 멤버 함수들과 이벤트들을 제외하고도 몇몇 가지가 더 있지만,
이름과 기능이 잘 매칭되는 단순한 기능들이니 MSDN에서 찾아보시면 쉽게 이해하실 수 있을겁니다

다음 장에서는 콤보를 이용한 간단한 샘플 하나 정도 다룬 후에 콤보과정을 마치겠습니다.

77.zip
0.03MB

콤보박스를 사용하면서 글자를 출력할 경우, 기본 폰트를 사용하면 너무 위 아래가 따닥 따닥
붙어 있어 보기가 조금 답답해 보이는 경향이 있다.

콤보에서 제공해주는 가상함수  DrawItem 조금만 손보면 아주쉽게 이를 조절할  있다.
속성은 Owner Draw Fixed, Has String 속성을 주고 코드를 다음과 같이 수정하면 된다.

void CComboBoxHeight::DrawItem(LPDRAWITEMSTRUCT pDIStruct)
{
    
CDC dc;

    
// 코드를 간결하게 하기 위하여 전달된 HDC CDC 어태치한다.
    
if( !dc.Attach( pDIStruct -> hDC ) )
        
return;

    
// 현재 전달된 아이템이 선택되어진 넘인이 확인한다.
    
if( pDIStruct -> itemState & ODS_SELECTED )
    {
        
// 속성에 맞게 글자색배경색상을 지정한다.
        
dc.SetTextColor((0x00FFFFFF & ~(GetSysColor(COLOR_WINDOWTEXT))));
        
dc.SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
        
dc.FillSolidRect(&pDIStruct->rcItem, GetSysColor(COLOR_HIGHLIGHT));
    }
    
else
    {
        
dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
        
dc.SetBkColor(RGB(0,0,0));
        
dc.FillSolidRect(&pDIStruct->rcItem, GetSysColor(COLOR_WINDOW));
    }

    
// 아이템의 인덱스가 -1 아니면
    
if(pDIStruct->itemID != -1)
    {
        
// 선택된 아이템의 문자열을 읽어온다.
        
CString m_SelText;
        
GetLBText(pDIStruct->itemID, m_SelText);

        
// 만약 선택된 아이템이 디저블 속성이면 글자 색상을 회색으로
        
if(pDIStruct->itemState & ODS_DISABLED)
            
dc.SetTextColor(::GetSysColor(COLOR_GRAYTEXT));

        
// 배경은 투명 속성으로
        
dc.SetBkMode(TRANSPARENT);

        
// 아이템 영역의 수직 센터에 글자를 그린다.
        
dc.DrawText(m_SelText, &pDIStruct->rcItem, DT_VCENTER | DT_SINGLELINE);

        
// 필요하면 여기다비트맵을 그리거나아이콘을 그리거나 맘대로 하면 된다.
        
// 보통 아이콘을 자주 그리는데 DrawIconEx 사용하면 된다.
    }

    
dc.Detach();

    
return;
}

100.zip
0.09MB

콤보박스를 어떻게 다루어야 하는지에 대하여 알아보겠습니다.

보통 사용한다함은?
1. 데이터를 추가한다.
2. 데이터를 삽입한다.
3. 데이터 하나를 지운다.
4. 데이터를 모두 지운다.
5. 부가정보를 첨부한다.
6. 현재 선택되어진 문자열을 읽어온다.
이정도 선에서 사용하게 됩니다.

우선 콤보박스를 빈 다이알로그에 하나 올리고 아이디를 IDC_COMBO1 이라고 하고 다음과
같은 스타일로 샘플을 만들겠습니다.


다음은 CComboBox m_combo 로 컨트롤을 연결합니다.


다음으로 위에서 열거한 기능을 하나씩 버튼을 넣어가면 진행하여 보겠습니다.

1. 우선 그림처럼 버튼을 넣고, 그 버튼을 누르면 데이터를 추가합니다.

void CSssDlg::OnButton1()
{
    
m_combo.AddString("하나");
    
m_combo.AddString("");
    
m_combo.AddString("");
}

int CComboBox::AddString(LPCTSTR lpszString);
-------------------------------------------------
Parameters
    lpszString  - NULL로 끝나는 문자열
Return Value
   추가된 아이템의 크기가 0보다 크다면 Zero-Based 인덱스가 리턴된다.
   만약 CB_ERRSPACE가 리턴된다면 데이터를 저장하기 위해 할당할 메모리가 모자라다.
Remark
   만약 생성시에 CBS_SORT 스타일을 넣었다면 정렬된 위치로 삽입되게 된다.


2. 다음 그림처럼 버튼을 넣고, 그 버튼을 누르면 데이터를 2번째에 삽입한다.

void CSssDlg::OnButton2()
{
   
m_combo.InsertString(1, "삽입됨");
}

인덱스가 Zero-Based Index 이기 때문에 인덱스 1에다 넣으면 2번째 위치가 된다.

int CComboBox::InsertString(int nIndex, LPCTSTR lpszString);
--------------------------------------------------------------
Parameter
   nIndex  - Zero-Based Index 이고, 만약 -1이면 마지막에 추가된다.
   lpszString - NULL로 끝나는 문자열
Return Value
   현재 삽입된 위치의 인덱스가 리턴된다.
Remark
   AddString과는 달리 CBS_SORT 스타일이라 하더라도, 삽입위치는 변경되지 않는다.


3. 다음 그림처럼 버튼을 넣고, 그 버튼을 누르면 선택되어진 아이템을 삭제한다.

void CSssDlg::OnButton3()
{
    
int nIndex = m_combo.GetCurSel();
    
if(nIndex == -1)
        
return;
    
m_combo.DeleteString(nIndex);
}

아무것도 선택되지 않았거나, 아이템이 하나도 없을 경우에 대한 에러처리를 해야한다.

int CComboBox::DeleteString(UINT nIndex);
----------------------------------------
Parameter
   nIndex - 0보다 크거나 같은 삭제할 인덱스
Return Value
   0이거나 0보다 큰값으로 현재 남아있는 아이템의 카운트를 리턴한다.
Remark
   당연한 이야기겠지만, 여러개의 아이템중에 중간에 것을 삭제하면 아래의 하위 아이템들의
   인덱스가 당연히 하나씩 줄어든다. 아이템을 인덱스로 관리할 경우 에러가 나거나 오동작
   할 수 있으므로 주의해야한다.


4. 다음 그림처럼 버튼을 넣고, 그 버튼을 누르면 데이터를 모두 지운다.

void CSssDlg::OnButton4()
{
   
m_combo.ResetContent();
}

루프를 돌며 하나씩 지워나갈 수도 있겠지만, 지원하는 함수가 있으니...

void CComboBox::ResetContent();
-----------------------------------
Remark
   루프를 돌면서 하나식 지우게 되면 에디트의 선택영역이 글자는 남아있게된다. 이 함수를
   이용하게 되면 에디트와 리스트영역을 모두 초기화 시킨다.

5. 다음 그림처럼 버튼을 넣고, 그 버튼을 누르면 개별 아이템에 부가정보를 첨부한다.
첨부된 부가 정보를 보여주기 위하여 콤보박스 하단에 스태틱 컨트롤을 하나추가한다.
또한 아이템의 선택이 변경되었을 때마다 스태틱의 정보를 갱신해 주기 위하여 CBN_SELCHANGE
이벤트를 추가하고 핸들러에 부가 코드를 넣는다.

// 아래의 이벤트는 콤보박스에서 아이템을 선택을 변경하면 발생하는 이벤트이다.
void CSssDlg::OnSelchangeCombo1()
{
    
// 현재 선택되어진 아이템
    
int nIndex = m_combo.GetCurSel();
    
if(nIndex == -1)
        
return;    CString s;
    
// 현재 아이템의 부가 정보를 읽어온다.
    
// 여기서는 단순하게 숫자로 넣었지만포인터를 넣을  있으므로 모든 데이터를 
    
// 첨부할  있다.
    
// 디비에서 사용자 정보 전체를 읽어와서 이름만 콤보박스에 넣는다면...
    
// 나머지 정보를 구조체등에 넣은다음..  포인터를 SetItemData() 넣어두면
    
// 언제든지 쉽게 접근할  있게된다.
    
s.Format("0x%X", (UINT)m_combo.GetItemData(nIndex));
    
SetDlgItemText(IDC_STATIC_OPTION, s);
}

선택되어진 아이템의 부가정보를 읽어와 숫자로 읽어온다음 문자열로 변환하여 해당 스태틱 컨트롤에 뿌려준다.
void CSssDlg::OnButton5()
{
    
int count = m_combo.GetCount(), i;
    
for(i=0; i<count; i++)
        
m_combo.SetItemData(i, (DWORD)rand());
}


콤보박스의 갯수를 세어, 부가정보로 랜덤한 숫자를 임시로 넣어본다.

int CComboBox::SetItemData(int nIndex, DWORD_PTR dwItemData);
------------------------------------------------------------------
Parameter
  nIndex - 제로베이스 인덱스
  dwITemData - 아이템에 넣을 부가정보의 포인터, 데이터를 넣을 경우는 DWORD로 타입 캐스팅 하여 넣으면 된다.
Return Value
   현재 아이템의 제로베이스 인덱스
Remark
   만약 new 등을 이용해 할당한 것이라면 수동으로 delete 해주어야 한다.

6. 다음 그림처럼 버튼을 넣고, 그 버튼을 누르면 선택된 아이템의 캡션을 읽어온다.

void CSssDlg::OnButton6()
{
    
int nIndex = m_combo.GetCurSel();
    
if(nIndex == -1)
        
return;    CString s;
    
m_combo.GetLBText(nIndex, s);
    
AfxMessageBox(s);
}

선택되어진 아이템의 인덱스를 구한 후, 아이템의 문자열을 읽어와 메시지박스로 뿌려준다.

void CComboBox::GetLBText(int nIndex, CString& rString) const;
----------------------------------------------------------------
Parameter
  
nIndex - 제로베이스 인덱스
  rString - 읽어올 문자열을 저장할 객체.

그 외에도 콤보박스에서 제공되는 함수나 기능들은 좀더 다양하게 있지만 그렇게 자주 쓰이거나 하지는 않는다.
다음 장에서 콤보박스의 이벤트를 다루며 몇몇 다른 함수들의 기능도 살펴보자.

74.zip
0.03MB

+ Recent posts