블로그 이미지
인생의무한루프
인생에 무한루프.....

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

Recent Post

Archive

Recent Comment

Recent Trackback

2008. 12. 15. 22:48 Appication/VC++_Control

로그인 입력창을 구현해 보자. ( MFC CEdit 예제 )


지금까지 진행해 왔던 과정을 돌이켜 보고, 몇가지 정리를 하면서 이러한 기능을 대부분 수용하는 샘플을 만들어 보았다.

1. 부모 다이알로그와 자식 다이알로그간의 데이터 전달.
2. 입력된 데이터의 올바른지 판단여부.
3. 최대 입력 수 재한
4. 데이터의 저장 및 비교
5. 글자 색상 변경
6. 다이알로그 배경색 변경

처음 프로그램을 실행 시키면 뜨는 화면


우선 가입하기 버튼을 누르면 조인할 수 있는 창이 뜬다.

우선 아이디를 입력한다. 아이디는 4-8자리 까지 제한이 있고,
영문과 숫자만 입력받는다.
[한글을 넣으면 오동작을 할 수 있다. 한글 처리는 여기서 다루지 않는다.]

아이디를 입력하고 중복 확인을 누른다.

암호를 입력하는 창이 활성화 되고 가입 버튼이 함께 활성화 된다.
적당하게 암호를 입력하고 가입을 누른다.


로그인 버튼이 활성화 되었다. 로그인 버튼을 눌러 보자.


아까전에 넣었던 정보를 정확하게 입력하면 모든 과정이 완료된다.

그러면 아래와 같은 환영 메시지가 출력되면서 모든 기능이 완료된다.





Posted by 까막백(홈페이지 이동)
posted by 인생의무한루프
2008. 12. 15. 22:40 Appication/VC++_Control

글자 배경 바꾸기 2( MFC CEdit 예제 )

에디트에 대한 기초강좌를 마무리한 시점에서 질문이 하나 들어왔다..
지금까지의 내용을 기초로 에디트의 전체 배경을 바꾸었는데.. 깜빡이거나 먼가 이상하다...??

지난 강좌를 찾아보니, 에디트에 대한 배경 처리가 제대로 마무리 되지 못한 상태에서
강좌를 마쳐 혼란을 가져온것일 수 있을꺼 같아..
질문을 토대로 배경처리 기능을 마무리 하려고 한다.


위 그림은 두가지로 그 기능이 분류된다.

1. 왼쪽 에디트
-> 글자 바탕과 배경색상을 모두 녹색으로 처리한 것
2. 오른쪽 에디트
-> 글자 바탕은 TRANSPARENT 시키고, 바탕에는 HATCH 브러쉬를 뿌린것이다.

위 두가지 구현에는 다음과 같은 차이가 있다.
1번은 글자와 배경을 모두 그려주므로, 글씨를 쓸때 잔상이 남거나 깜빡임이 전혀없다.
2번은 글자는 쓰되 배경을 그려주지 않으므로 글씨를 쓸때 깜빡임은 없으나 잔상이 남는다.
이러한 이유로 두가지의 구현 부분에 조금 차이를 가지게 된다.

기본적인 코드는 브러쉬를 2개 만든다는 점만 빼고는 헤더에 추가할 내용은 없다.

BOOL CSssDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
   
    // 솔리드, 해치 브러쉬를 각각만든다.
    m_brush1.CreateSolidBrush(RGB(0, 255, 0));
    m_brush2.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0));
   
    return TRUE; // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

클래스 위저드에서 WM_CTLCOLOR 이벤트 핸들러를 추가한다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   
    switch(nCtlColor)
    {
    case CTLCOLOR_EDIT:
        {
            pDC->SetTextColor(RGB(255, 0, 0));
           
            if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
            {
                // 글자 바탕을 녹색으로 하고, 녹색 솔리드 브러쉬를 리턴한다.
                // 이게 전부다.

                pDC->SetBkColor(RGB(0, 255, 0));
               
return m_brush1;
            }
           
else if(pWnd->GetDlgCtrlID() == IDC_EDIT2)
            {
                // 글자의 배경을 그려주게 되면 바탕의 해치브러쉬 영역에 글자뒷 부분은
                // 녹색 사각형이 그려지게 된다.
                // 이를 막아주기 위하여, 배경그리는 기능을 제거한다. TRANSPARENT

                pDC->SetBkMode(TRANSPARENT);

                // 에디트 컨트롤 영역을 구한 후에
                // 브러쉬로 색칠해준다.

                CRect rc;
                GetDlgItem(IDC_EDIT2)->GetWindowRect(rc);
                ScreenToClient(rc);
                pDC->FillRect(rc, &m_brush2);

               
return m_brush2;
            }
        }
    }
    // TODO: Return a different brush if the default is not desired
   
return hbr;
   
}

