728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 폰트 대화상자(CFontDialog)

 

안녕하세요. 지난 시간에 파일 대화상자에 대해서 열심히 학습하시고 오셨을 거라고 믿어 의심치 않습니다. 

이번 시간에는 아래의 창과 같은 폰트 대화상자를 만드는 방법에 대해 소개하겠습니다.

 


1. 결과물

 

 


2. 실습

 

 

2-1. CFontDialog 생성자(Construtors)

 


 CFontDialog(LPLOGFONT lplfInitial = NULL,
  DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
  CDC* pdcPrinter = NULL,
  CWnd* pParentWnd = NULL);
 (Overloading)

 

  CFontDialog(const CHARFORMAT& charformat,
  DWORD dwFlags = CF_SCREENFONTS,
  CDC* pdcPrinter = NULL,
  CWnd* pParentWnd = NULL); 

 (Overloading)

 

a. lplfnitial
LOGFONT는 폰트 정보를 담기 위한 구조체로 WinGDI.h 파일에 정의되어 있습니다.

 

typedef struct tagLOGFONTA
{
    LONG      lfHeight;                  // 높이
    LONG      lfWidth;                    // 너비
    LONG      lfEscapement;         // 방향
    LONG      lfOrientation;            // 회전각도
    LONG      lfWeight;                 // 굵기
    BYTE      lfItalic;                     // 이텔릭체
    BYTE      lfUnderline;               // 밑줄
    BYTE      lfStrikeOut;                 // 취소선
    BYTE      lfCharSet;                       // 문자세트??
    BYTE      lfOutPrecision;               /// 출력 정확도
    BYTE      lfClipPrecision;                  /// 클리핑 정확도 ??
    BYTE      lfQuality;                         // 품질
    BYTE      lfPitchAndFamily;                           // 문자간격
    CHAR      lfFaceName[LF_FACESIZE];          // 폰트 이름

 

b. dwFlags

 

 플래그 값

 설명

 CF_EFFECTS

 폰트 대화상자에 효과들을 표시

 CF_SCREENFONTS

 시스템에 설치되어 있는 폰트들의 리스트를 출력

 

c. pdcPrinter

  -> CDC*

d. pParentWnd

  -> 폰트 대화상자의 부모 윈도우로 지정할 윈도우의 포인터

 


2-2. CFontDialog 멤버 함수

폰트 대화상자 클래스인 CFontDialog 클래스는 폰트와 관련한 멤버 함수

 

 

 void GetCharFormat(CHARFORMAT& cf) const;

 // Helpers for parsing information after successful return

 // 현재 설정되어 있는 폰트의 정보를 획득하여 LOGFONT 구조체의 포인터를 Parameter로 전달?

 CString GetFaceName() const;  // return the face name of the font


 CString GetStyleName() const; // return the style name of the font


 int GetSize() const;          // return the pt size of the font


 COLORREF GetColor() const;    // return the color of the font


 int GetWeight() const;        // return the chosen font weight


 BOOL IsStrikeOut() const;     // return TRUE if strikeout


 BOOL IsUnderline() const;     // return TRUE if underline


 BOOL IsBold() const;          // return TRUE if bold font


 BOOL IsItalic() const;        // return TRUE if italic font


 void GetCharFormat(CHARFORMAT& cf) const; 

 

 


2-3. CFontDialog 완성물

여러분이 완성해야할 결과물입니다.

 

 

 

 완성 결과물

 

 

 

 

 

 

 버튼 1번 - 문자열 출력 클릭시

  버튼 2번 - 문자열 정보 클릭시

 

 

 

 

 출력 결과 - 문자열 출력에 대한 결과

 출력 결과 - 문자열 정보에 대한 결과

 


2-4. 레이아웃 디자인

 

최종 결과물하고 동일하게 해오시면 되겠습니다.

 


2-5. 코드

 

 
void CTestDlg::OnBnClickedButton1()
{
       HFONT hFont, OldFont;

      

       CFontDialog dlg;

     

       CString strText = _T("한글 english 11222334324");

 

 if (dlg.DoModal() == IDOK)
 {

         HDC hdc;
         hdc = ::GetDC(this->m_hWnd);
         LOGFONT lf;

 

         dlg.GetCurrentFont(&lf);       // LOGFONT 획득

         hFont = CreateFontIndirect(&lf);     // 폰트 생성
         OldFont = (HFONT)SelectObject(hdc, hFont);   // 폰트 선택
         SetTextColor(hdc, dlg.GetColor() );    // 폰트 색상 적용

    TextOut(hdc, 0, 0, strText, strText.GetLength()); // 문자열 그리기

 

         SelectObject(hdc, OldFont);       // 기존 폰트 선택
         DeleteObject(hFont);        // 폰트 삭제

 }


}

 
void CTestDlg::OnBnClickedButton2()
{
          CFontDialog dlg;

          if (dlg.DoModal() == IDOK)
         {
               CString strMsg;

               strMsg.Format(

        _T( "폰트명:%s, 크기:%d \n 색상RGB(%d, %d, %d)" ) ,
        dlg.GetFaceName(), dlg.GetSize() / 10, 
        GetRValue(dlg.GetColor()),
        GetGValue(dlg.GetColor()),
        GetBValue(dlg.GetColor()) );

 

       AfxMessageBox(strMsg);

     

        }

}

 버튼 1 - 문자열 출력

 버튼 2 - 문자열 정보

 

직접 돌려봐야 뭔 느낌인지 알 수 있습니다.

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 쉬어가는 코너 (읽는 방법의 여러 종류)

 

이 방법은 이런 방법들이 있구나 이 정도로 읽어가시면 됩니다.

종류가 다양하는 사실만 아셔도 여러분에게 많은 도움이 되실겁니다.

 


1. MFC 방법

 

<대용량 파일 읽기(빠르게)> 
-> 파일 읽기는 자주 사용하는 명령 중 하나입니다.

참고로 CFile::Read를 사용하면 10MB정도 되는 파일을 읽으면 오래 걸립니다.

 

-> 메모리 맵 파일을 이용한 파일 읽기 방법을 소개하겠습니다.

 

BOOL OpenFiles(LPCSTR lpsz PathName)

  DWORD dwFileSize; 
  HANDLE hFile, hFileMap; 
  LPVOID lpvFile;
 
  hFile = ::CreateFile( lpszPathName, GENERIC_READ , 0, NULL
    OPEN_EXISTING, FILE_ATTRIBUTTE_NORMAL, NULL );
 
  if( hFile == INVALID_HANDLE_VALUE )
  {
    // 여기에서 에러 메세지 처리..
  }
 
  dwFileSize = ::GetFileSize(hFile, NULL);
 
  hFileMap = CreateFileMapping( hFile, NULL, PAGE_WRITECOPY, 0,
    dwFileSize, NULL );
 
  if( hFileMap == NULL )
  {
    CloseHandle(hFile);
    //여기에서 에러 메세지 처리..
  }
 
  lpFile = MapViewOfFile( hFileMap, FILE_MAP_COPY, 0, 0, 0 );
 
  if( lpFile == NULL )
  {
    CloseHandle( hFile );
    CloseHandle( hFileMap );
    //여기에서 에러 처리
  }
}


 


