728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - List Control

 

이번 글은 직접 List Control을 구현해보는 것이 기본 목표입니다.

 

개념은 기본 멤버함수 몇 개 소개하는 것으로 시작하겠습니다.

 

1. CListCtrl 클래스의 멤버함수

 

 * InsertColumn

 

 int InsertColumn ( int nCol,

                           LPCTSTR lpszColumnHeading,

                           int nFormat = LVCFMT_LEFT,

                           int nWidth = -1,

                           int nSubItem = -1 );

 

-> nCol : 컬럼 헤더의 인덱스 값

-> lpszColumnHeading : 컬럼 헤더에 표시할 문자열

-> nFormat : 컬럼 헤더에 표시할 문자열의 정렬방식을 지정하며, 다음의 값들을 지정하여 사용가능.

-> Return 값 : 컬럼 추가에 성공하면 컬럼의 인덱스를 반환하며, 실패하면 -1을 반환한다.

 

 포멧 값

 정렬 방식

 LVCFMT_RIGHT

 오른쪽 정렬

 LVCFMT_LEFT

 왼쪽 정렬

 LVCFMT_CENTER

 중앙 정렬

 

-> nWidth : 컬럼 헤더의 너비

-> nSubItem : 연관된 하위 항목의 인덱스

-> Return 값 : 컬럼 추가에 성공하면 컬럼의 인덱스를 반환하며, 실패하면 -1을 반환한다.

 

 * DeleteColumn

 BOOL DeleteColumn ( int nCol ) ;

 

 -> nCol : 삭제하고자 하는 컬럼의 인덱스

 -> Return 값 : 삭제에 실패하면 0 (FALSE)을, 성공하면 1 (TRUE)을 반환한다.

 * InsertItem

 int InsertItem ( const LVITEM* pItem ) ;

 

-> pItem : 리스트 컨트롤에 등록할 LVITEM 구조체 포인터

-> Return 값 : 성공 시 추가된 아이템의 인덱스, 실패 시 -1

 * SetItemText

 BOOL SetItemText ( int nItem, int nSubItem, LPCTSTR lpszText ) ;

 

-> nItem : 아이템 인덱스

-> nSubItem : 서브 아이템 인덱스

-> lpszText : 출력할 텍스트 변수의 포인터

-> Return 값 : 실패시 0(FALSE), 성공시 1(TRUE) 반환 

 * GetItemText

 CString GetItemText ( int nItem, int nSubItem ) const

 

-> nItem : 아이템 인덱스

-> nSubItem : 서브 아이템 인덱스

-> Return 값 : 지정한 아이템 또는 서브 아이템의 문자열

 * DeleteItem

 BOOL DeleteItem ( int nItem );

 

-> nItem : 아이템 인덱스

-> Return 값 : 성공시 TRUE(1), 실패시 FALSE

 * DeleteAllItems

 BOOL DeleteAllItems( );

 

-> Return 값 : 성공시 TRUE, 실패시 FALSE

 

2. 결과물

 

 

 

 

3. 레이아웃

 

List Control에 변수를 만들어 줍니다.

 

 컨트롤 이름

 범주(T)

 변수 이름(N)

 비고

 List Control

 Control

 m_ListView

 

 

 

 

ListControl 속성의 View를 Report로 바꿔줍니다.

 

 

