1. DataBase Management System

: 데이터베이스를 관리하는 시스템

: CRUD(Create, Retrieve, Update, Delete) (생성, 검색, 수정, 삭제)

: 대량의 데이터를 처리하는 시스템

: 다양한 자료구조와 검색구조를 사용해 빠른 검색이 가능하다

* 정렬

: 빠른 검색을 위해서는 데이터가 반드시 정렬이 되어 있어야함.

: 정렬이 되어 있다면, 데이터를 빠른 시간안에 찾을 수 있음

: NlogN

: 퀵정렬/힙정렬 계열이 주로 사용됨

* 인덱스

: 인덱스 종류
    - 이진검색
    -B-Tree 계열
        - 사용 DBMS에서 가장 일반적으로 사용됨.

: 데이터를 추가/수정/삭제할 떄마다 정렬/인덱스 업데이트가 일어남.

* 이진탐색

: 데이터를 정렬후 'test'라는 단어를 검색하는 경우

: 한가운데 값을 찾고 좌측 또는 우측으로 다시 한가운데를 검색

: log_2의 N번으로 검색할 수 있게됨.

: 약 1000개의 데이터가 있을 때 10번만 찾으면 데이터를 찾을 수 있게됨.

: 데이터가 추가/삭제/변경될 때마다 한가운데 들의 값을 미리 계산해 둔다.

* B-트리

: 이진검색과 유사하지만, 한번에 비교를 2번한다.

: a<x<b 같은 방법으로 비교함.

: 이 기술은 R이 CUD보다 많다는 가정하에 사용되어짐.

* DBMS의 종류

: 계층형 데이터 베이스

: 네트워크형 데이터 베이스

: 관계형 데이터 베이스(RDBMS)

: 객체 지향 데이터 베이스

: 객체 관계형 데이터 베이스(ORDBMS)

: NoSQL(Not Only SQL)

2. RDBMS

* RDBMS란?

: 관계형 데이터베이스 시스템

: 테이블 기반의 DBMS

: 테이블-컬럼 형테의 데이터 저장 방식

: 테이블과 테이블간의 연관관계(주로 외래키의 형태)를 이용해 필요한 정보를 구하는 방식

: 모델링은 E-R(Entity Relationship)모델을 사용

: 테이블을 엔티티(기본)과 Relationship(유도)테이블로 구분하는 방식.

: 데이터를 테이블 단위로 관리

: 하나의 테이블은 여러개의 컬럼으로 구성됨

: 테이블끼리의 중복정보는 최소화 시킴

: 동일한 데이터가 중복되면 수정시 문제발생 확률이 높아짐

: 정규화 -> 정규형을 통해 해결한다.

: 사용방식

: 여러 테이블을 합쳐 큰 테이블을 생성

* 기본용어

: 스키마

: DB, 테이블 정의 내역

: SQL쿼리(SQL Query) Structured Query Language

: 관계형 DBMS를 사용하는 전용 질의 언어

: 대소문자 가리지 않음 / Interpreter 언어이다.

: 기본키(Primary Key:PK)

: 테이블에서 하나의 레코드를 지정할 수 있는 하나 이상의 컬럼집합

: 주민등록번호, SSN(Social Security Number) 같은 것들

: 외래키(Foreign Key:FK)

: 어떤 테이블의 기본키가 다른 테이블의 컬럼에 들어있을 경우

: 테이블(Table)

: 정보들의 묶음 단위

: 학교,학생, 교수 등등..

: 컬럼

: 테이블을 구성하는 정보들

: 학생테이블- 이름,주소,전화번호,나이,성별...

: 레코드(Record)

: 테이블에 들어있는 여러가지 인스턴스 하나하나를 지정

: 대학교의 학과 테이블

: 경영학과,미술학과, 수학과...

: 기본키로 구별가능

: 도메인 값(Domain Value)

: 각 컬럼에서 나올 수 있는 후보값

'프로그래밍 > RDBMS - MySQL' 카테고리의 다른 글