필요하신 분은 복사하셔서 사용하시면 됩니다.

 


2. C언어 방법

메모리 맵파일을 이용한 방법 외에 다른 방법 하나 소개합니다.

도스용 시절에 사용했던 fread함수를 사용한 것입니다.

물론 fread대신 다른 파일 읽기 함수를 사용해도 됩니다.

다만 사용자 편의를 위해서 추가로 만들어진 파일함수들은(파일함수뿐만 아니라 다른 것들도 마찬가지임.) 사용하긴 편하겠지만,

속도가 무척 느린 문제가 있습니다.


 

char *ReadFile( char *FileName )

  FILE *fp; 
  int FileSize; 
  char *buffer; 
  
  try
  {
      fp = fopen( FileName, "rb" );
      if( !fp ) throw "File Not Found!";
   
      FileSize = filelength( fileno(fp) );
      buffer = new char [FileSize+1]; 

      fread( buffer, FileSize, 1, fp );
      *(buffer + FileSize) = 0;
      fclose( fp );
      return buffer;
  } 
  catch( char *msg )
  {
      printf( msg );
      return NULL;
  }
}

 

이 두 가지 방법이 있는데, 구현할 때 잘 활용하면 좋을 거 같습니다.

 


3. 참고자료(Reference)

 

1. http://npteam.net/440, 접속일자 2015-03-27

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 파일 대화 상자 무작정 실습

 

