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

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

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

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;
}

// 클래스 위저드에서 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;
        }
    }
    return hbr;
}

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

49.zip
0.06MB

스태틱 컨트롤을 이미지 형태로 사용할 경우 보통은 리소스에 있는 이미지를 연결시킨다.


왼쪽은 리소스 편집기에서 정적으로 이미지를 연결시킨 픽처 컨트롤이고,
오른쪽은 속성을 비트맵으로 설정해 놓고, 아무런 작업도 진행하지 않은 경우이다.

그렇다면 파일에서 비트맵을 로딩하여 필요할 때마다 바꾸려면 어떤 과정을 거쳐야할까?

아래는 디스크에 있는 파일을 읽어 들여서 오른족에 보이는 컨트롤에 동적 로딩한 화면이다.

복잡한 과정은 전혀 필요없다.

BOOL CSssDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
   
    //
파일에서 이미지를 비트맵 타입으로 읽어온다.
    //
현재는 커렌트 경로에 존재하므로 전체 경로를 넣지 않았지만.
    //
실행파일과 다른 경로에 존재한다면 절대 경로를 넣어야한다.
    //
전달되는 인자값은 MSDN에 자세히 설명이 나와있다.
    HANDLE h = ::LoadImage(AfxGetInstanceHandle(), "image_file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

    //
화면의 픽처 컨트롤을 임시로 CStatic 컨트롤로 받아들인다.
    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_FILE);

    //
이미지 핸들과 스태틱 컨트롤이 제대로 값을 가지고 있다면
    if(h && pStatic) {
        //
컨트롤에 비트맵을 연결시킨다.
       pStatic->SetBitmap((HBITMAP)h);
    }
  
    return TRUE; // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}


아이콘일 경우도 위의 과정에서 필요한 형태만 변경한다면 아주 쉬울것이다.

참고. 만약 이미 비트맵이 로딩되어 있다면.. GetBitmap()으로 비트맵 핸들을 받은 후에
그 핸들을 CloseHandle()을 이용하여 해제해주고, 새로이 SetBitmap()을 해주어야 한다.

이렇게 생성하거나 할당한 리소스를 필요할 때 해제해 주지 않으면 나중에 [리소스가 부족합니다.]
라는 엉뚱한 메시지를 볼 수 있을것이다.

58.zip
0.05MB




아래 그림을 보면 배경을 다양한 형태로 처리할 수 있음을 알수 있다.
사실상 저렇게 쓰는 경우는 별반 없지만... UI 작업을 하다보면
어떤 정신 세계가 독특한 커스터머나 디자이너를 만날지 모른다..

화면을 보면 무엇을 설명하고자 하는지 쉽게 이해할 수 있을 것이다.

스태틱 컨트롤의 배경 전체 색상을 바꾸어 주기위해서는 저 영역을 먼가로 칠해주어야한다.
MFC
에서 먼가 영역을 칠할 때 필요한 객체는 CGdiObject를 상속받은 놈 중에 CBrush 라고 하는
일종의 빗자루? ? 비끄무리한 객체가 있다.

우선 헤더에 CBrush m_brush; 라고 객체를 하나 선언한다.
BOOL CSssDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
   
    //
브러쉬 객체를 녹색으로 생성한다.
    m_brush.CreateSolidBrush(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_STATIC:
        {
            pDC->SetTextColor(RGB(255, 0, 0));
           
            if(pWnd->GetDlgCtrlID() == IDC_STATIC_1)
                pDC->SetBkColor(RGB(0, 255, 0));
            else if(pWnd->GetDlgCtrlID() == IDC_STATIC_3)
                //
? 그냥 브러쉬를 리턴하면 끝이냐?
                //
그렇다 그냥은 디폴트 브러쉬가 날라가게 되는데..
                //
여기에 먼가 특별한 브러쉬를 만들어 리턴하면 그게 그 컨트롤의
                //
배경에 영향을 미치게 된다.
                //
다양한 브러쉬를 만들어 리턴해보자 ^^;
                return m_brush;
            else if(pWnd->GetDlgCtrlID() == IDC_STATIC_2)
            {
                pDC->SetBkColor(RGB(0, 255, 0));
                return m_brush;
            }
        }
    }
    // TODO: Return a different brush if the default is not desired
    return hbr;
   
}

56.zip
0.04MB



---------------------------------------------------------------------------------
이 부분을 진행하다 보니, 만약 패턴 브러쉬를 넣었을 경우는 어떻게 될까? 라는
생각이 들어서 별도로 진행해 보았다.

이 그림은 위의 소스 일부를 수정하여, 변경해 본 것으로.. Hatch 브러쉬를 이용하여
배경을 칠해본것이다. 자? 두번째를 어떻게 처리할 수 있을까?

BOOL CSssDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    m_brush.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
}


HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   
    switch(nCtlColor)
    {
    case CTLCOLOR_STATIC:
        {
            pDC->SetTextColor(RGB(255, 0, 0));
           
            if(pWnd->GetDlgCtrlID() == IDC_STATIC_1)
                pDC->SetBkColor(RGB(0, 255, 0));
            else if(pWnd->GetDlgCtrlID() == IDC_STATIC_3)
                return m_brush;
            else if(pWnd->GetDlgCtrlID() == IDC_STATIC_2)
            {

                // ???
                //
한번 직접 구현해 보자.
                //
결과물은 아래의 첨부파일에 포함되어 있다.           
            }
        }
    }

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

48.zip
0.04MB



예전에 인티즌, 지금은 드림위즈로 개편된 사이트가 있다.
이곳에 개인적으로 자료를 정리해서 올려놓았었는데..

휴면 계정이 정리가 되었나 보다.. -_-
휴면 계정을 깨우고 나니 자료실이 사라졌다.. 헉~

부랴 부랴.. 디스크, 씨디... 아는 사람 자료실을 뒤져 뒤져 좀 부족하지만 어느정도 데이터를
살린 후에 여기다가 쏟아 부었다..

그러면서 데브피아에 올렸던 자료들도 일부 시간 역순으로 정리해서 올리고.. 흠..

이 사이트는 좀 오래 살아있어야 할텐데.. ^^;
 FTP에서의 파일 업로드   |  1999-12-27
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 621   / 평점:  (9.0)  / 읽음:4,512

까막입니다. ^^

어떤 분이 FTP에서 파일 업로드 기능을 부탁하셨길래 올립니다.

아주 간단하게 FTP 접속 부분과
파일 전달 부분만 구현 한 것입니다.

-------------------------------------------------------------------
CFtpConnection* ftpCon = NULL;
CInternetSession* session;
BeginWaitCursor();
session = new CInternetSession(_T("My Session"));
try
{
 ftpCon = session->GetFtpConnection(IP, ID, Pass);
 // 여기서 IP, ID, Pass는 다들 아시겠죠 ^^;
}
catch(CInternetException* e)
{
 EndWaitCursor();
 MessageBeep(0xFFFFFFFF);
 e->ReportError();
 ftpCon = NULL;
 session->Close();
 delete session ;
 e->Delete();
 return FALSE;
}

EndWaitCursor();
// 현재 연결된 계정의 루트 패스를 구하는 부분입니다.
CString OriginFTPDir;
ftpCon->GetCurrentDirectory(OriginFTPDir);
CString Server = OriginFTPDi+name;  // 서버에서 받을 패스와 파일 이름
CString Client = cszFolderPath+name;// 보낼 파일의 패스와 파일 이름
try
{
 ftpCon->PutFile(Client, Server);
}
catch(CInternetException* e)
{
 EndWaitCursor();
 MessageBeep(0xFFFFFFFF);
 e->ReportError();
 e->Delete();
}
EndWaitCursor();

예전에 코드그루에 올리고 혼자서 좋아하던.. 그 때 그 좀 많이 부족하던 샘플이다.
가진 실력도 부족하고, 영어 실력도 형편없었지만, 아마도 지금의 내 모습이 존재하도록
내게 힘을 실어준 포스트였다.

original post:
http://www.codeguru.com/cpp/controls/buttonctrl/flatbuttons/article.php/c5185/CStaticDerived-Flat-Button-Class.htm

사실 몇몇 코쟁이들이 메일 보내서 귀찬게 하기도 하고, 작문이 딸려서 다른 포스트 포멧을 
가져다 썼다고 욕도 먹고..
어떤 넘은 코멘트에 비웃음을 실어 놨지만...
그래도 대략 20개 업체정도에서 취업권고 메일도 받았었다.
(근데 전부 다국어라.. 이해를 잘못함 -_-);


CStatic-Derived Flat Button Class

Rating: none

Kwon Jin-ho (view profile)
February 29, 2000

Description

CStaticButton is a class derived from MFC CStatic class. With this class your applications can have standard buttons or new and modern buttons with "flat" style!

CStaticButton features:

  • Standard CStatic properties
  • Only Bitmap Button - But, Adding Icon so esay
  • Not Depend on Format, 2 color - true color support
  • Standard or new "flat" button style
  • Change runtime from Enable-Disable Image
  • Change runtime from ToolTips and CRgn(Default-rect region)
  • Can be used via DDX_ calls
  • Can be dinamically created
  • Each button can have its own mouse pointer
  • Full source code included!
  • It's free!

Summary

I don't speak English very well. However, I think that the code is simple and easy enough to follow. Just don't forget to change the button image's Notify property

Downloads

Download demo project - 64 Kb
Download source - 3 Kb

Windows Server "Longhorn" Showcase Roadshow: Developer Essentials.
Is it time to make your move to the multi-threaded and parallel processing world? Find out!
Generate Complete .NET Web Apps in Minutes . Download Iron Speed Designer today.
New Article! Take a Sneak Peek--Microsoft .NET Developers Test Drive Avaya's Latest SDK
Article: Avaya Leads Developers to the Right SDKs and APIs for Your Application Domain