4. 코드

 

 

 BOOL CListControlDlg::OnInitDialog(){

 

           (중략)

            // TODO: 여기에 추가 초기화 작업을 추가합니다.

           m_ListView.InsertColumn(0, _T("번호"), NULL, 50);
           m_ListView.InsertColumn(1, _T("이름"), NULL, 150);
           m_ListView.InsertColumn(2, _T("비고"), NULL, 50);

 

           // LVITEM - 삽입 데이터 보관 장소
           LVITEM firstitem = { 0 } ;  LVITEM seconditem = { 0 } ;


           firstitem.mask = LVIF_TEXT;
           firstitem.iItem = 0;

 

           seconditem.mask = LVIF_TEXT;
           seconditem.iItem = 0;

 

           // 데이터 삽입 - Firstitem
           m_ListView.InsertItem(&firstitem);

 

           // 데이터 값 넣기 - Firstitem
           m_ListView.SetItemText(0, 0, _T("1번"));
           m_ListView.SetItemText(0, 1, _T("도도1-1"));
           m_ListView.SetItemText(0, 2, _T("도도1-2"));

 

            // 데이터 삽입 - Seconditem
           m_ListView.InsertItem(&seconditem);
 
           // 데이터 값 넣기 - Seconditem
          m_ListView.SetItemText(0, 0, _T("2번"));
          m_ListView.SetItemText(0, 1, _T("도도2-1"));
          m_ListView.SetItemText(0, 2, _T("도도2-2"));

        

          UpdateData(FALSE);

 

          return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

 dlg.cpp 파일 내 코드

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 프로그래스 컨트롤

 

프로그래스 컨트롤은 아래와 같이 진행되고 있는 데이터의 상태를 보여주기 위해 사용하는 컨트롤입니다.

 

 

(윈도우 탐색기의 프로그래스 컨트롤)

 

프로그래스 컨트롤이 어떠한 원리로 사용되는지 소개하겠습니다.

 


1. 배경지식


1. CProgressCtrl 클래스


a) CProgressCtrl의
멤버 함수

 

 

 * GetPos( ) 

  int GetPos( ) ;

 

  -> Return 값 : 현재 Position 값

 

 

 * GetRange( )

 void GetRange( int & nLower, int & nUpper)

 

  ->

  nLower : 영역의 최저 값을 받을 int 형 변수

  nUpper : 영역의 최대 값을 받을 int 형 변수

 

 

 * SetBkColor

 COLORREF SetBkColor( COLORREF clrNew ) ; 

 

 ->

   clrNew : 프로그래스 컨트롤의 배경색으로 지정할 색상 값

   Return 값 : 변경하기 전의 배경색 색상 값 

 

 

 * SetPos

  int SetPos( int nPos );

 

 ->

   nPos : 프로그래스 바의 포지션을 변경할 값

   Return 값 : 변경하기 전의 프로그래스 바의 포지션 값

 

 

 * SetRange

  void SetRange( short nLower, short nUpper ) ;

 

  void SetRange32 ( int nLower, int nUpper ) ;

 

 ->

   nLower : 프로그래스 바의 최저 값 (색이 채워지지 않는 값)

   nUpper : 프로그래스 바의 최대 값 (색을 모두 채우는 값)

 

  최저값 : 0

  최대값 : 100까지

 

 


2. 결과물

 

오늘의 실습 주제 : 파일 복사 프로그래스로 측정해보기

 

 

 

 결과물

 

 

 버튼 - 원본파일) 찾아보기

 

버튼 - 복사 경로) 찾아보기

 

 

 버튼 - 파일 복사) 클릭시 결과

 

 

 곰돌이.mp3 복사된 것을 확인 할 수 있음.

 


3. 레이아웃 디자인

 

변수 설정할 부분만 설명해놨습니다.

버튼은 여러분이 이벤트 처리기로 하시면 됩니다. (이 부분은 여러분의 감각 믿습니다.)

 

 컨트롤

 캡션

 범주(T)

 변수 이름(N)

 택스트 컨트롤

 X

 Value

 m_original

 택스트 컨트롤 

 X

 Value 

 m_copydir

 프로그래스

 X

 Control

 m_progress

 


4. 소스코드

 

 // CProgressDlg.h : 헤더 파일
 //

 #pragma once
 #include "afxcmn.h"

 

 #define PROGRESSVALUE(a, b) (int)((double)( a * 100 ) / (double) b )

 

 // 이 부분은 메크로 함수로 PROGRESS 값을 반환하도록 했는데, 여러분이 함수형으로 구현하셔도 되고 상관없습니다.

 CProgressDlg.h

 

 

 
// 원본 파일
 void CCProgressDlg::OnBnClickedButton1()
 {
      TCHAR szFilter[] = _T("All Files (*.*)|*.*|");

      CFileDialog dlg(TRUE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);

 

      if (dlg.DoModal() == IDOK)
     {
            m_original = dlg.GetPathName();

            // 데이터 갱신
            UpdateData(FALSE);

     }
}

 원본 파일 찾기 - 구현 

 