앞 전 강의 잘 읽어 보시고 오셨을거라고 생각됩니다.

이번 시간에는 본격적으로 파일 대화 상자를 만드는 방법에 대해 배우겠습니다.

사실상 앞 전 강좌의 전 개념 이해라고 보시면 됩니다.

이전 강좌 정확히 한번 쯤은 이해하는 데 도움됩니다.

읽어오셔야 합니다.

 

이해 안되시면 이전 글을 보세요.

 

http://yyman.tistory.com/515, [MFC] 윈도우 프로그래밍 기초 - 파일 대화 상자(CFileDialog)

 


1. 결과물

 

 

 

 

 

 

 

 

 

 


2. 실습

 

2-1. 레이아웃 디자인 (생략)

2-2. 버튼 이벤트 처리기로 두개 만들기 (생략)

2-3. 코드 내용

 

 

// 열기 대화상자
void CaaaDlg::OnBnClickedButton1()
{
       CString strMsg;
       TCHAR fileFilter[] = _T("하호 파일(*.haho)|*.csv|AVI영상(*.avi)|*.avi|");

       CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, fileFilter);

 

       if (dlg.DoModal() == IDOK)
       {
            strMsg.Format(_T("파일이름:%s\n파일확장자:%s\n파일타이틀:%s\n파일경로:%s"),
            dlg.GetFileName(), dlg.GetFileExt(), 
            dlg.GetFileTitle(), dlg.GetFolderPath());

            AfxMessageBox(strMsg);
       }

}

 

// 저장 대화상자
void CaaaDlg::OnBnClickedButton2()
{

       CString strMsg;
       TCHAR fileFilter[] = _T("하 파일(*.haho)|*.ha|미디어영상(*.avi)|*.avi|");
       CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY, fileFilter);

 

       if (dlg.DoModal() == IDOK)
       {
            strMsg.Format(_T("파일이름:%s\n파일확장자:%s\n파일타이틀:%s\n파일경로:%s"),
            dlg.GetFileName(), dlg.GetFileExt(),
            dlg.GetFileTitle(), dlg.GetFolderPath());

            AfxMessageBox(strMsg);
       }

 코드

 

차이점 소개

빨간색으로 친 내용이 TRUE와 FALSE로 바뀐 것 이외에 전혀 차이 없습니다.

동작도 동일하게 합니다.

 

2-4. 읽기 기능 - 추가 (MFC 스타일)

 

읽는 기능을 직접 구현하는 방법에 대해 소개하겠습니다.

구현 방법에 앞서 큰 그림을 소개하겠습니다.

 

 

조합에는 CFile::modeRead | CFile::typeText 를 이용할 수 있습니다.

 

다음은 직접 구현입니다. 

 


void CaaaDlg::OnBnClickedButton1()
{
         CStdioFile f;
         CString tmpTxt, strTxt;

         TCHAR fileFilter[] = _T("텍스트 파일(*.txt)|*.txt|CSV(*.csv)|*.csv|");
         CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, fileFilter);

 

         if (dlg.DoModal() == IDOK)
         {
                if (f.Open(dlg.GetPathName(), CFile::modeRead | CFile::typeText))
                {
                          // 정상적으로 읽어짐.
                          while(f.ReadString(tmpTxt))
                                    strTxt += tmpTxt;

                          AfxMessageBox(strTxt);

                          f.Close(); // 파일 닫기
                }
 }

 읽기 코드

 

2-5. 저장 기능 - 추가 (MFC 스타일)

 

 

 참고자료) 기존 C++, C언어 파일 저장 스타일

 

MFC 스타일은?

 

 

 

 MFC 스타일 - 파일 처리

 

조합에는 CFile::modeCreate | CFile::ReadWrite 를 이용할 수 있습니다.

 

다음은 직접 구현입니다. 

 


