사용자 삽입 이미지















CTreeView와 CTreeCtrl의 Hierarchy Chart 입니다.

CTreeView 안에는 CTreeCtrl& GetTreeCtrl( ) const; 로선언된 클래스 멤버 함수가
있습니다. 결국 CTreeCtrl 클래스를 Document-View 구조에서 CTreeCtrl의 사용을 쉽게
해주는 클래스 입니다.

CTreeView 클래스를 사용하기 위해서는
#include <afxcview.h>를 인클루드 해야 합니다.
posted by 뚱2

Visual C++ 6.0 에서 .dsw 파일을 오픈하는데 발생했습니다.

실제 프로젝트에 영향이 있는것은 아니었는데

신경이 쓰여서 ^^ 암튼.... 대처방법은

저 메세지 창이 뜨면 살포시 클릭하고 모든 열여있는 문서를 닫고

워크스페이스도 종료합니다.

다시 .dsw 파일로 오픈하면 에러메세지가 없어집니다.


참고 http://support.microsoft.com/kb/q202817/

'C/C++ > VC++ / MFC' 카테고리의 다른 글

[MFC] HitTest()  (0) 2008.03.03
[MFC] CTreeView와 CTreeCtrl의 관계  (0) 2008.02.25
[MFC] PreCreateWindow()  (1) 2008.02.20
[VC++ 6.0] resource 파일 Load Failed 메세지  (0) 2008.02.20
상호 참조  (4) 2008.02.20
posted by 뚱2

[MFC] PreCreateWindow()

C/C++/VC++ / MFC 2008. 2. 20. 18:51


윈도우 생성 전에 미리 호출 되는 가상함수 입니다.
인자로 받는 CREATESTRUCT& cs 의 값을 수정해서
반영시킬수 있습니다.

ps. 다만 CDialog 에서는 수정이 안된다.

posted by 뚱2
지금도 초보 이지만 초보일때 겪었는데 .rc 파일을 오픈한 상태로 리소스 창에서
오픈할려면 'resource 파일 LoadFailed' 에러 메세지가 나타납니다.

CloseAll Window 라는 메뉴를 선택후에 다시 리소스 뷰를 확인해 보시면 됩니다.
posted by 뚱2

상호 참조

C/C++/VC++ / MFC 2008. 2. 20. 18:34
C++로 프로그래밍을 작성 하다 보면은 심심치 않게 상호참조가 일어납니다.

예) 1. A와 B라는 클래스가 있습니다.
    2. 각 파일은 분리컴파일을 위해서 A.h, A.cpp, B.h, B.cpp 이렇게 선언과 정의를 분리해 있습니다.
    3. 각 파일들은 모두 같은 폴더에 위치합니다.
//A.h
#include "B.h"
class A {
    A();
    ~A();
    B b;
};

//A.cpp
#include "A.h"
A::A() {
}
A::~A() {
}

//B.h
#include "A.h"
class B {
    B();
    ~B();
    A a;
};
//B.cpp
#include "B.h"
B::B() {
}
B::~B() {
}

위와 같이 하면은 상호 참조로 인하여 에라!!!!! 가 발생합니다.
이때 해결책은
//A.h
class B;
class A {
    A();
    ~A();
    B b;
};

//A.cpp
#include "A.h"
#include "B.h"
A::A() {
}
A::~A() {
}

//B.h
class A;
class B {
    B();
    ~B();
    A a;
};

//B.cpp
#include "B.h"
#include "A.h"
B::B() {
}
B::~B() {
}


위와 같이 해주시면 간단하게 해결됩니다.
posted by 뚱2

1>d:\_work.svn\_RgnLib.h(65) : warning C4996: 'strcpy'이(가) deprecated
로 선언되었습니다.
1>        C:\Program Files\Microsoft Visual Studio 8
\VC\include\string.h(73) : 'strcpy' 선언을 참조하십시오.
1>        메시지: 'This function or variable may be unsafe. Consider using
strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'



위 경고는 2005로 오면서, 인터넷 프로그램,일반 응용프로그램의 골격을 동일한 환경에서
동작시키게 하기 위해서 조정하다보니, 보안관련한 기능이 추가되어서 나오는 경고 메세지 라고 하는군요.

해결 방법은
1. Debug/Release 모드 전처리기 선언에 _CRT_SECURE_NO_DEPRECATE 를 추가
2. 코드 최 상단에
   #define _CRT_SECURE_NO_DEPRECATE
  또는
   #pragma warning(disable:4996) 입력해 주면 됩니다.

그렇지만 위에 방법은 경고를 보이지 않게 하는것이지 문제를 해결한 것은 아닙니다.

'C/C++ > VC++ / MFC' 카테고리의 다른 글

[VC++ 6.0] resource 파일 Load Failed 메세지  (0) 2008.02.20
상호 참조  (4) 2008.02.20
오버로딩과 오버라이딩의 차이  (0) 2008.02.20
#pragma comment  (0) 2008.02.20
#pragma once  (0) 2008.02.20
posted by 뚱2
1. 오버로딩(OverLoading)

오버로딩(중복정의)이라는 것은 하나의 클래스 내에서 같은 이름을 가지는 메서드가
여러개 정의되는 것을 말합니다.
물론 생성자 뿐만 아니라 다른 메서드들도 오버로딩이 가능합니다.
이것은 컴파일시 컴파일러에 의해 각 메서드들이 구별되며 여기서 기준은 인자가
됩니다.