INDEX  (0) 2017.03.28
DCL(Data Control Language) 명령어  (0) 2017.03.27
DDL(Data Definition Language) 명령어  (0) 2017.03.27
SQL 기본 & DML(Data Manipulation Language) 명령어 모음  (0) 2017.03.27
3. SQL  (0) 2017.03.24

 프로그래밍을 하다보면, 채워넣어야할 내용이 아직 없는데 필요한 경우가 있습니다. 그럴 경우에는 Lorem 을 이용해 보세요~!

Lorem 이라는 사이트에서 

아래는 5 문단을 만들어본 결과 입니다.



※ 모든 예제는 여기 에서 진행됩니다.

※ Coffee Script 언어 설명은 여기서 확인할 수 있습니다.

※ Framer 의 클래스, 객체, 변수, 함수에 대한 설명은 여기서 확인할 수 있습니다.

1. 본론 - Switch


0. Switch 문 - Switch

: Switch 문은 여러개의 선택지가 있을때 사용합니다.

위와 같은 사용법 말고 다른 사용법도 있지만, 일단 이정도만 알아도 됩니다.

0. Switch 문 - 예제

switch_exam.txt

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
bg = new BackgroundLayer
bg.backgroundColor = "gray"
 
tap = new Layer
    width : Screen.width
    height : 80
    backgroundColor : "#2196F3"
    html : "Change Color Example"
    style : {"font-size" : "30px""font-weight" : "100""text-align" : "center","line-height":"#{tap.height}px"}
    
tapWidth = tap.width/4
tapHeight = 40
tapY = tap.height
 
tapRed = new Layer
    x: tapWidth*0
    y: tapY
    width : tapWidth
    backgroundColor : "Red"
    height : tapHeight
    html : "Red"
    style : {"font-size" : "20px""font-weight" : "100""text-align" : "center","line-height" : "#{tapHeight}px"}
    
tapYellow = new Layer
    x: tapWidth*1
    y: tapY
    width : tapWidth
    backgroundColor : "Yellow"
    height : tapHeight
    html : "Yellow"
    style : {"font-size" : "20px""font-weight" : "100""text-align" : "center","line-height" : "#{tapHeight}px","color" : "black"}
 
tapGreen = new Layer
    x: tapWidth*2
    y: tapY
    width : tapWidth
    backgroundColor : "Green"
    height : tapHeight
    html : "Green"
    style : {"font-size" : "20px""font-weight" : "100""text-align" : "center","line-height" : "#{tapHeight}px"}
 
tapBlue = new Layer
    x: tapWidth*3
    y: tapY
    width : tapWidth
    backgroundColor : "Blue"
    height : tapHeight
    html : "Blue"
    style : {"font-size" : "20px""font-weight" : "100""text-align" : "center","line-height" : "#{tapHeight}px"}
    
tapRed.onTap ->
    changeColor "red"
tapYellow.onTap ->
    changeColor "yellow"
tapGreen.onTap ->
    changeColor "green"
tapBlue.onTap ->
    changeColor "blue"
    
changeColor = (x) -> 
    print x
    switch x
        when "red" then bg.backgroundColor = "red"
        when "yellow" then bg.backgroundColor = "yellow"
        when "green" then bg.backgroundColor = "green"
        when "blue" then bg.backgroundColor = "blue"
        else bg.backgroundColor = "gray"
    
cs
switch 예제 입니다. 웹환경에서는 잘 돌아가지 않으니, 프로그램으로 돌려보세요

탭이 눌렸을 때 탭에 해당하는 색으로 배경이 바뀌는 예제 입니다. 웹 환경의 Framer에서는 잘 돌아가지 않으니, 프로그램에서 돌려보세요~


※ 모든 예제는 여기 에서 진행됩니다.

※ Coffee Script 언어 설명은 여기서 확인할 수 있습니다.

※ Framer 의 클래스, 객체, 변수, 함수에 대한 설명은 여기서 확인할 수 있습니다.


0. 도입 - 조건문이란?


 조건문은 프로그래밍에서 굉장히 중요한데요, 조건문이란 조건에 따라 참인지 거짓인지 말해주는 것을 말합니다.

 예를 들어 봅시다.

여왕 : 거울아, 거울아 내가 이쁘니 백설공주가 이쁘니?

거울 : (두뇌 풀가동!...)

거울 : FALSE입니다.