3. 구현

 

 
void CaaaDlg::OnBnClickedButton2()
{

         CStdioFile file;
         CFileException ex;

 

         TCHAR fileExt[] = _T(".haho|.avi|");

         TCHAR fileFilter[] = _T("하호 파일(*.haho)|*.csv|AVI영상(*.avi)|*.avi|");

         CFileDialog dlg(FALSE, fileExt, NULL, OFN_HIDEREADONLY, fileFilter);

 

         if (dlg.DoModal() == IDOK)
         {
                  file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeReadWrite, &ex);
                  UpdateData(TRUE);
                  file.Close();
          }

}

 저장 기능 포함 - 코드

 

 


4. 참고자료(Reference)

 

1. https://msdn.microsoft.com/ko-kr/library/6337eske.aspx , (Visual Studio 2013 - C++ MFC CFILE - 읽기와 저장(Eng)), 접속일자 2015-03-27

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 파일 대화 상자(CFileDialog)

 

파일 대화 상자는 두 크게 두 가지 유형으로 볼 수 있습니다.

 

 

책들 여러 종류 찾아보니깐 초반부터 함수 원형 넣어놓고 해놨습니다.

초보자를 위해 설명을 드리자면, 결론은 같은 Dialog 창에서 단지 이름만 바껴있지 대화상자는 대화상자라는 것을 말하고 싶습니다.

 

 

이러한 개념을 바탕으로 파일 대화상자의 생성자를 살펴보겠습니다.

 


1. 너는 누구냐? CFlieDialog 생성자

 

CFileDialog (BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
  LPCTSTR lpszDefExt = NULL,
  LPCTSTR lpszFileName = NULL,
  DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  LPCTSTR lpszFilter = NULL,
  CWnd* pParentWnd = NULL,
  DWORD dwSize = 0,
  BOOL bVistaStyle = TRUE);

 

하나씩 살펴보면,

 

 Parameter

 설명 

 BOOL bOpenFileDialog  

 쉽게 말하면,

 TRUE = "열기 대화상자"

 FALSE = "저장 대화상자"

 LPCTSTR lpszDefExt

 기본으로 사용할 파일 확장자를 입력하기 위한 파라미터

 LPCTSTR lpszFileName

 파일 대화상자가 나타날 때 초기화할 파일 이름을 입력하기 위한

 파라미터

 

* Parameter : DWORD dwFlags

파일 대화상자의 여러 가지 옵션들을 설정하기 위한 Flags

 

Flags 

내용 

OFN_ALLOWMULTISELECT

한 번에 두 개 이상의 파일을 선택할 수 있도록 한다. 

OFN_CREATEPROMPT 

존재하지 않는 파일명을 입력했을 경우 사용자에게 파일 생성을 할 것인지 물어봄. 

OFN_FILEMUSTEXIST 

파일 대화상자의 크기 조절이 가능하도록 한다. 

OFN_FORCESHOWHIDDEN 

시스템 파일과 숨겨진 파일을 보여줌. 

OFN_NOCHANGEDIR 

현재 디렉토리를 변경할 수 없도록 한다. 

OFN_NOVALIDATE 

파일명으로 사용할 수 없는 특수 문자들을 검사하지 않도록 한다. 

OFN_OVERWRITEPROMPT 

저장하기 대화상자에서 선택한 파일이 이미 있을 경우 파일을 덮여쓸 것인지 물어본다. 

OFN_PATHMUSTEXIST

존재하는 경로와 파일만 입력할 수 있도록 한다.

존재하지 않는 파일을 입력하면 경고창을 출력함.

 

 

* Parameter : LPCTSTR lpszFilter

확장자 필터

 

{필터파일형식1|*.확장자|필터파일형식2|*.확장자|............|필터파일형식n|*.확장자n}

 

예제