클래스위저드에서 IDC_EDIT2의 EN_CHANGE 이벤트 핸들러를 추가한다.
이 핸들러를 추가하는 이유는 두번째 에디트는 글자의 배경이 뒤에 그려지는 해치 브러쉬의
패턴을 덥어쓰는 걸 막아주기 위하여 TRANSPARENT 속성을 주었으므로, 글씨의 뒷부분을
그려주지 않게된다. 그러므로 잔상이 남게되어 글자에 대한 변경이 발생하면
배경을 다시 그려주도록 하기 위해서이다.
void CSssDlg::OnChangeEdit2()
{
    CRect rc;
    GetDlgItem(IDC_EDIT2)->GetWindowRect(rc);
    ScreenToClient(rc);
    InvalidateRect(rc);
}




Posted by 까막백(홈페이지 이동)

posted by 인생의무한루프
2008. 12. 15. 22:20 Appication/VC++_Control

CColorDialog를 모달? 모달리스? 로 사용하기 ( MFC 모달리스 예제 )

칼라다이알로그 박스는 꼭 확인 버튼을 눌러야 색상을 얻어올 수 있습니다.
이걸 색상을 변경할 때마다 다이알로그를 닫지 않고도, 색상을 얻어올 수 있도록
수정하여 보았읍니다.

첫번째 아래그림은 그냥 색상을 선택해 본거구요..

사용자 삽입 이미지



아래 그림은 창을 닫지 않은 상태에서 다른색상을 선택해 본것입니다.
사용자 삽입 이미지






Posted by 까막백(홈페이지 이동)

posted by 인생의무한루프
2008. 11. 29. 00:51 Appication/프로그램 만들기

나만에 프로그램을 만들어보자.#3 ( NSIS 란 )

물론 아시는분들은 알겠지만 많은 분들이 프로그램은 만들어 놓고 설치파일은 어떻게 만드는지 고민을 하게 됩니다.
일전에 어떤 개발자분은 설치 파일도 vc로 개발을 하시는분을 봤습니다...
물론 나름대로의 익숙한 언어를 사용한다는건 많은 메리트를 가져오지만 전용툴을 사용하는 편리함과 개발시간이 줄어드는것 또한 많은 메리트가 있다고 생각됩니다..

일단 NSIS는 Winamp 제작사인 Null-Soft사에서 공개 프로그램을 위해 만든 OpenSource 입니다...지원해주는 기능도 강력하지만 NSIS의 꽃은 dll로 플러그인을 만들어 사용할수 있다는 것이라 생각됩니다.
물론 지금은 사용할 일이 있지는 않겠지만 차츰 배우다보면 정말 NSIS가 편리하고 강력한 툴이라고 생각하실 겁니다.

일단  NSIS 를 설치를 하세요...아래의 창이 뜰겁니다..


하지만 NSIS에서 지원하는 컴파일 기능으로는 좀 불편한게 있습니다...그래서 개발을 편리하게하는 툴을 하나 설치하는게 좋습니다..HM NIS Edit(NSIS 전용 에디터) 을 다운로드 받아서 설치하시면 됩니다..설치하는 과정에 에러가 나올수 있는데 그냥 무시무시 하세요...^_^
실행해 보시면 아래와 같은 창이 뜨실겁니다....이제부터 nsis는 이 에디트를 사용해서 컴파일 할것이니 nsis 파일 확장자인 .nsi 는 HM Edit로 연결을 해놓으시는게 편하실겁니다..^^



또한 위에 빨간색 박스에 들어있는 버튼들이 vc에 F7, F5 키와 동일한 기능을 하는 버튼들입니다...
앞으로 자주 사용하게 될겁니다..^^;;
일단 대략적인 셋팅은 이정도면 됬다고 생각이 되네요..

posted by 인생의무한루프
2008. 11. 28. 23:59 Appication/프로그램 만들기

나만에 프로그램을 만들어보자.#2 ( Platform SDK 란 )


이전의 글에서 Platform SDK와 NSIS가 필요하다고 했는데...
이것들이 먼지 생소한 사람들이 있을거 같아서 글을 좀 적어볼까합니다...프로그램을 만드시려는 분이 설마 VC가
생소하신분은  없겠죠??^^;;

일단 Platform SDK에 대해서 설명을 하겠습니다...
C나 C++을 사용하신분들은 당연히 하게 코딩 제일 위에 보시면 #include "stdio.h" 나 #include <iostream.h>
이런식으로 헤더파일을 참조하겠다고 적습니다..우리는 당연하게 적는 저게 무엇이었을까요?

우리가 간단한 C 프로그램을 짤때 함수를 사용하려면 항상 선언을 합니다..그런데 printf() 나 cin 같은 함수들은
그냥 쓰고 있죠?전 예전 처음 공부할때 저게 무척궁금했었는데....저런 함수들을 선언해 놓은 파일이 stdio.h나
iostream.h 인겁니다....말하자면 stdio.h등의 헤더파일에 누군가가 printf() 함수를 만들어 놔서 저희가 헤더파일을
선언함으로써 사용할수 있는거죠..^^