왕비 : 이 백설공주 나쁜 기지배...

 이처럼 거울이 조건문을 파악해서 그 결과를 알려주게 됩니다.

 지금은 단 하나의 조건만 판단하였지만, 프로그램을 짜다보면, 셀수없을정도로 많은 조건을 판단하게 됩니다. 

 그렇기 때문에 조건문은 기초이지만 굉장히 편리하며 꼭 알아두어야할 구문입니다.


1. 본론 - 조건문의 종류


 조건문의 종류는 크게 if ,문 switch문, while문 이 있습니다.

 각각의 구문은 사용하는 시기가 조금씩 다른데요, 그냥 하나만 알고 있어서 사용해도 되지만, 각각의 경우에 알맞게 쓴다면 불필요하게 드는 시간을 줄일수 있겠지요?

 꼭 각각의 상황에 맞게 사용하는 습관을 들이세요!

출력하기 - print

 일단 값을 출력해보려면 밑의 기본적인 문법을 아셔야 합니다. 

0. if 문 - 단순 if 문

: 단순히 하나의 조건문만 비교할 때 사용되어집니다.

  위의 그림에서 볼 수 있듯이, if문 다음에는 TRUE인지 FALSE인지 판단할 수 있는 조건문이 옵니다. 혹은, TRUE나 FALSE값이 직접 들어가도 괜찮습니다. 

 조건문을 만들때 사용되어지는 연산식은 다음과 같습니다.

 비교 연산자

내용 

예제 

결과 

a<b 

 a보다 b가 크면 true

1<3 

true 

a>b

a보다 b가 작으면 true 

1>3 

false 

a<=b 

b가 a보다 크거나 같으면 true 

1<=1 or 1<3 

true 

a>=b 

b가 a보다 작거나 같으면 true  

1>=1 3>=1 

true 

 a == b

a와 b가 같으면 true 

1==1 

true 

a!=b 

a와 b가 같지않으면 true 

1!=1 

false

0. if 문 - else if

: 여러개의 조건문을 "단계별로" 비교할 때 사용되어집니다.

0. if 문 - if - else

: 모든 조건이 성립하지 않을 때 else가 실행되어집니다. 조건에 속하지 않는 경우가 없도록, 즉 예외의 경우가 없도록 설정해주는 것입니다.

2. 적용 - Drag하여 불켜기


 Framer 공식 홈페이지의 Document를 확인해보면, Drag 라는 예제를 볼 수 있습니다.

  이를 실행시켜보면, 오른쪽박스가 드래그 가능해지고 움직이면, 드래그된 좌표를 볼 수 있습니다. 저는 layerA의 x값의 좌표를 출력해보았어요.

이를 응용해보면,


3. 결론


bg = new BackgroundLayer
backgroundColor: "yellow"
layerA = new Layer
opacity: 1
backgroundColor: "gray"
html : "꺼짐"
layerB = new Layer
width : layerA.width * 2
opacity: 1
backgroundColor: "white"
layerB.placeBehind(layerA)
layerA.draggable.constraints = layerB.frame
layerA.draggable.vertical = false
layerA.draggable.enabled = true
# Returns the offset (x, y), layer.draggable and the layer
layerA.on Events.Move, (offset, draggable, layer) ->
if layerA.x >layerA.width
bg.backgroundColor = "green"
layerA.html = "켜짐"
else if layerA.x <= 0
bg.backgroundColor = "yellow"
layerA.html = "꺼짐"
else
layerA.html = "중간"

간단하게 코드를 짜보았는데요, 잘 모르겠는 함수나, 변수는 Framer Doc을 확인하시기 바랍니다! 
결국 공부는 혼자 하는거니까요!

다음 시간에는 switch 구문을 확인해보겠습니다.

※ 모든 예제는 여기 에서 진행됩니다.

※ Coffee Script 언어 설명은 여기서 확인할 수 있습니다.

※ Framer 의 클래스, 객체, 변수, 함수에 대한 설명은 여기서 확인할 수 있습니다.