_T("A파일|*.a|B파일|*.b|C파일|*.c);

 

* Parameter: pWnd : pParentWnd

파일 대화상자의 부모 윈도우를 지정하기 위한 포인터.

 

* Parameter: dwSize

OPENFILENAME 구조체의 크기 지정

 

* Parameter: BOOL bVistaStyle

Vista이상의 대화상자로 출력함.

 


2. CFileDialog 맴버 함수

CFileDialog 클래스는 다양한 맴버 함수를 지원합니다.

프로그래머를 편안하게 해준다는 의미로 해석하시기 바랍니다.

 

혹시 오해하실 수 있는 데 전혀 외울 필요없습니다. 필요하면 보고 하셔도 됩니다.

 

함수

내용

GetFileExt

선택된 파일의 확장자를 Return

GetFileName

선택된 파일의 파일 이름을 Return

GetFileTitle

선택된 파일의 타이틀을 Return

GetFolderPath

선택된 파일의 폴더 경로를 Return

GetPathName

선택된 파일의 전체 경로를 Return

GetReadOnlyPref

선택된 파일의 읽기전용 상태를 Return

GetNextPathName

다음 파일의 전체 경로를 Return

 

 

다음 편에서 실습을 통해 파일 대화 상자를 사용하는 방법을 소개하겠습니다.

반응형
728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - 리스트박스 컨트롤(Listbox Control)

 

짬좀 차신 여러분 지금까지 오신 걸 환영합니다.

여러분들은 다양한 컨트롤들을 체험해보시고 계십니다.?

 

 

먼저

결과물을 확인해보겠습니다.

 


1. 결과물

 

 


2. 레이아웃 설계

 

 

알아서 디자인 하시는 거 알죠??

 

 컨트롤 ID

 CAPTION

 범주(T)

 맴버 변수(N)

 이벤트 처리기

 IDC_STATIC

 계급

 X

 X

 X

 IDC_STATIC

 이름

 X

 X

 X

 IDC_LIST1

 

 Control

 m_ListLevel

 X

 IDC_LIST2

 

 Control

 m_ListName

 X

 IDC_BUTTON1

 조회

 X

 X

 OnBnClickedButton1

 IDC_BUTTON2

 이름 선택 삭제

 X

 X

 OnBnClickedButton2 

 


3. 코드 작성

 

 // CExampleDlg 메시지 처리기

BOOL CExampleDlg::OnInitDialog()
{

            // 중략

            // TODO: 여기에 추가 초기화 작업을 추가합니다.
            m_ListLevel.InsertString(0, _T("이병"));
            m_ListLevel.InsertString(1, _T("일병"));
            m_ListLevel.InsertString(2, _T("상병"));
            m_ListLevel.InsertString(3, _T("병장"));

            

            m_ListName.InsertString(0, _T("도도1"));
            m_ListName.InsertString(1, _T("도도2"));
            m_ListName.InsertString(2, _T("도도3"));
            m_ListName.InsertString(3, _T("도도4"));

 

               return TRUE;

}

 (사용자 프로젝트명)Dlg.cpp - OnInitDialog() 함수 내 입력

 

 



{
        CString strTmp, strMsg;
        int levelidx = m_ListLevel.GetCurSel();
        int nameidx = m_ListName.GetCurSel();

 

        // 계급장
        if (levelidx != -1 && nameidx != -1)
       {
              m_ListLevel.GetText(levelidx, strTmp);

              strMsg.Append(strTmp + " "); // 1. strMsg에 m_ListLevel의 값 = 입력 추가

              m_ListName.GetText(nameidx, strTmp);

              strMsg.Append(strTmp);   // 2. strMsg에 m_ListName의 값 = 입력 추가

              AfxMessageBox(strMsg);   // 3. 출력

         }
         else
              AfxMessageBox(_T("선택 후 사용해라. 좋은 말할때"));


}


void CExampleDlg::OnBnClickedButton2()
{
         CString strMsg;
         int idx;

         idx = m_ListName.GetCurSel();

 

         if (idx == -1)
        {
               strMsg.Format(_T("idx:%d, 선택 후 사용하세요."), idx);
               AfxMessageBox(strMsg);
         }
         else
               m_ListName.DeleteString(idx);

 

}
 

 ExampleDlg.cpp -> 버튼 이벤트 처리
 -> OnBnClickedButton1(  ), OnBnClickedButton2(  )

 


4. 몇 가지 ListBox 소개

 

ListBox에서 컨트롤 맴버 함수에 대해 소개하겠습니다.

리스트박스 컨트롤은 CListBox 클래스를 사용하며, CListBox 클래스는 다음과 같은 멤버 함수들을 가지고 있습니다.

 

afxwin에 위치함.

함수 원형 

설명 

 int AddString(LPCTSTR lpszItem)

 리스트 박스의 문자열 항목을 추가할 때 사용함. (순서 상관없이)

 int InsertString(int nIndex, LPCTSTR lpszItem)

 리스트 박스의 문자열 항목 추가에 사용함. (특정 위치, 순서 있음.)

 int DeleteString(UINT nIndex)

 특정 위치의 항목을 삭제함.

 void ResetContent( )

 리스트 박스의 내용 초기화

 int GetCurSel( )

 리스트 박스 내 현재 선택한 값의 인덱스 값 반환

 int SetCurSel( int nSelect )

 특정 아이템을 선택함.

 -> 원하는 인덱스에 커서를 위치시키고 싶을 때

 void GetText(int nIndex, CString & rString)

 int GetText(_In_ int nIndex, _Pre_notnull_ _Post_z_ LPTSTR lpszBuffer) const;
 void GetText(int nIndex, CString& rString) const;
 int GetTextLen(int nIndex) const;

 특정 인덱스에 위치한 문자열을 획득

 ex) CString aaa;라고 선언

 

 m_List1.GetText( 0, aaa); 라고 하면

 가져올 수 있음.

 

 int GetTextLen(int nIndex) const;

 특정 인덱스의 문자열 길이를 반환

 

 콤보박스(ComboBox)는 사용법이 거의 같으므로 생략합니다.

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - Edit Control(에디트 컨트롤) - 택스트상자

 

