Visual C++ Programming Controls - Buttons

Slides:



Advertisements
Similar presentations
1/29 키보드로 직접 입력할 수 없는 다양한 기호와 한자를 입력하는 방법을 알아 보자. 또한 블록으로 영역을 설정하는 여러 가지 방법에 대해 살펴본 후 블록 으로 설정된 내용을 복사하여 붙여넣거나, 잘라내고 이동하는 방법에 대해서 도 알아보자. 02_ 문서의 입력과 편집.
Advertisements

1 11 장 MDI 와 멀티미디어. 2 MDI 단일 문서 인터페이스 (SDI, Single Document Interface)  윈도에 있는 메모장이나 워드 패드와 같이 단지 하나의 폼으 로 이루어져 있는 프로그램 다중 문서 인터페이스 (MDI, Multiple Document.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
컨트롤의 동작 원리를 이해한다. 표준 컨트롤의 다양한 속성과 통지 메시지를 이해한다.
제4장 대화상자.
New MapTool manual Kim Dong-Sung.
Image & Video processing
1. 신뢰할 수 있는 싸이트 등록 인터넷 익스플로러 실행 후 실행
코크파트너 설치 가이드 Window 7.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Visual C++ Programming Controls 3
윤 홍 란 다이알로그(대화상자) 윤 홍 란
10장 예외 Lab 10-1.
공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다..
Outlook Express 메일 백업 및 복원가이드
Visual C++ Programming Controls and CList
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Lesson 6. 형변환.
5장. 참조 타입.
마우스(Mouse) 다루기 컴퓨터응용 및 실습 I.
Visual C++ Programming Output and File
Visual C++ Programming Common Controls
대화상자 편집기의 사용법을 익힌다. 모드형 대화상자와 비 모드형 대화상자의 차이점을 이해하고 작성 방법을 익힌다.
Visual C++ Programming Output and File
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
Communication and Information Systems Lab. 황재철
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Visual C++ Programming Controls
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
10장. 예외처리.
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
홀인원2.0 설치 메뉴얼.
영상처리 실습 인공지능연구실.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
24장. 파일 입출력.
Lesson 2. 기본 데이터형.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
2 보안 1 도구 윈도우 XP > 온밀크 프로그램 설치 장애 (보안 설정) / 품목추가 깨질 때 장애증상
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
※ 편리한 사이버 연수원 사용을 위한 인터넷 최적화 안내 ※
객체기반 SW설계 팀활동지 4.
학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성. 학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성.
단축키 기능 1. 단축키 기능 설명 Alt + R 조회 S 저장 I 삽입 A 추가 D 삭제 P 출력 Q 닫기
Chapter 03 윈도 폼 컨트롤 1.
.Net Web Application 2007 컴퓨터공학실험(Ⅰ)
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
메뉴(Menu) 컴퓨터응용 및 실습 I.
구조체(struct)와 공용체(union)
06. 디바이스의 등록과 해제 김진홍
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Power Point 예제 디자인 적용 (서식) - (디자인적용) - (원하는 디자인 선택)
7 생성자 함수.
6 객체.
Chapter 11. 문서 인쇄 및 파일 형식.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
BoardGame 보드게임 따라가기.
Presentation transcript:

Visual C++ Programming Controls - Buttons Department of Digital Contents Sang Il Park

Review File I/O

Review 파일 입출력 방법 일반 파일 입출력 직렬화 CFile (파생) 클래스 Read(), Write() 등의 함수 이용 범용 저수준의 file I/O 직렬화 CArchive 클래스 << 또는 >> 연산자 이용 편리한 이용 사용용도의 제한

Review 핵심 입출력 연산 파일을 열거나 생성한다(Open). 파일 포인터의 위치에서 데이터를 읽는다(Read). 파일 포인터의 위치에 데이터를 쓴다(Write). 파일 포인터의 위치를 변경한다(Seek). 파일을 닫는다(Close).

Review CFile file; file.Open( filename, mode, error ); CFileException e; if(!file.Open("mytest.txt", CFile::modeReadWrite, &e)) e.ReportError();

Review 파일 접근/공유 모드 플래그 의미 CFile::modeCreate 파일을 무조건 생성한다. 같은 이름의 파일이 있다면 크기를 0으로 바꾼다. CFile::modeNoTruncate | 연산자를 이용하여 CFile::modeCreate 플래그와 더불어 사용하면 같은 이름의 파일이 있을 경우 크기를 0으로 바꾸지 않고 이 파일을 연다. CFile::modeRead 읽기 전용 모드으로 파일을 열거나 생성한다. CFile::modeReadWrite 읽기 및 쓰기 모드로 파일을 열거나 생성한다. CFile::modeWrite 쓰기 전용 모드로 파일을 열거나 생성한다. CFile::shareDenyNone 다른 프로세스에게 파일에 대한 읽기/쓰기를 허용한다. CFile::shareDenyRead 다른 프로세스에게 파일에 대한 읽기를 금지한다. CFile::shareDenyWrite 다른 프로세스에게 파일에 대한 쓰기를 금지한다. CFile::shareDenyExclusive 다른 프로세스에게 파일에 대한 읽기/쓰기를 금지한다.

Review void CFile::Write (const void* lpBuf, UINT nCount) ; CFile file(_T(“test.txt“), CFile::modeCreate|CFile::modeWrite); int a = 30; int b = 20; file.Write(&a, sizeof(a)); file.Write(&b, sizeof(b));

Review UINT CFile::Read (void* lpBuf, UINT nCount) ; CFile file; CFileException e; if(!file.Open(_T("test.txt“), CFile::modeRead, &e)) { e.ReportError(); return; }; int a,b; file.Read(&a, sizeof(a)); file.Read(&b, sizeof(b));

FILE I/O 직렬화 (serialize)

직렬화 기초 (1/8) 직렬화 영속적인 저장 매체에 객체의 내용을 저장하거나 읽어오는 과정 serialization is … (from Wikipedia) the process of saving an object onto a storage medium (such as a file, or a memory buffer) to transmit it across a network connection link in binary form. The series of bytes or the format can be used to re-create an object that is identical in its internal state to the original object (actually, a clone).”

직렬화 기초 (2/8) 데이터 읽기 - 일반 파일 입출력 CFile file; CFileException e; if(!file.Open("mytest.dat", CFile::modeReadWrite|CFile::modeCreate, &e)) { e.ReportError(); return } int a = 100; int b = 200; file.Write(&a, sizeof(a)); file.Write(&b, sizeof(b));

직렬화 기초 (3/8) 데이터 읽기 - 직렬화 CFile file; CFileException e; if(!file.Open("mytest.dat", CFile::modeReadWrite|CFile::modeCreate, &e)) { e.ReportError(); return; } int a = 100; int b = 200; CArchive ar (&file, CArchive::store); ar << a << b;

직렬화 기초 (4/8) 데이터 쓰기 - 일반 파일 입출력 CFile file; CFileException e; if(!file.Open("mytest.dat", CFile::modeRead, &e)) { e.ReportError(); return; } int a, b; file.Read(&a, sizeof(a)); file.Read(&b, sizeof(b)); TRACE("a = %d, b = %d\n", a, b);

직렬화 기초 (5/8) 데이터 쓰기 - 직렬화 CFile file; CFileException e; if(!file.Open("mytest.dat", CFile::modeRead, &e)) { e.ReportError(); return; } int a, b; CArchive ar (&file, CArchive::load); ar >> a >> b; TRACE("a = %d, b = %d\n", a, b);

직렬화 기초 (6/8) CArchive 클래스 생성자 pFile nMode nBufSize lpBuf CFile 객체의 주소 nMode CArchive::load 또는 CArchive::store nBufSize 내부에서 사용할 버퍼 크기 lpBuf 사용자 정의 버퍼의 주소 CArchive::CArchive (CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL) ;

직렬화 기초 (7/8) 직렬화 가능한 데이터 타입 구분 데이터 타입 기본형 BYTE, WORD, LONG, DWORD, float, double, int, short, char, wchar_t, unsigned, bool, ULONGLONG, LONGLONG 비 기본형 RECT, POINT, SIZE, CRect, CPoint, CSize, CString, CTime, CTimeSpan, COleVariant, COleCurrency, COleDateTime, COleDataTimeSpan

직렬화 기초 (8/8) 직렬화 원리 CArchive ar(...); ar << a << b; CFile 객체 디스크 파일 a, b

코딩연습 키를 입력 받아 글을 쓰는 프로그램 작성 마우스 왼 클릭: 내용을 “testString.dat” 로 저장

직렬화 클래스 구현 (1/5) 사용자 정의 클래스 class CMyData { public: CString m_str; COLORREF m_color; CMyData(CString &str, COLORREF &color) { m_str = str; m_color = color; } virtual ~CMyData(); };

직렬화 클래스 구현 (2/5) 직렬화  X void CYourDoc::SaveOrLoad(CArchive& ar) { if (ar.IsStoring()) ar << m_data; } else ar >> m_data;

직렬화 클래스 구현 (3/5) 사용자 정의 클래스 변경 // 클래스 선언부 class CMyData : public CObject ① { DECLARE_SERIAL(CMyData) ② public: CString m_str; COLORREF m_color; CMyData() { } ③ CMyData(CString &str, COLORREF &color) { m_str = str; m_color = color; } virtual ~CMyData(); void Serialize(CArchive& ar); ④ };

직렬화 클래스 구현 (4/5) 사용자 정의 클래스 변경 (cont'd) // 클래스 구현부 CMyData::~CMyData() { } IMPLEMENT_SERIAL(CMyData, CObject, 1) ⑤ void CMyData::Serialize (CArchive& ar) ⑥ CObject::Serialize(ar); if(ar.IsStoring()) ar << m_str << m_color; else ar >> m_str >> m_color;

직렬화 클래스 구현 (5/5) 직렬화  O void CYourDoc ::SaveOrLoad(CArchive& ar) { if (ar.IsStoring()) m_data.Serialize(ar); } else

Downside of Serialize 데이터를 불러올 때 항상 파일 전체를 읽는다 데이터를 저장할 때 항상 파일 전체를 기록한다 데이터 이외의 정보가 기록된다

Controls

개요 (1/4) 컨트롤 표준화된 형태와 특성을 가진 윈도우 사용자에게 입력을 받거나 정보를 보여줌

개요 (2/4) 컨트롤과 부모 윈도우 통지 메시지 (Notification Message) 컨트롤의 상태가 변화되었음을 알림 메모리 부족 등으로 인한 오류를 알림 컨트롤 메시지 (Control Message) 컨트롤의 상태를 알아내거나 변경 컨트롤 (자식 윈도우) 부모 윈도우 ① 통지 메시지 ② 컨트롤 메시지

개요 (3/4) MFC 컨트롤 클래스 컨트롤 MFC 클래스 컨트롤 버튼 버튼 컨트롤 CButton 정적 컨트롤 CStatic 편집 컨트롤 CEdit 리스트 박스 컨트롤 CListBox 콤보 박스 컨트롤 CComboBox 스크롤 바 컨트롤 CScrollBar

개요 (4/4) MFC 클래스 계층도 컨트롤도 윈도우다!

Button Control (1/8) Button Control 종류 Radio Button 그룹

버튼 컨트롤 (2/8) 컨트롤 생성 방법 ① 일반 윈도우에서 직접 만들기 ② 대화상자를 통해 만들기

버튼 컨트롤 (2/8) 컨트롤 생성 - 첫 번째 방법 코딩을 통해 직접 만들기 CButton m_button; // C++ 객체 생성 m_button.Create( "누르세요", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(100, 100, 200, 130), this, 101); // 푸시 버튼 생성

버튼 컨트롤 (3/8) CButton::Create() 함수 Caption - 캡션 문자열 Style - 일반 윈도우 스타일 + 버튼 컨트롤 스타일 rect - 컨트롤 크기와 위치 pParentWnd - 부모 윈도우 UINT nID - 컨트롤 ID (ex, 101, 102…) BOOL CButton::Create (Caption, Style, rect, pParentWindow, ID) ;

버튼 컨트롤 (4/8) 버튼 컨트롤 스타일 - 일부 버튼 컨트롤 스타일 의미 BS_PUSHBUTTON 푸시 버튼 BS_CHECKBOX 체크 박스 BS_AUTOCHECKBOX 자동 체크 박스:클릭하면 자동으로 체크 표시가 On/Off BS_3STATE 3상태 체크 박스 BS_AUTO3STATE 자동 3상태 체크 박스: 클릭하면 자동으로 체크 표시가 On/Grayed/Of BS_RADIOBUTTON 라디오 버튼 BS_AUTORADIOBUTTON 자동 라디오 버튼: 클릭하면 자동으로 선택과 선택 해제가 이뤄짐과 선택 해제가 이루어짐 BS_GROUPBOX 그룹 박스

버튼 컨트롤 (5/8) 버튼이 눌렸다면?  버튼이 눌렸다는 메시지 발생 통지 메시지 처리하기  메시지 핸들러 작성 메시지 맵에 메시지 추가 메시지 핸들러 함수구현 컨트롤 (자식 윈도우) 부모 윈도우 통지 메시지

버튼 컨트롤 (5/8) 1. Message Map에 추가 2. 핸들러 함수 추가 ON_BN_CLICKED( ID, 함수 이름) Ex) ON_BN_CLICKED( 101, OnButtonClicked) // 메시지맵 void CChildView::OnButtonClicked( ) // 메시지 핸들러 { MessageBox("버튼을 눌렀습니다."); }

버튼 컨트롤 (5/8) 버튼의 상태를 변경하고 (알고) 싶다면?  컨트롤 메시지활용 컨트롤(버튼)의 현재 상태를 변화 시킴 버튼의 상태를 변경하고 (알고) 싶다면?  컨트롤 메시지활용 컨트롤(버튼)의 현재 상태를 변화 시킴 컨트롤(버튼)에게 현재의 상태를 물어봄 컨트롤 (자식 윈도우) 부모 윈도우 컨트롤 메시지

버튼 컨트롤 (5/8) 컨트롤 메시지 보내기  멤버 함수 호출 버튼의 체크상태 변환 버튼의 체크상태 확인 m_button.SetCheck(BST_CHECKED); m_button.SetCheck(BST_UNCHECKED); if ( m_button.GetCheck() == BST_CHECKED ) AfxMessageBox(“버튼이 체크되었습니다”);

코딩연습 다음과 같은 다양한 버튼을 만들어 본다.

버튼 컨트롤 (6/8) 컨트롤 생성 - 두 번째 방법 대화상자 템플릿에 컨트롤 추가 컨트롤 변수 생성 대화상자가 생성될 때 컨트롤도 자동으로 생성 컨트롤 변수 생성 컨트롤 자체를 나타내는 변수(=컨트롤 변수)를 생성하고 이를 이용하여 컨트롤을 조작

코딩 연습 대화상자기반을 선택하여 프로젝트 생성 대화상자편집기를 사용하여 창을 디자인

버튼 컨트롤 (7/8) 컨트롤 변수 생성 해당 콘트롤의 마우스 오른 버튼 변수추가선택

버튼 컨트롤 (8/8) 컨트롤 변수 생성 (cont'd) // 헤더 파일 // 구현 파일 class CTestDlg::public CDiglog { ... CButton m_button; } // 구현 파일 void CTestDlg::DoDataExchange(CDataExchange* pDX) CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CExButtonView) DDX_Control(pDX, IDC_BUTTON1, m_button); //}}AFX_DATA_MAP

정적 컨트롤 (1/2) 정적 컨트롤 종류 텍스트 프레임(색으로 채워지지 않은 사각형), 사각형(색으로 채워진 사각형), 아이콘, 비트맵, 향상된 메타파일(Enhanced Metafile)

정적 컨트롤 (2/2) 통지 메시지 SS_NOTIFY 스타일을 설정하면 통지 메시지 발생 STN_CLICKED(클릭), STN_DBLCLK(더블 클릭), STN_DISABLE(비 활성화), STN_ENABLE(활성화)

편집 컨트롤 (1/6) 편집 컨트롤 종류 속성 대화상자

편집 컨트롤 (2/6) 편집 컨트롤 스타일 편집 컨트롤 스타일 의미 속성 대화상자의 항목 ES_AUTOHSCROLL 줄 끝에 도달하면 자동으로 수평 스크롤 Auto HScroll ES_AUTOVSCROLL 줄 끝에 도달하면 자동으로 수직 스크롤 Auto VScroll ES_CENTER 텍스트를 가운데 정렬 Align text: Centered ES_LEFT 텍스트를 왼쪽 정렬 Align text: Left ES_LOWERCASE 입력된 모든 문자를 소문자로 변환 Lowercase ES_MULTILINE 다중 라인 편집 컨트롤임을 나타냄 Multiline ES_NOHIDESEL 컨트롤이 키보드 포커스를 잃더라도 선택된 텍스트가 계속 반전된 상태로 남아있도록 함 No hide selection ES_NUMBER 숫자만 입력할 수 있다. Number

편집 컨트롤 (3/6) 편집 컨트롤 스타일 (cont'd) 편집 컨트롤 스타일 의미 속성 대화상자의 항목 ES_READONLY 텍스트를 읽기만 가능하다. Read-only ES_RIGHT 텍스트를 오른쪽 정렬한다. Align text: Right ES_UPPERCASE 입력된 모든 문자를 대문자로 변환한다. Uppercase ES_WANTRETURN 다중 라인 편집 컨트롤에만 사용할 수 있으며 이 스타일을 지정하지 않으면 대화상자에서 Enter 키를 이용한 줄바꿈이 되지 않는다. Ctrl+Enter 키를 이용하면 이 스타일과 무관하게 줄바꿈을 할 수 있다. Want return ES_OEMCONVERT 입력된 텍스트가 OEM 문자셋으로 변환되어 편집 컨트롤 내부에 저장 OEM convert ES_PASSWORD 단일 라인 편집 컨트롤에만 사용할 수 있으며 입력된 문자를 *로 표시 Password

편집 컨트롤 (4/6) 편집 컨트롤 통지 메시지 통지 메시지 의미 EN_CHANGE 사용자가 컨트롤의 내용을 변경하면 화면에 컨트롤을 다시 그리는데 그 후에 이 메시지가 발생한다. EN_ERRSPACE 메모리가 부족하다. EN_HSCROLL 사용자가 편집 컨트롤의 수평 스크롤 바를 클릭하였다. EN_KILLFOCUS 키보드 포커스를 잃었다. EN_MAXTEXT 더 이상 문자를 입력할 수 없다. CEdit::SetLimitText 함수로 문자 개수를 제한한 경우나 ES_AUTOHSCROLL, ES_AUTOVSCROLL 등의 스타일을 지정하지 않은 상태에서 줄 끝까지 입력한 경우에 발생한다. EN_SETFOCUS 키보드 포커스를 얻었다. EN_UPDATE 사용자가 컨트롤의 내용을 변경하면 화면에 컨트롤을 다시 그리는데 그 직전에 이 메시지가 발생한다. EN_VSCROLL 사용자가 편집 컨트롤의 수직 스크롤 바를 클릭하였다.

편집 컨트롤 (5/6) 텍스트를 변경하거나 입력된 텍스트를 알아내기 입력 가능한 문자열의 길이를 제한하기 각종 편집 작업 m_edit.SetWindowText("초기값입니다."); CString str; m_edit.GetWindowText(str); m_edit.SetLimitText(10); m_edit.Clear(); m_edit.Cut(); m_edit.Copy(); m_edit.Paste(); m_edit.Undo();

편집 컨트롤 (6/6) 텍스트 선택과 치환하기 ①을 실행하기 전 ①을 실행한 후 ②를 실행한 후 ① m_edit.SelSel(5, 7); ② m_edit.ReplaceSel("ABC");

리스트 박스 컨트롤 (1/8) 리스트 박스 컨트롤 종류 속성 대화상자 단일 선택 리스트 박스 다중 선택 리스트 박스

리스트 박스 컨트롤 (2/8) 리스트 박스 컨트롤 스타일 의미 리스트 박스 컨트롤 스타일 LBS_DISABLENOSCROLL LBS_EXTENDEDSEL LBS_HASSTRINGS LBS_MULTICOLUMN 표시할 항목의 개수가 적은 경우에도 수직 스크롤 바가 사라지지 않는다. SHIFT, CTRL 키와 마우스 클릭을 이용한 다중 선택이 가능하다. LBS_OWNERDRAW* 스타일을 지정하지 않을 경우의 디폴트 스타일이며 컨트롤이 문자열을 저장 및 관리한다. 여러 줄(Column)로 구성된 리스트 박스를 생성하며 항목이 많을 경우 수평 스크롤이 가능하다. 속성 대화상자 항목 Disable no scroll Selection: Extended Has strings Multi-column

리스트 박스 컨트롤 (3/8) 리스트 박스 컨트롤 스타일 (cont'd) 의미 리스트 박스 컨트롤 스타일 속성 대화상자 항목 LBS_MULTIPLESEL LBS_NODATA LBS_NOINTEGRALHEIGHT LBS_NOREDRAW 마우스 클릭을 이용한 다중 선택이 가능하다. 항목 데이터를 컨트롤이 아닌 부모 윈도우가 유지하며 필요할 때마다 부모 윈도우가 직접 그린다. 항목의 개수가 1000개 이상일 경우에 사용한다. 이 스타일을 지정하지 않으면 항목의 일부가 잘려서 보이지 않는 경우가 발생할 수 있다. 항목에 변화가 생기더라도 리스트 박스 컨트롤을 다시 그리지 않는다. Selection: Multiple 없음 No integral height No redraw

리스트 박스 컨트롤 (4/8) 리스트 박스 컨트롤 스타일 (cont'd) 의미 리스트 박스 컨트롤 스타일 속성 대화상자의 항목 LBS_NOSEL LBS_NOTIFY LBS_OWNERDRAWFIXED LBS_OWNERDRAWVARIABLE 항목을 선택할 수 없다. 사용자가 항목을 클릭하거나 더블 클릭하면 부모 윈도우에게 통지 메시지를 보낸다. 부모 윈도우가 리스트 박스 항목을 직접 그리되 항목의 높이가 일정한 경우이다. 부모 윈도우가 리스트 박스 항목을 직접 그리되 항목의 높이가 일정하지 않은 경우이다. Selection: None Notify Owner draw: Fixed Owner draw: Variable

리스트 박스 컨트롤 (5/8) 리스트 박스 컨트롤 스타일 (cont'd) 의미 리스트 박스 컨트롤 스타일 속성 대화상자의 항목 LBS_SORT LBS_STANDARD LBS_USETABSTOPS LBS_WANTKEYBOARDINPUT 항목이 문자열인 경우 정렬하여 표시한다. LBS_NOTIFY, LBS_SORT, WS_VSCROLL, WS_BORDER 네 가지 스타일의 조합이다. 이 스타일을 지정하면 항목 문자열에 포함된 탭 문자('\t')를 제대로 처리할 수 있다. 리스트 박스 컨트롤이 키보드 포커스를 가진 상태에서 사용자가 키를 누르면 부모 윈도우가 이를 감지하여 특별한 처리를 할 수 있다. Sort Notify, Sort, Border, Vertical scroll Use tabstops Want key input

리스트 박스 컨트롤 (6/8) 리스트 박스 컨트롤 통지 메시지 LBN_DBLCLK, LBN_SELCHANGE, LBN_SELCANCEL 통지 메시지는 LBS_NOTIFY 스타일을 설정해야 발생 통지 메시지 의미 LBN_DBLCLK 사용자가 항목을 더블 클릭하였다. LBN_SELCHANGE 사용자가 선택을 변경하였다. LBN_SELCANCEL 사용자가 선택을 취소하였다. LBN_SETFOCUS 키보드 포커스를 얻었다. LBN_KILLFOCUS 키보드 포커스를 잃었다. LBN_ERRSPACE 메모리가 부족하다.

리스트 박스 컨트롤 (7/8) 항목 추가와 삭제 항목 선택 m_list.AddString("사과"); m_list.DeleteString(3); // 단일 선택 리스트 박스 컨트롤인 경우 m_list.SetCurSel(2); // 다중 선택 리스트 박스 컨트롤인 경우 m_list.SetSel(2); m_list.SetSel(3, FALSE);

리스트 박스 컨트롤 (8/8) 선택된 항목 알아내기 // 단일 선택 리스트 박스 컨트롤인 경우 int nIndex = m_list.GetCurSel(); if(nIndex != LB_ERR){ CString str; m_list.GetText(nIndex, str); } // 다중 선택 리스트 박스 컨트롤인 경우 int nIndex = m_list.GetCaretIndex();

콤보 박스 컨트롤 (1/6) 콤보 박스 컨트롤 종류 편집 컨트롤 정적 컨트롤 리스트 박스 컨트롤 단순 스타일 드랍다운 스타일 드랍다운 리스트 스타일

콤보 박스 컨트롤 (2/6) 속성 대화상자

콤보 박스 컨트롤 (3/6) 콤보 박스 컨트롤 스타일 콤보 박스 컨트롤 스타일 의미 속성 대화상자의 항목 CBS_AUTOHSCROLL = ES_AUTOHSCROLL Auto HScroll CBS_DISABLENOSCROLL = LBS_DISABLENOSCROLL Disable no scroll CBS_DROPDOWN 드랍다운 스타일 Type: Dropdown CBS_DROPDOWNLIST 드랍다운 리스트 스타일 Type: Drop List CBS_HASSTRINGS = LBS_HASSTRINGS Has strings CBS_LOWERCASE = ES_LOWERCASE Lowercase CBS_NOINTEGRALHEIGHT = LBS_NOINTEGRALHEIGHT No integral height CBS_OEMCONVERT = ES_OEMCONVERT OEM convert CBS_OWNERDRAWFIXED = LBS_OWNERDRAWFIXED Owner draw: Fixed CBS_OWNERDRAWVARIABLE = LBS_OWNERDRAWVARIABLE Owner draw: Variable CBS_SIMPLE 단순 스타일 Type: Simple CBS_SORT = LBS_SORT Sort CBS_UPPERCASE = ES_UPPERCASE Uppercase

콤보 박스 컨트롤 (4/6) 콤보 박스 컨트롤 통지 메시지 통지 메시지 의미 CBN_CLOSEUP CBN_DBLCLK CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE CBN_ERRSPACE CBN_KILLFOCUS CBN_SELCHANGE CBN_SELENDCANCEL CBN_SELENDOK CBN_SETFOCUS 의미 리스트 박스가 닫혔다. 사용자가 항목을 더블 클릭하였다. 리스트 박스가 열리기 직전이다. = EN_EDITCHANGE = EN_EDITUPDATE 메모리가 부족하다. 키보드 포커스를 잃었다. = LBN_SELCHANGE = LBN_SELENDCANCEL 사용자가 항목을 선택하였다. 키보드 포커스를 얻었다. 스타일 단순 드랍다운 드랍다운 리스트   

콤보 박스 컨트롤 (5/6) 항목 추가와 삭제 선택된 항목 알아내기 m_combo.AddString("사과"); m_combo.DeleteString(3); int nIndex = m_combo.GetCursel(); if(nIndex != CB_ERR){ CString str; m_combo.GetLBText(nIndex, str); }

콤보 박스 컨트롤 (6/6) 입력 가능한 문자열의 길이 제한하기 각종 편집 작업 m_combo.LimitText(10); m_combo.Clear(); m_combo.Cut(); m_combo.Copy(); m_combo.Paste();

스크롤 바 컨트롤 (1/3) 스크롤 바 컨트롤 스크롤 바 코드 화면의 일정 영역을 스크롤하거나 정해진 범위의 값을 변경시키는 용도로 사용 스크롤 바 코드

스크롤 바 컨트롤 (2/3) WM_HSCROLL/WM_VSCROLL 메시지 핸들러 nSBCode nPos pScrollBar 스크롤 바 코드 nPos 스크롤 박스의 위치 스크롤 바 코드가 SB_THUMBPOSITION 또는 SB_THUMBTRACK인 경우에만 사용 pScrollBar 스크롤 바 컨트롤을 가리키는 포인터 void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

스크롤 바 컨트롤 (3/3) 주요 함수 멤버 함수 역할 SetScrollRange() 스크롤 박스 위치값의 최소값과 최대값을 설정한다. SetScrollPos() 스크롤 박스의 현재 위치를 설정한다. GetScrollPos() 스크롤 박스의 현재 위치를 얻는다.

고급 컨트롤 기법 서브 클래싱 메시지 반사 기존의 윈도우나 컨트롤의 형태 또는 동작 변경 스스로 통지 메시지를 처리하는 독립적인 컨트롤 클래스 제작 가능

서브 클래싱 (1/2) 서브 클래싱 윈도우(정확하게는 윈도우 프로시저)로 가는 메시지를 중간에서 붙잡아 처리하는 기법 메시지 종류에 따라, 처리한 후 원래의 윈도우 프로시저에게 전달해 주거나 전달하지 않을 수 있음 메시지 중간에서 처리 윈도우 프로시저

서브 클래싱 (2/2) 서브 클래싱 구현 순서 ① 기존의 클래스를 기반으로 새로운 윈도우나 컨트롤 클래스를 생성 ② 메시지 핸들러를 재정의하거나 새로운 메시지 핸들러 를 추가하여 정의 ③ CWnd::SubclassWindow() 또는 CWnd::SubclassDlgItem() 함수를 호출

메시지 반사 (1/2) 메시지 반사 부모 윈도우가 처리하지 않는 통지 메시지를 컨트롤 자신이 처리 부모 윈도우가 처리하지 않는 통지 메시지를 컨트롤 자신이 처리 부모 윈도우가 통지 메시지를 처리하지 않을 경우에만 컨트롤이 자신의 통지 메시지를 처리 가능 컨트롤 (자식 윈도우) 부모 윈도우 통지 메시지

메시지 반사 (2/2) 메시지 반사 구현 기존의 컨트롤 클래스로부터 새로운 클래스를 만들고 자신의 통지 메시지를 처리하도록 함수를 추가 새로 만든 클래스를 이용하여 컨트롤 생성