0. 도입 - 객체지향 vs 절차지향


 다소 틀린 점이 많더라도 이해해주세요!

 언어에는 크게 두가지 종류가 있다고 생각합니다. 

 객체 지향 언어와 절차 지향 언어이죠!

 우리가 배울 Coffee Script언어는 객체 지향 언어에 속하는데요, 

 예를 들어서 두가지 언어의 차이점을 알아볼께요

객체 지향

객체 지향 언어를 사용하는 프로그래머들 끼리 밥을 먹고 있었습니다. 그런데 친구 한명이 늦게 도착했습니다. 그래서 한명이

아주머니 여기 1인분이요

라고 외쳤습니다.


절차지향

절차 지향 언어를 사용하는 프로그래머들 끼리 밥을 먹고 있었습니다. 그런데 친구 한명이 늦게 도착했습니다. 그래서 한명이

아주머니 여기 숟가락하구요 젓가락하구요 컵하구요 물도좀 따라주시구요 고기도 더 가져다 주세요

라고 외쳤습니다.


1. 본문


 무슨 차이가 나는지 느껴지시나요? 대충 느낌만 가져가시면 됩니다.

 이처럼 객체 지향 프로그래머는 "1인분" 이라는 단어 안에 숟가락, 젓가락, 컵, 물, 고기, 물따라는 행위, 고기를 가져다 주는 행위, 세팅하는 행위... 등등 다양한 개념들을 포함시켰습니다. 

 여기서 객체 지향의 주요 개념들을 뽑아낼 수 있습니다.

- 1인분 ==> 클래스

- 숟가락     ==> 변수

- 젓가락     ==> 변수

- 컵           ==> 변수

- 고기        ==> 변수

- 세팅해주는 행위     ==> 함수

 위의 개념도를 보면 각각의 변수(숟가락, 젓가락...)와 함수(행위...)를 클래스(1인분)가 포함하고 있다는 것을 확인할 수 있습니다. 

 즉, Coffee Script를 사용하는 우리는 어떤 일을 하려고 할 때 1인분(클래스)를 호출하면, 1인분안에 있는 것들을 사용할 수 있다는 것입니다.


2. 적용 - CoffeeScript 적용


 그렇다면 Coffee Script에서는 어떻게 동작하는 지 알아볼까요?

 여기에 들어가서 왼쪽 입력창에 new Layer라고 입력을 해보세요.

 그러면 오른쪽 창에 네모 박스가 생긴것을 볼 수 있습니다.

 그럼 Layer가 Class라면 내부에는 많은 변수와 함수들이 있겠지요? 그것들을 한번 사용해보겠습니다.

위의 그림에서 Layer라는 클래스안에 있는 x, y, width, hegith, html 이라는 변수의 값을 수정함으로써, 오른쪽 박스를 변형시킨 것을 볼 수 있습니다.

 이처럼, 같은 클래스라도 안에 있는 변수를 어떻게 다르게 하느냐에 따라서 모양, 속성 들이 달라지게 됩니다.

 그리고, layer = new Layer처럼 Layer에 이름을 지어 줌으로써 나중에 불러와 쓸 수 있습니다. 이를 "객체" 라고 합니다. 

(프로그래밍에서 "=" 등호는 같다라는 뜻이 아니라, "넣는다 혹은 대입한다" 라는 뜻을 가집니다.) 


 그럼 이번에는 함수를 실행시켜볼까요?



3. 결론


 이번에는 객체지향 프로그래밍의 가장 중요한 클래스, 객체, 변수, 함수를 배웠습니다. 다음 시간에는 조건문에 대해서 배워보도록 하겠습니다.

밑줄 친 부분을 같은 버전대로 통일 시켜 줍니다. 위의 경우에는 23으로 통일 시켜 주었습니다.

안녕하세요! 요즘 자바스크립트가 필요한 것을 준비하고 있어서 Aptana Studio를 설치해보려고 합니다.

설치는 http://www.aptana.com/ 에서 진행하면 되는데요, 저는 설치 중간에 에러가 나타났습니다.

Failed to correctly acquire installer node js windows.msi file CRC error 라는 오류 메세지가 나타나면, 

node-v0.10.13-x86.msi

이걸 설치해주세요! 제 개발환경은 윈도우10 64비트 입니다. 잘되더라구요 ㅎㅎ 