이번에 만들 건 Edit Control입니다.

여러분은 아마 지금쯤이면 어느 정도 짬좀 찼을 거 같습니다.

 

 

이번에 만들 건 텍스트 상자라고도 볼 수 있는 Edit Control 입니다.

 

 

이렇게 생긴거 하나 만들어 보겠습니다.

 


1. 결과물

 

 

(레이아웃)

 

 

말 안해도 자동으로 레이아웃 그리고 계셔야 합니다.

 

짬 찼으니깐요.

자동으로 못 그리면, 다시 이전 강의로 돌아가세요. 제발~(Please)

 

컨트롤 ID

Caption

범주(T)

변수 이름(N)

최대 문자 수

이벤트 처리기이름 

ReadOnly

IDC_STATIC

입력

 

 

 

 

 

IDC_STATIC

출력

 

 

 

 

 

IDC_EDIT1

 

Value

m_strName

5

 

 

IDC_EDIT2

 

Value

m_printName

5

 

 True

IDC_BUTTON1

입력해보기

 

 

 

OnBnClickedButton

 

 


2. 소스 코드 작성

  
void CExampleDlg::OnBnClickedButton1()
{
      UpdateData(TRUE);
      m_printName = m_strName;
       UpdateData(FALSE);
}

 

코드 내용 - 이벤트 버튼에 관한 코드 

 


3. 설명 - UpdateData에 대해서

 

Visual Basic이나 다른 프로그래밍 언어에선 UpdateData() 이딴거 안써도 솔직히 바로 바뀝니다.

MFC는 불편합니다.

 

실시간 변화를 할 수 없기에 인위적으로 변화를 하도록 제어하고 있습니다.

깊은 의미는 동시접근을 임의로 하지 못하도록 마치 신호등처럼 제어하고 있습니다.

 

 

 

 

운영체제론이라는 책에서 배울 수 있습니다.

교착상태를 예방하기 위해 이러한 원리를 적용한 것입니다.

 

정확한 의미는 우리하고 관련없으므로 생략합니다.

 

 


UpdateData의 함수 원형은 아래와 같습니다.

 

BOOL UpdateData(BOOL bSaveAndValidate = TRUE);

 

-> bSaveAndValidate의 상태는

BOOL 형태이니깐

 

TRUE

 

OR

 

FALSE

 

두 가지 밖에 안됩니다.

 

TRUE 상태에선 변경 작업을 허용합니다.

FALSE 상태에선 변경 작업을 끝냅니다.

 


동작해보면 잘 돌아갑니다. 참 쉽죠??

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - (라디오 버튼) + 그룹박스

 

정말 쉽습니다.

 