* 메서드 오버로딩의 특징은 다음과 같습니다.
  - 동일 클래스에서 메서드 이름을 재사용 할 수 있다. (객체지향의 특성)
  - 접근제한자는 동일하거나 동일하지 않아도 된다.
  - 리턴타입도 동일하거나 동일하지 않아도 된다.
  - 메서드 이름은 반드시 동일해야 한다.
  - 메서드의 매개인자들은 순서, 개수, 타입이 반드시 달라야 한다.


2. 오버라이딩(OverRiding)

부모 클래스에서 구현한 메서드와 동일한 헤더를 갖는 메서드를 정의하여 대체하는
개념을 의미합니다.
한마디로 메서드 재정의라 할 수 있습니다.

* 메서드 오버라이드의 특징은 다음과 같습니다.
  - 접근제한자는 달라도 되지만 부모클래스의 접근범위보다 좁으면 안된다.
  - 리턴타입은 동일해야한다.
  - 메서드 이름도 동일해야한다.
  - 메서드 매개인자의 타입, 순서, 개수 모두 동일해야 한다.
  - throws 예외 클래스 선언시 선언을 오버라이드 하지 않거나, 부모 클래스에서
   선언한
예외 클래스보다 상위 클래스로 선언하면 안된다.

'C/C++ > VC++ / MFC' 카테고리의 다른 글

상호 참조  (4) 2008.02.20
[Visual Studio 2005] warning C4996: 'strcpy'이(가) deprecated로 선언되었습니다.  (0) 2008.02.20
#pragma comment  (0) 2008.02.20
#pragma once  (0) 2008.02.20
#pragma pack  (0) 2008.02.20
posted by 뚱2

#pragma comment

C/C++/VC++ / MFC 2008. 2. 20. 17:21

주로 링크를 걸때 많이 사용합니다.
형식은

#pragma comment("comment-type" [,, commentstring])

이고 comment-type에는 compiler, exestr, lib. linker, user 등이 올 수 있습니다.
Visual Studio 2005 에서는 '프로젝트 속성--> 링커 --> 입력 --> 추가 종속성' 에서
설정 할 수 있지만 다른 코드와 호완을 생각한다면 #pragma comment을 사용하는게
좋다고 생각합니다.
posted by 뚱2

#pragma once

C/C++/VC++ / MFC 2008. 2. 20. 17:21
A.h라는 헤더 파일이 있습니다.
이 파일 제일 상단에 '#pragma once'라고 표기해주면
컴파일이 한번만 됩니다.

다른 방법으로는
#ifndef __SAMPLE__H__
#    define __SAMPLE__H__

// 한번만 컴파일 할 코드 내용

#endif// #ifndef __SAMPLE__H__

해도 됩니다.
그렇지만은 한번에 하는 #pragma once가 낫겠지요 ^^

ps. #ifndef __SAMPLE__H__는 '__SAMPLE__H__'가 정의되지 않았다면 실행하라는 말입니다.
posted by 뚱2

#pragma pack

C/C++/VC++ / MFC 2008. 2. 20. 17:19
32bit 운영체제 일때

struct A
{
     BYTE  a;  // 1Byte
     WORD  b;  // 2Byte
     DWORD c;  // 4Byte
};
A test;


1+2+4 = 7 총 7Byte라고 생각하는데
실제  sizeof(test) 해보면 12Byte로 나옵니다.
이유는 운영체제가 32bit일때 4Byte에 최적화 되어 있어서
structure가 4Byte가 아니면 4Byte로 맞추는 경향이 있습니다.
이런걸 padding이라고 하는데
이럴대는 padding을 1Byte로 맞추면 됩니다.
방법은
#pragma pack(push, 1)
struct A
{
     BYTE  a;    // 1Byte
     WORD  b;    // 2Byte
     DWORD c;    // 4Byte
};
#pragram pack(pop)


이렇게 하고 다시 sizeof로 확인해 보면은 제대로 7Byte로 나타납니다.

ps. #pragma pack 컴파일러 명령은 구조체 단위로 멤버 정렬 방식을 설정할 때 사용합니다.
posted by 뚱2
Visual Studio 2005을 처음 사용하다 보면은 자주 나타나는 에러입니다.
2005 는 기본적으로 유니코드 입니다. 그래서 변환시 에러가 발생합니다.

방법은
1. (LPTSTR)(LPCTSTR)로 강제 형변환
2. CString str;
   str.GetBuffer(str.GetLength());
   해주시면 char *을 리턴합니다.

사용예
1번의 경우는 스트링을 읽는 목적으로만 사용할때 요긴합니다.
2번의 경우는 스트링을 수정해야 할때 사용하면 편합니다.


ps. 위 두가지 방법중에 2번을 추천합니다.
      그리고 GetBuffer를 사용하시면 ReleaseBuffer()를 사용해서 해제해 주셔야합니다.

'C/C++ > VC++ / MFC' 카테고리의 다른 글

[Visual Studio 2005] warning C4996: 'strcpy'이(가) deprecated로 선언되었습니다.  (0) 2008.02.20
오버로딩과 오버라이딩의 차이  (0) 2008.02.20
#pragma comment  (0) 2008.02.20
#pragma once  (0) 2008.02.20
#pragma pack  (0) 2008.02.20
posted by 뚱2