// 복사 경로
void CCProgressDlg::OnBnClickedButton2()
{
       TCHAR szFilter[] = _T("All Files (*.*)|*.*|");

       CFileDialog dlg(FALSE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);

 

       if (dlg.DoModal() == IDOK)
       {
             m_copydir = dlg.GetPathName();

             // 데이터 갱신
             UpdateData(FALSE);

       }

 복사 경로 찾기 - 구현

 // 파일 복사 DWORD CALLBACK buksa( )

DWORD CALLBACK buksa(LARGE_INTEGER TotalFileSize,
 LARGE_INTEGER TotalBytesTransferred,
 LARGE_INTEGER StreamSize,
 LARGE_INTEGER StreamBytesTransferred,
 DWORD dwStreamNumber,
 DWORD dwCallbackReason,
 HANDLE hSourceFile,
 HANDLE hDestinationFile,
 LPVOID lpData)
{
         CCProgressDlg* pDlg = (CCProgressDlg*)lpData;

        

         int pos = PROGRESSVALUE( TotalBytesTransferred.QuadPart,
                      TotalBytesTransferred.QuadPart );

 

         // Pos 설정
         pDlg->m_progress.SetPos(pos);

 

         // 100 퍼센트 전송되지 않을 때
         if (pos < 100)
               return PROGRESS_CONTINUE;

        

         // 100 퍼센트 전송되었을 때
         MessageBox(NULL, _T("복사가 완료되었습니다. "), _T("확인"), MB_ICONINFORMATION + MB_OK);

 

         return PROGRESS_QUIET;

 이 부분 원형은 외우지 말 것 (파일 복사 Routine 때문에 구현)

 

   // 대상 파일 복사
  void CCProgressDlg::OnBnClickedButton3()
  {
         // 프로그래스 초기 설정
         m_progress.SetRange(0, 100);
         m_progress.SetPos(0);

       

         // 복사 진행
         CopyFileEx(m_original, m_copydir, buksa, this, NULL, COPY_FILE_FAIL_IF_EXISTS);
}

 대상 파일 복사

 

소스코드 : CProgress.zip

 

이번 글은 약간 어려울 수 있는데, 별거 없습니다.

특히나 DWORD CALLBACK buksa( ) 의 경우 WinBase.h 정의로 이동해서 그대로 가져다가 사용하면 저 원형 그대로 사용할 수 있습니다.

이번 글에서 의도한 것은 기본적인 부분은 프로그래스를 사용하실 수 있게 해드리는 것이고, 두 번째로 코드는 힘들게 외우지 말라는 것을

알려드리고 싶어서 아래의 자료와 함께 올려드렸습니다.

 

아래의 자료는 MSDN의 CopyFileEx와 CopyRoutine 원형의 설명이 담긴 자료입니다.

저 설명은 다 외우지 말고 여러분이 원하는 방법으로 변경할 때 참고하시면 됩니다.

 


5. 참고사항1) CopyFileEx

 


BOOL
WINAPI
CopyFileEx(
    _In_        LPCWSTR lpExistingFileName,
    _In_        LPCWSTR lpNewFileName,
    _In_opt_    LPPROGRESS_ROUTINE lpProgressRoutine,
    _In_opt_    LPVOID lpData,
    _When_(pbCancel != NULL, _Pre_satisfies_(*pbCancel == FALSE))
    _Inout_opt_ LPBOOL pbCancel,
    _In_        DWORD dwCopyFlags
);

 

 CopyFileEx 함수 원형

 

 

 파라메터

 설명

 lpExistingFileName

 원본 파일 지정

 lpNewFileName

 새로 복사할 위치 지정

 lpProgressRoutine

 파일 복사 콜백 함수(Routine 함수 지정)

 lpData

 부모 함수를 포인터로 전달할 것인지에 대한 판단

 (ex : this (자기 자신을 함수 포인터로 전달)

 dwCopyFlags

 복사 플래그 지정

 

* dwCopyFlags

 

dwCopyFlags [in]

Flags that specify how the file is to be copied. This parameter can be a combination of the following values.

 

Value Meaning
COPY_FILE_ALLOW_DECRYPTED_DESTINATION
0x00000008

An attempt to copy an encrypted file will succeed even if the destination copy cannot be encrypted.

COPY_FILE_COPY_SYMLINK
0x00000800

If the source file is a symbolic link, the destination file is also a symbolic link pointing to the same file that the source symbolic link is pointing to.

Windows Server 2003 and Windows XP:  This value is not supported.

COPY_FILE_FAIL_IF_EXISTS
0x00000001

The copy operation fails immediately if the target file already exists.

COPY_FILE_NO_BUFFERING
0x00001000

The copy operation is performed using unbuffered I/O, bypassing system I/O cache resources. Recommended for very large file transfers.

Windows Server 2003 and Windows XP:  This value is not supported.

COPY_FILE_OPEN_SOURCE_FOR_WRITE
0x00000004

The file is copied and the original file is opened for write access.

COPY_FILE_RESTARTABLE
0x00000002

Progress of the copy is tracked in the target file in case the copy fails. The failed copy can be restarted at a later time by specifying the same values for lpExistingFileName and lpNewFileName as those used in the call that failed. This can significantly slow down the copy operation as the new file may be flushed multiple times during the copy operation.

 

 


6. 참고사항2) CopyProgressRoutine

CopyProgressRoutine callback function

An application-defined callback function used with the CopyFileEx, MoveFileTransacted, and MoveFileWithProgress functions. It is called when a portion of a copy or move operation is completed. The LPPROGRESS_ROUTINE type defines a pointer to this callback function. CopyProgressRoutine is a placeholder for the application-defined function name.

Syntax

C++
DWORD CALLBACK CopyProgressRoutine(
  _In_      LARGE_INTEGER TotalFileSize,
  _In_      LARGE_INTEGER TotalBytesTransferred,
  _In_      LARGE_INTEGER StreamSize,
  _In_      LARGE_INTEGER StreamBytesTransferred,
  _In_      DWORD dwStreamNumber,
  _In_      DWORD dwCallbackReason,
  _In_      HANDLE hSourceFile,
  _In_      HANDLE hDestinationFile,
  _In_opt_  LPVOID lpData
);

typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(
    _In_      LARGE_INTEGER TotalFileSize,
    _In_      LARGE_INTEGER TotalBytesTransferred,
    _In_      LARGE_INTEGER StreamSize,
    _In_      LARGE_INTEGER StreamBytesTransferred,
    _In_      DWORD dwStreamNumber,
    _In_      DWORD dwCallbackReason,
    _In_      HANDLE hSourceFile,
    _In_      HANDLE hDestinationFile,
    _In_opt_  LPVOID lpData
);

Parameters

TotalFileSize [in]

The total size of the file, in bytes.

TotalBytesTransferred [in]

The total number of bytes transferred from the source file to the destination file since the copy operation began.

StreamSize [in]

The total size of the current file stream, in bytes.

StreamBytesTransferred [in]

The total number of bytes in the current stream that have been transferred from the source file to the destination file since the copy operation began.

dwStreamNumber [in]

A handle to the current stream. The first time CopyProgressRoutine is called, the stream number is 1.

dwCallbackReason [in]

The reason that CopyProgressRoutine was called. This parameter can be one of the following values.

 

Value Meaning
CALLBACK_CHUNK_FINISHED
0x00000000

Another part of the data file was copied.

CALLBACK_STREAM_SWITCH
0x00000001

Another stream was created and is about to be copied. This is the callback reason given when the callback routine is first invoked.

 

hSourceFile [in]

A handle to the source file.

hDestinationFile [in]

A handle to the destination file

lpData [in, optional]

Argument passed to CopyProgressRoutine by CopyFileEx, MoveFileTransacted, or MoveFileWithProgress.

Return value

The CopyProgressRoutine function should return one of the following values.

Return code/value Description
PROGRESS_CANCEL
1

Cancel the copy operation and delete the destination file.

PROGRESS_CONTINUE
0

Continue the copy operation.

PROGRESS_QUIET
3

Continue the copy operation, but stop invoking CopyProgressRoutine to report progress.

PROGRESS_STOP
2

Stop the copy operation. It can be restarted at a later time.

 

Remarks
An application can use this information to display a progress bar that shows the total number of bytes copied as a percent of the total file size.

Requirements

Minimum supported client

Windows XP [desktop apps only]

Minimum supported server

Windows Server 2003 [desktop apps only]

Header

WinBase.h (include Windows.h)

 


7. 참고자료(Reference) 

 

1. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspx, 접속일자 2015-03-31

2. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx, 접속일자 2015-03-31

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 공통 컨트롤의 이해?

 

드디어 공통 컨트롤까지 여러분께서는 오셨습니다.

정말 축하드립니다.

 

좀만 더 하시면 윈도우 프로그래밍의 기본기는 다 익히시는 겁니다.

 

아자 아자 화이팅!

 


1. 공통 컨트롤에 앞서 또 다시 살펴보는 MFC...

 

MFC에서는 윈도우에서 기본적으로 제공하는 기본 컨트롤들 이외에도 여러 응용 프로그램에서 공통적으로 빈번히 사용되는 컨트롤들을 모아서

공통 컨트롤(Common Control)이라는 것을 제공합니다.

 

공통 컨트롤은 아래와 같은 순서로 처리됩니다.

 

 


2. Visual Studio 2013에서 공통 컨트롤

 

보면 약간 허무하시겠지만, Visual Studio 2013에선 공통 컨트롤 개념을 분리한 게 아니라 대화상자 편집기라는 항목으로 일반 컨트롤과 함께 통합했습니다.

구 버전으로 개발해왔던 개발자들에게는 이들 개념은 엄밀히 말해 분리해서 생각하는 게 맞다는 사람도 있을 수 있으니 이 정도 선에서 알아두셨으면 합니다.

 

 


3. 컨트롤의 종류

 

거의 기능들을 일반 프로그램 사용하시면서 한 번쯤을 눌러보셨을 법한 것들입니다.

긴 설명 안하는 것 부분들은 여러분들의 컴퓨터 사용 센스로 추론하시기 바랍니다.

 

 

 컨트롤 명 

 설명

 

 (List Control)

 두 개 이상의 값을 갖는 데이터들을 표현하기 위해서

사용되는 컨트롤

 

(Spin Control)

 증감, 줄이기 이런 목적으로 사용됨.

 

 (Slider Control)

 
 

(IP Address Control<VS 2013>  = Network Address Control<VS 2008 기준>) 

 사용자로부터 IP주소를 입력받기 위해서 사용되는

 컨트롤  

 

(Progress Control)

 

 프로그래스 컨트롤은 진행 상태를 한 눈에 보여주는

 컨트롤입니다.

 

  (Tab Control)

 탭 컨트롤은 여러분들도 많이 일상 프로그램

 사용하면서 사용하셨겠지만,

 

 각각의 탭으로 분리해서 표현할 수 있습니다.

 

 (Month Calendar Control)

 

 월 단위로 출력

 종류는 4가지로 출력됩니다.

 

 궁금하시면,

 

 

 

 날짜 클릭해서 4가지 종류 다 체험해보시기 바랍니다.

 

 

 (Data Time Picker)

 

 날짜와 시간을 입력받기 위해서 사용하는 컨트롤

 

 (Tree Control)

 부모와 자식 그리고 형제 사이의 연결 관계를

 표시한 컨트롤 

 

 


3. 맺는글

 

이건 솔직히 어느정도 센스 생기면 "Google 검색" 또는 "Microsoft 공식 설명서"를 찾아보는 게 빠릅니다.

반응형
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] 윈도우 프로그래밍 기초 - 색상 대화상자 - 실습 2