http://yyman.tistory.com/506 / [MFC] 윈도우 프로그래밍 기초 - 체크 박스 + 버튼 응용 실습 예제

 

오늘 글의 초점은 아래의 결과물을 만드는 것입니다.

 


1. 결과물

 

결과물 먼저 볼까요?

 

 


2. 실습

 

a. 레이아웃 디자인

 

 

 

 

 앞에 글의 레이아웃 모습

 우리가 만들 레이아웃

 

현명하고 지혜로운 사람들은 잘 아시겠지만, 기존꺼 그대로 이어서 하시면 됩니다.

Radio 박스 레이아웃 설계만 하나 알려드리겠습니다.

 


a-1) Radio 박스 설계

 

* 이해를 위한 큰 나무 보기

 

 

* 주의사항 - Radio 박스는 체크박스 컨트롤과 달리 Group 항목을 설정해주지 않으면,

CButton 클래스 형식의 맴버 함수를 만들 수 없습니다.

추가된 라디오 버튼들을 하나씩 선택하여 속성 창에 있는 속성 항목에서 Group 항목을 True로 변경해야 합니다.

 

전 귀찮아서 위의 그림처럼 전체 다 선택했습니다. 그래도 상관없습니다.

 

 

 

 Group -> False 항목을

 

 True로 바꿔주고 변수 추가합니다.

 

 

컨트롤 ID 

 변수명

 Control 유형

 범주(T)

 변수 유형

 IDC_RADIO1

 m_RadioButton1

 라디오 박스

 Control

 CButton

 IDC_RADIO2 

 m_RadioButton2 

 라디오 박스 

 Control 

 CButton 

 IDC_RADIO3

 m_RadioButton3

 라디오 박스

 Control

 CButton

 IDC_STATIC1 

 

 그룹박스

 

 

 IDC_STATIC2 

 

 그룹박스

 

 

 

추가해서 만들 아이템의 구성요소입니다.

다 만들고 나면, 다시 Radio 1, 2, 3을 선택합니다.

 

아래와 같이 설정합니다.

 

 

 

 

 Group -> True 항목을

 

 False로 바꿔줍니다.

 

그러면 Radio 버튼 설계는 끝났습니다.

 