모두 잘 깔아보시기 바랍니다~

일봉받아오기

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 되도 않는 데이터베이스 공부해보겠다고 설치다가 올리는 시간이 늦어졌네요... 분명 자체 HTS를 만들기 위해서는 DB를 구축하긴 해야할텐데, 어떻게 어디서부터 해야할지 모르겠어요 ㅜㅜ 혹시 아시는 분은 댓글로 남겨주세요 ㅎㅎ

  오늘은 일봉을 불러오는 법을 알아볼텐데요, 사실 전시간에 했던 주식 기본정보랑 방법은 거의 비슷해요. KOAstudio에서 나온 샘플처럼 하면 불러와집니다. 자 시작해볼까요!


  이번엔 탭을 추가했습니다. 탭 추가하는 방법은 전 시간에 나와있죠? 따라해보세요 ㅎㅎ


  첫번쨰 탭의 내부 모습입니다. 종목코드와, 기준일자를 받아와서 버튼을 누르면, 900일치의 일봉을 받아올꺼에요 


 우선, 첫번째 탭안에 있는 버튼에 위와 같은 코드를 작성해줍니다. GetDigItemText 함수는 EDIT_Control 에 넣은 사용자의 변수를 CString 자료형에 넣어주는 역할을 해줍니다. 그 이후의 함수들은 KOAStudioSA 에 있는 안내를 따라서 내용을 채워준거에요. 아래 참고 그림 추가해드립니다. 아, 그리고 CommRqData할때 중간에 0이 아니라 2인 이유는, 연속으로 주식 정보를 받기 위해서입니다. 일봉은 한번 불러올때 0~899까지 총 900일치 정보가 한번에 들어오는데, 만약 여기서 '2'로 설정하고 다시 불러온다면, 900~1799까지의 정보가 불러와지게 됩니다. 즉, 연속적으로 다음 데이터가 불러와진다는 것이지요! 하지만, 0이라면 다시 0~899정보가 불러와지겠죠?


  그다음에는 수신 이벤트가 발생하였을때, 처리해주는 코드를 작성해야겠지요? 예전에 주식기본정보를 요청했었던 그곳에 가서 위의 박스를 덧붙여 줍시다. 단, 여기서 out == 주식일봉차트조회 일때 발생하도록 조건문을 씌어주셔야되용~! 그리고, 안에 i를 0부터 899까지 증가시키는 이유는 우리가 불러오는 정보가 한번에 900일치이기 때문입니다. 더 적게 돌려도 상관은 없어요 ㅎㅎ


  이렇게 해서 위와 같은 프로그램이 만들어졌습니다. 삼성전자의 주식 정보가 일자별로 쭉 나오는걸 확인해볼 수 있네요.


이번에 생각나는건데, 거래량과 주식정보를 이용해서 단타를 할수있지 않을까요? 이번에 한번 시도해봐야겠어요. 그럼 모두들 화이팅 하세요!

----------------------------------------------------------------------------------------------------------------------------------------------------------------<요약>

- GetDigItemText 함수 사용법

- 연속적으로 일봉을 받아오는 법



MFC Tab 만들기

----------------------------------------------------------------------------------------------------------------------------------

MFC프로그램을 하다보면,

Tabcontrol을 만들어야 하는 경우가 생길 것이다.

그 탭컨트롤을 만드는 과정을 알아보자.

모든 프로그램은 Dialog based로 하는 것을 기준으로 한다.

 

우선 dialog based 프로젝트를 만든다.

다이어로그 베이스 프로젝트는 앞의 포스트에서 미리 설명을 하였다.

test라는 프로젝트 이름으로 만들었다.

만든 뒤에, TODO:…. 된 부분을 지우고,

그림에서 보듯 Toolbox에서 Tab Control을 드래그 해서 아래와 같이 화면에 붙여 넣어준다.

만약 Toolbox가 보이지 않는다면,

메뉴바의 view에서 toolbox를 찾을 수 있다.

 

 

이렇게 만들어진 Tab에 이름을 정해주자.

그림에서 보듯이 Add Variable을 클릭한다. (변수 추가)

새로 창이 뜨는데,

Access는 public, Variable type은 CTabCtrl인지를 확인하고,