이번 강의는 창 배경 색깔을 조작하는 법에 대해서 실습하겠습니다.

 

이해가 안되시는 분들은 이전 글 http://yyman.tistory.com/513 ([MFC] 윈도우 프로그래밍 기초 - 색상 대화상자 - 실습 1)을 학습하고 오신 후에 오셨으면 좋겠습니다.

 

Invalidate( ); 라는 명령어에 대해 소개하면, 화면을 갱신하는 데 사용하는 함수라고 보시면 되겠습니다.

 


1. 결과물

 

 

 

 

 

 

 

 


2. 실습 - 레이아웃 구성

 

 


3. 구현

 

(사용자 프로젝트명)Dlg.h 코드 추가

 

 // 구현입니다.
protected:
         HICON m_hIcon;
       COLORREF m_color;

         // 중략

 

(사용자 프로젝트 명)Dlg.cpp 코드 수정 - OnPaint() 함수

 

}
{
       CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
       CRect rect;
       GetClientRect(&rect);
 
       dc.FillSolidRect(rect, m_color);

 

(사용자 프로젝트 명)Dlg.cpp 코드 수정 - OnBnClickedButton1() 함수

 


void CColorDlgExDlg::OnBnClickedButton1()
{
         CColorDialog colorDlg;

         if (colorDlg.DoModal() == IDOK)
         {
                 m_color = colorDlg.GetColor(); 
                 Invalidate();

         }

}

 

코드는 백문이 불여일타 입니다.

-> 무조건 직접 쳐봐야 합니다.

반응형

+ Recent posts