저런 기본적인 함수들은 기본적으로 VC가 깔릴때 함께 깔리니 특별히 다운받을 필요는 없지만 우리가 윈도우용
프로그램을 만들다보면 여러가지 기능이 필요한데 그 기능을 다 우리가 만들다보면 프로그램하나 만드는데
몇년이 걸릴수도 있죠....-_-;; 다행히 MS에서는 개발자들을 위해 윈도우용 어플리케이션을 만드는데 도움이
되는 여러가지 함수들의 집합을 만들어 놨고....그 함수에 집합이 Platform SDK입니다..
그렇게 보면 MFC도 SDK이겠죠....이부분은 차후에 하도록 하겠습니다...

이 SDK의 종류는 무척이나 많아서 DDKDevice Driver Kit 이라고해서 드라이버를 개발할때 사용하는 함수들을
모아놓은 킷입니다...DDK는 OS마다 나뉘고 지금은 WDK라고해서 비스타 드라이버까지 개발할수 있게 한군데에
모아 놨습니다..그리고 DirectShow SDK는 동영상관련 함수들의 집합이고요...Windows Media SDK를 이용하면
윈도우미디어를 컨트롤 할수 있습니다..이밖에 MS에서 지원하는게 아닌 개인개발자들이 만들어 놓은 여러가지
SDK들이 있으니 필요에따라 자료를 찾아 사용하시면 좀더 편리하게 그리고 짧은 시간에 프로그램을 개발할수
있습니다....^^

일단 SDK를 다운받으려면 MS에 방문해서 다운로드 받아야 됩니다...vc6.0을 지원하는 마지막 버전의 SDK는
Windows® Server 2003 SP1 Platform SDK 입니다...다운로드 받아서 설치하시면 됩니다..
하지만 설치만 한다고 바로 사용할수는 없습니다....
VC에 "나 이런 SDK 있으니깐 내가 개발할때 #include "" 이런식으로 참조하라고 하면 어느폴더로가서 찾아봐~~"
라고 말해줘야 VC에게 직접 말해줘야지 압니다...컴터는 바보니깐요...^^

일단 Tool -> Option 을 선택하신후 Option창이 나오면 Directories를 누르시면 아래와 같이 헤더파일과 라이브러리
경로를 설정할수 있습니다.



include files을 선택하신뒤 Directories 밑에 빈곳을 클릭하면 경로를 설정할수 있는 버튼이 생기고 헤더파일이 있는
곳에 경로를 설정해 주시면 됩니다...경로는 sdk마다 다르겠지만 헤더파일들은 대부분 폴더이름이 include 또는 inc등으로 되어 있습니다...저같은 경우는 C:\Program Files\Microsoft Platform SDK for Windows XP SP2\Include 이곳이 경로입니다....저건 링크를 걸어드린 SDK보다 버전이 낮은겁니다....이제보니 구버전 SDK를 사용하고 있었다는..OTL..
하지만 구지 최신 SDK만 고집할 필요는 없습니다..^^;;(왠지 핑계를 대는듯한..^^;;)


include만 넣어주면 안되죠....헤더파일에는 함수선언만 되어 있고 실제 코딩이 되어있는 파일이 있는곳은 Library 폴더에 있습니다.....차츰 알아나가겠지만 .h 파일과 .cpp 파일을 만들면 .h 파일에는 함수들의 선언만하고 실제는 코딩은 .cpp 파일에 하는것과 동일하다고 생각하시면 되겠네요..콤보박스에서 라이브러리 파일을 선택한뒤 include 폴더를 추가하듯이 추가해주시면 됩니다...폴더이름은 보통 Lib라고 되어 있습니다..
제 경로는 C:\Program Files\Microsoft Platform SDK for Windows XP SP2\Lib 이곳이네요...^^ 참고하세요..


이렇게 추가를 하면 이제 우리가 #include "XXX.h" 등을 추가하면 위에 SDK에 구현되어 있는 편리한 함수들을 사용할수 있습니다...
눈치 빠른분은 아시게지만 저는 DirectX9.0 버전 SDK와 WTL7.0 SDK가 설치되어 있네요...제일 밑에 VC98 경로의 두개의 경로는 vc6.0을 깔면 자동으로 추가되는 것입니다....
개발을 하시다보면 SDK끼리 충돌이 나거나 내가 예상하지 않게 움직일 때가 있는데...그럴때는 사용하고자 하는 SDK를 가장위로 올려놓으면 됩니다....VC는 설정되어 있는 경로중에 가장위에서 부터 선언되어있는 헤더파일을 찾아나가기때문에 동일한 이름을 가지는 헤더가 다른 SDK에 있다면 그 SDK를 참조하게 되므로 생각지도 않는 오동작이나 버그가 발생하게 되니...항상 개발할때 사용할 SDK를 가장위에 올려놓는 습관을 들여야 나중에 엄청난 삽질을 미연에 방지할수 있습니다...^^;;

이게 생각보다 만만치 않은 작업이네요....ㅡ_ㅡ;; 지금까지 글을 보기만 했지 적어보긴 처음인데...
정말 강좌같은것을 올리는 분들이 존경스러워 집니다...ㅠ_ㅠ
posted by 인생의무한루프