Variable name에는 m_Tab이라고 적자. (대/소문자 구분을 하기 때문에 확실하게 적어야 된다.)

이제 Finish를 눌러주면 지금 만든 탭의 이름은 m_Tab가 된다.

 

이제는 프로그램 내용을 수정할 차례이다.

위의 그림처럼 CtestDlg.cpp 파일에서 OnInitDialog를 찾는다.

이 안의 내용을 수정할 것인데,

 

 

 

Code Snippet
  1. BOOL CtestDlg::OnInitDialog()
  2. {
  3.     CDialog::OnInitDialog();
  4.  
  5.     // Add "About..." menu item to system menu.
  6.  
  7.     // IDM_ABOUTBOX must be in the system command range.
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);
  10.  
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  12.     if (pSysMenu != NULL)
  13.     {
  14.         BOOL bNameValid;
  15.         CString strAboutMenu;
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  17.         ASSERT(bNameValid);
  18.         if (!strAboutMenu.IsEmpty())
  19.         {
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  22.         }
  23.     }
  24.  
  25.     // Set the icon for this dialog.  The framework does this automatically
  26.     //  when the application's main window is not a dialog
  27.     SetIcon(m_hIcon, TRUE);            // Set big icon
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon
  29.  
  30.     // TODO: Add extra initialization here
  31.  
  32.     CString    strOne = _T("First");
  33.     CString    strTwo = _T("Second");
  34.     CString    strThree = _T("Third");
  35.     m_Tab.InsertItem(1, strOne);
  36.     m_Tab.InsertItem(2, strTwo);
  37.     m_Tab.InsertItem(3, strThree);
  38.  
  39.     return TRUE;  // return TRUE  unless you set the focus to a control
  40. }

그 안의 내용에서 위와 같이 추가를 한다.

추가 된 내용은 32번째 줄에서 37번째 줄인데,

32 - 34번째 줄은 탭컨트롤에서 탭의 제목으로 들어갈 내용 들이다.

35 - 37번재 줄은 몇 번째 탭에 어떤 이름이 들어갈 지에 대한 내용으로,

35번째 줄을 보면 (1, strOne)으로 되어있는데, 1번째 탭에 strOne에 들어있는 내용을 넣는 다는 말이다.

여기서 strOne에는 First라는 내용이 들어 있기 때문에

1번째 탭은 First라는 이름으로 들어간다.

여기까지 수정을 하고, 빌드를 해보자.

예상한 대로 1번째 탭의 이름은 First이고 나머지도 예상 대로 됬다.

이제 각각의 탭에 내용을 넣어줄 차례이다.

 

 

 

지금부터 하는 과정은 뒤에서 그만이라는 말이 나올때까지의 부분을 3번 반복해준다.

(탭이 3개일 경우에 3번으로 탭의 수에 맞춰서 해주면 된다.)

위의 그림처럼 Resource View를 클릭을 해서 Resource view를 열어주자.

Resource View의 화면이다.

여기서 오른쪽 버튼을 눌러서, 다이어로그를 추가해주자.

그러면 Dialog1이라는 다이어로그가 추가가 된 것을 볼 수있다.

이 다이어로그는 아까의 탭안에 들어갈 내용들을 넣어줄 다이어로그이다.

따라서 우리가 한 것처럼 탭이 3개가 있으면 3개의 다이어로그를 만들어 주어야 한다.

위의 그림처럼 IDD_Dialog1을 클릭한 뒤

메뉴의 view에서 Properties Window를 클릭해서 프로퍼티 창을 열어준다.

이러한 창을 볼 수 있는데, 여기서 ID를 자신이 원하는 ID로 바꾸어준다.

이 ID는 지금 새로 만드는 다이어로그의 이름으로서 나중에 탭컨트롤에서 쓸 것이다.

기본으로는 IDD_Dialog1으로 되어있을 것이다.

이 화면은 ID를 이미 바꾸어 놓은 것이다.

이 ID는 자신이 원하는 것도 괜찮지만, 우선은 똑같이 IDD_First로 해준다.

그런 뒤에 화면의 다이어로그를 클릭해준다.

그러면 프로퍼티 창이 바뀌는 것을 볼 수 있는데,