b. 코드

 

 

 

 (사용자 프로젝트명)ControlDlg.cpp

 

 

 

 

  (사용자 프로젝트명)ControlDlg.cpp 내에 BOOL CMFCControlDlg::OnInitDialog() 내부에 구현

 지난 번 강의에선 SetDlgItem( )로 컨트롤 Caption을 변경하였는데,

 이번에는 우리가 만든 변수를 직접 접근하여 변경하는 방법을 넣었습니다.

 같은 동작을 하니깐 오해하지 말고 두 가지 방법이 있구나 이 정도로 아셨으면 합니다.

 

 

 

 void CMFCControlDlg::OnBnClickedButton1()
 {
        // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

         CString szMsg_Name;
         CString szMsg_Menu;
         CString szMsg;

 

         if (m_CheckBox1.GetCheck() == BST_CHECKED)
         {
              GetDlgItemText(IDC_CHECK1, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
         }

         else if (m_CheckBox2.GetCheck() == BST_CHECKED)
         {
              GetDlgItemText(IDC_CHECK2, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
         }

         else if (m_CheckBox3.GetCheck() == BST_CHECKED)
        {
              GetDlgItemText(IDC_CHECK3, szMsg_Name);
              szMsg_Name.Append(_T("님\n"));
        }

 

         // 추가 - Radio 예제

        if (m_RadioButton1.GetCheck() == BST_CHECKED)
        {
              //GetDlgItemText(IDC_RADIO1, szMsg);
               m_RadioButton1.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
        }

         else if (m_RadioButton2.GetCheck() == BST_CHECKED)
        {
              //GetDlgItemText(IDC_RADIO2, szMsg);
               m_RadioButton2.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
         }

 

          else if (m_RadioButton3.GetCheck() == BST_CHECKED)
         {
               //GetDlgItemText(IDC_RADIO3, szMsg);
               m_RadioButton3.GetWindowTextW(szMsg_Menu);
               szMsg_Menu.Append(_T("- 요리 형"));
         }

 

         szMsg_Menu.Append(_T("\n음식하세요."));

         szMsg.Append(szMsg_Name);
         szMsg.Append(szMsg_Menu);

         AfxMessageBox(szMsg);

 

 }

 (사용자 프로젝트명)ControlDlg.cpp 내에 void CMFCControlDlg::OnBnClickedButton1() 내부에 구현

 

 지난 번 글에서는 GetDlgItem( )로 컨트롤 Caption의 값을 CString 형 변수에 전달하였는데,

 이번에는 만든 변수를 접근하여 가져오는 방법을 넣었습니다.

 

 

구현 끝... 수고하세요.

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 체크 박스 + 버튼 응용 예제

 

오늘 만들어볼 예제는 체크 박스를 선택하면 내용이 출력되는 것을 만들도록 하겠습니다.

VB6 수준으로 정말 쉽습니다.

 

실습을 하기에 앞서 이론적인 지식을 잠시 넣도록 하겠습니다.

 


1. 구현에 관한 기본 지식

afxwin.h

-> void SetCheck(int nCheck)

-> int GetCheck( ) const

 

SetCheck( )는 말 그대로 체크박스의 값을 변경하는 일을 수행하며

GetCheck( )는 아래의 인자값으로서 체크박스의 현재 상태를 출력한다.

상태값은 아래와 같이 두 가지로 구분된다.

 

 인자 값

 내용

 BST_UNCHECKED

 체크박스 컨트롤이 체크 안된 상태를 의미

 BST_CHECKED

 체크박스 컨트롤이 체크된 상태를 의미 

 


2. 결과 - 완성 프로그램

 

 


3. 실습

 

 

 

위처럼 디자인을 합니다.

 

 컨트롤 ID

 변수 이름

 변수 형식

 범주(T)

 IDC_CHECK1

 m_CheckBox1

 CButton

 Control

 IDC_CHECK2 

 m_CheckBox2

 CButton 

 Control 

 IDC_CHECK3

 m_CheckBox3

CButton

 Control

 IDC_BUTTON

 

 

 

 

IDC_BUTTON은 이벤트 처리기로 OnBnClickedButton1()을 생성해줍니다.

(사용자프로젝트명)Dlg.h에 가면 아래와 같이 잘빠지게 생성된 것을 확인할 수 있습니다.

 

 

(사용자프로젝트명)Dlg.cpp 코드 부분

 

맨 위의 #ifdef _ #endif 아래에 이와 같이 코드를 짜봅니다.

- 0번째 줄부터 보면 찾기 쉽습니다.

 

 

 

BOOL CMFCControlDlg::OnInitDialog()  - 약 74줄 근방에 위치함

{

         (생략)

         
          // TODO: 여기에 추가 초기화 작업을 추가합니다. - 약 103줄 근방에 위치함.
           SetDlgItemText(IDC_BUTTON1, _T("확인"));
           SetDlgItemText(IDC_CHECK1, pszName[0]);
           SetDlgItemText(IDC_CHECK2, pszName[1]);
           SetDlgItemText(IDC_CHECK3, pszName[2]);

 

           m_CheckBox1.SetCheck(BST_CHECKED);
           m_CheckBox2.SetCheck(BST_UNCHECKED);
           m_CheckBox3.SetCheck(BST_UNCHECKED);


}

 

 

void CMFCControlDlg::OnBnClickedButton1() // 약 166줄 위치
{
        // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

         CString szMsg;

        if (m_CheckBox1.GetCheck() == BST_CHECKED)
        {
               GetDlgItemText(IDC_CHECK1, szMsg);
               szMsg.Append(_T("님"));
        }

        if (m_CheckBox2.GetCheck() == BST_CHECKED)
        {
               GetDlgItemText(IDC_CHECK2, szMsg);
               szMsg.Append(_T("님"));
         }

         if (m_CheckBox3.GetCheck() == BST_CHECKED)
         {
               GetDlgItemText(IDC_CHECK3, szMsg);
               szMsg.Append(_T("님"));
         }

         szMsg.Append(_T("\n안녕하세요."));

         AfxMessageBox(szMsg);

}

 

이렇게 짜보면 예제를 실행할 수 있습니다.

 

반응형

+ Recent posts