RATE THIS ARTICLE:   Excellent  Very Good  Average  Below Average  Poor  

(You must be signed in to rank an article. Not a member? Click here to register)

Latest Comments:
CStatic-Derived Flat Button Class - Legacy CodeGuru (06/13/2003)
It looks very useful to me - Legacy CodeGuru (08/28/2002)
I cant see any new buttons here - Legacy CodeGuru (07/23/2002)
I really thankfull - Legacy CodeGuru (05/09/2002)
Thanx... Nice guy! Kwon~ - Legacy CodeGuru (04/15/2002)

View All Comments


 시스템 코덱 정보 읽기   |  2000-03-26
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 888   / 평점:  (-)  / 읽음:945
안냐세여  까막입니다.

M$에 있는 자료를 쩜 손본겁니다.
아직 Win32와 MFC 포팅에 어려움을 격는 분덜이 쩜있져.
저도 아직 이거 포팅하는데 힘이 들때가 많습니다.
MSDN에 좋은 자료가 많이 있지만 대부분이 Win32오 SDK로
되어 있어 이것을 MFC로 바꾸기 위해 고생을 합니당 --;;;

필요하신분은 다운 받아서 원하는 대로 고쳐 쓰세여...
그럼 이만...
이 글에 평점 주기:  
[코멘트] 난감 2004-10-15 16:14:00
정성진 (sjchung)   정성진님께 메시지 보내기정성진님을 내 주소록에 추가합니다.정성진님의 개인게시판 가기 
코덱 정보 가져오다가 죽습니다.
디버깅 해보니....
잘 가져오다가..... DriverEnumProc()내에서 "OGG........." 정보가져오고 free() 쪽에서 죽는데요?
이쪽은 첨해보는 거라....... 어디서부터 손대야 하는징......... ㅠ.ㅠ
 
 FlashWindow()를 이용한 아이콘 껌뻑이기   |  2000-04-21
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 938   / 평점:  (-)  / 읽음:851
까막임니다...

어떤 프로그램이 셑업이나 파일 다운로드가 끝나면...
밑에 작업 윈도우(트레이 윈도운가?)에 프로그램 이름들어간 아이콘들이 쫙 떠있자나여?

근데.. 어떤걸 보면.. 이게 무신 메시지를 보내느라 그러는지.. 파란색으로 껌뻑 껌뻑 하자나여?

전 이놈이 왜 껌뻑 거릴까? 생각해 봤더니.. 무신 작업이 끝났다는걸 사용자에게 알리기 위해서 그러는 거래여...

그래서 그걸 구현해 봤어여... 정말 시버여..

여러분들도 이제 넣어봐여.. 금방 넣을 수 있을겁니다..

미니마이즈 버튼을 눌러서 아이콘화 시키면 껌뻑 거려여... ^^

 [심플] 간단한 음성채팅 풀소스  | WinSock 2000-08-21 오전 7:31:28
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 2294   / 평점:  (-)  / 읽음:5,408
까막입니다..

열심히 설명를 달았었는데.. 업로드 하니까..헤그덕 --;;; 날라가버리는 군여..

환경만 간단히 다시 설명을 달겠습니다.

프로토타입(일단 동작을 중시)으로 만들었던것이라 코덱은 PCM을 그대로 씁니다.
다이렉트 엑스를 이용한 관계로 NT에선 동작이 않됩니다.
(그때 왜 다이렉트X를 썼는지 지금은이해가 않됨 --;;;)

코덱을 변경하실라믄.. 녹음하는 부분에서 코덱 정보를 읽어 오는 부분을 쩜
수정하셔야 됩니다.

참고로, GSM 13Kbps는 윈98이상에서 지원되구여..
G.723.1은 5.6kbps & 6.3kbps는 윈2000이상에서 그냥 지원해줍니다.

맘에 드시는걸로 골라쓰세여..

[요청자료] Frame(SDI' MDI) 내부에 머무르는 모달리스 다이알로그  | VC++ 일반 2000-11-10 오후 5:13:31
권진호 (crowback )  권진호님께 메시지 보내기권진호님을 내 주소록에 추가합니다.권진호님의 개인게시판 가기 번호: 3171   / 평점:  (-)  / 읽음:2,861
까막임돠...

SDI나 MDI로 프로그램을 제작할 경우..
모달리스 다이알로그가 프레임 밖으로 벗어 나는 경우에 대하여
이를 막을 수 있는 방법에 대한 질문이 여러번 중복되어 들어 와서 자료로
올립니다.

실제 모달리스 다이알로그의 행동반경이 MDI에서의 차일드 프레임처럼
Frame내부의 뷰 안에 머물도록 하였습니다.

그럼 도움이 되었으면 합니다.

+ Recent posts