여기서 Border를 None으로,

Style을 Child로 바꾸어준다.

그러면 이 다이어로그가 바뀌는 것을 볼 수 있다.

border를 none으로 바꿈으로서 경계가 다 없어졌고,

style을 child로 바꿈으로서 다이어로그 안에 들어갈 수 있게 되었다.

 

이제 이 다이어로그의 구분을 해주기 위해,

static text를 추가해주자.

역시 tabcontrol처럼 드래그하면 된다.

막 드래그 한 상태이면 위의 그림처럼 선택이 되어있을 것이다.

이 상태에서 프로퍼티 윈도우를 보면 내용을 수정할 수 있다.

여기서 Caption을 수정해주면된다.

First라고 수정을 해주면,

바뀐 것을 알 수 있다.

이제 이 다이어로그에 이름을 붙여줄 차례이다.

다이어로그에서 오른쪽 버튼을 눌러서 Add Class를 눌러주고,

뜨는 창에서

그림과 같이 Class name을 정해준다.

여기선 CFirst로 정해주었다.

그리고 Base class 가 CDialog인지를 확인하고 finish를 눌러준다.

위에서부터 지금까지의 과정(새로운 다이어로그를 만들고 이름을 붙여주는 과정)을

3번 반복한다.

물론 각각의 이름을 다르게 해주어야 한다.

여기선 두번째, 세번째 다이어로그의 이름을 CSecond, CThird라고 해주었다.

여기까지의 과정이 완료가 되었다면 이제부터가 시작이다.

 

testDlg.h파일을 열어서 다음과 같이 수정한다.

Code Snippet
  1.  
  2. // testDlg.h : header file
  3. //
  4.  
  5. #pragma once
  6. #include "afxcmn.h"
  7. #include "First.h"
  8. #include "Second.h"
  9. #include "Third.h"
  10.  
  11.  
  12. // CtestDlg dialog
  13. class CtestDlg : public CDialog
  14. {
  15. // Construction
  16. public:
  17.     CtestDlg(CWnd* pParent = NULL);    // standard constructor
  18.  
  19. // Dialog Data
  20.     enum { IDD = IDD_TEST_DIALOG };
  21.     CFirst        m_First;
  22.     CSecond        m_Second;
  23.     CThird        m_Third;
  24.     CWnd*        m_pwndShow;
  25.  
  26.     protected:
  27.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  28.  
  29.  
  30. // Implementation
  31. protected:
  32.     HICON m_hIcon;
  33.  
  34.     // Generated message map functions
  35.     virtual BOOL OnInitDialog();
  36.     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  37.     afx_msg void OnPaint();
  38.     afx_msg HCURSOR OnQueryDragIcon();
  39.     DECLARE_MESSAGE_MAP()
  40. public:
  41.     CTabCtrl m_Tab;
  42. };

위의 내용을 보면

7, 8, 9번째 줄에 방금 만든 헤더파일을 추가 시켜줬음을 알 수 있다.

또한, 21, 22, 23, 24번째 줄에도 내용이 추가 되었다.

각각의 다이어로그의 이름에 맞춰서 그 다이어로그를 제어할 수 있는 부분을 추가해주었다.

이제 다시 testDlg.cpp파일을 열어서

CtestDlg를 찾아서 아래와 같이 수정을 해준다.

5번째 줄만 수정을 해주었다.

Code Snippet
  1. CtestDlg::CtestDlg(CWnd* pParent /*=NULL*/)
  2.     : CDialog(CtestDlg::IDD, pParent)
  3. {
  4.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  5.     m_pwndShow = NULL;
  6. }

같은 파일(testDlg.cpp)에서

OnInitDialog에

Code Snippet
  1. // TODO: Add extra initialization here
  2.  
  3. CString    strOne = _T("First");
  4. CString    strTwo = _T("Second");
  5. CString    strThree = _T("Third");
  6. m_Tab.InsertItem(1, strOne);
  7. m_Tab.InsertItem(2, strTwo);
  8. m_Tab.InsertItem(3, strThree);
  9.  
  10. CRect Rect;
  11. m_Tab.GetClientRect(&Rect);
  12.  
  13. m_First.Create(IDD_First, &m_Tab);
  14. m_First.SetWindowPos(NULL, 5, 25,
  15.     Rect.Width() - 12, Rect.Height() - 33,
  16.     SWP_SHOWWINDOW | SWP_NOZORDER);
  17. m_pwndShow = &m_First;
  18.  
  19. m_Second.Create(IDD_Second, &m_Tab);
  20. m_Second.SetWindowPos(NULL, 5, 25,
  21.     Rect.Width() -12, Rect.Height() - 33,
  22.     SWP_NOZORDER);
  23.  
  24. m_Third.Create(IDD_Third, &m_Tab);
  25. m_Third.SetWindowPos(NULL, 5, 25,
  26.     Rect.Width() - 12, Rect.Height() - 33,
  27.     SWP_NOZORDER);
  28.  
  29. return TRUE;  // return TRUE  unless you set the focus to a control

아까 탭을 만들때 추가시켜준 부분 아래에 다음과 같이 추가를 해준다.

중요한 것은 16번째 줄의 내용은 한번만 추가해주는 것이다.

탭컨트롤을 만드는 것은 책에서 보고 따라한 것인데

아무생각없이 3번 복사했더니, 탭컨트롤이 똑바로 초기화가 안되어서

실행을 했을 때, 탭안의 내용이 바로 실행이 되어야 하는데,

다른 탭을 일일이 눌러주지 않으면 처음탭의 내용이 보이기만하고 실행이 안되는 경우가 생긴다.

 

다시 Resource view로 돌아와서,

그림에서 보이는 화면을 클릭해주고, (탭안을 클릭해야됨)

프로퍼티 창을 보면(위에 설명 해놨음)

이 화면에서 오른쪽의 번개마크를 누르면 아래와 같이 화면이 바뀌게 된다.

이 화면에서, 밑에서 두번째에 있는

TCN_SELCHANGE를 누르면 창이 뜨는데,

OnTcnSelchangeTab을 추가할 수 있게 된다.

추가를 하면 testDlg.cpp파일로 돌아오게 되는데,

Code Snippet
  1. void CtestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     *pResult = 0;
  5. }

이런 것이 생긴 것을 볼 수 있다.

 

Code Snippet
  1. void CtestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     if(m_pwndShow != NULL)
  5.     {
  6.         m_pwndShow->ShowWindow(SW_HIDE);
  7.         m_pwndShow = NULL;
  8.     }
  9.  
  10.     int nIndex = m_Tab.GetCurSel();
  11.     switch(nIndex)
  12.     {
  13.     case 0:
  14.         m_First.ShowWindow(SW_SHOW);
  15.         m_pwndShow = &m_First;
  16.         break;
  17.     case 1:
  18.         m_Second.ShowWindow(SW_SHOW);
  19.         m_pwndShow = &m_Second;
  20.         break;
  21.     case 2:
  22.         m_Third.ShowWindow(SW_SHOW);
  23.         m_pwndShow = &m_Third;
  24.         break;
  25.     }
  26.     *pResult = 0;
  27. }

위와 같이 수정을 해주면 탭컨트롤 추가가 끝이다.

이로서 완성이 되었다.

실행을 해보면,

위와 같이 잘 된 것을 볼 수 있다.^^


--------------------------------------------------------------------------------------------------------------------------------------------

<출처>

http://jaiyun.tistory.com/5 

버전처리 오류 해결하기

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 이번엔, 버전 처리 오류를 해결하는 방법을 알아 볼거에요. 그 과정은 가이드 북에 잘 나와 있는데요, 제가 느낌점을 좀더 추가해볼꼐요.


 위와 같이 버전처리 창이 뜰 경우, 처리 과정은 다음과 같습니다.

1. 현재 진행중인 프로젝트를 완전 종료해버린다.  (비주얼스튜디오)

2. KOA스튜디오를 킨다.

3. 로그인한다.

4. 위와 같은 버전처리 창이 뜨면, KOA 스튜디오를 종료하고, 확인을 누른다.

5. 성공적으로 해결 ㅎㅎ


모두들 성공하는 주식투자 하시기 바랄꼐요~


+ Recent posts