※요약
CString::Replace : 문자 또는 문자열을 교체한다.

※특징
문자나 문자열에 '\'가 있을 경우, '\'를 하나 더 붙여줘야 한다.
이유는 '\'는 Escape문자이기 때문이다.

※함수 원형 및 설명
int Replace( TCHAR chOld, TCHAR chNew );
//chOld : 교체될 문자
//chNew : 교체할 문자
//반환값 : 교체한 문자 또는 문자열의 수

int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
//lpszOld : NULL로 종결되는 교체될 문자
//lpszNew : NULL로 종결되는 교체할 문자
//반환값 : 교체한 문자 또는 문자열의 수

※예제

#include <atlstr.h>       //CString

#define print( str ) printf( "%s\n", str )

int main( )
{
	CString strText1;
	CString strText2;

	strText1 = "String";
	strText2 = "C⁄C++";

	print( strText1 );
	print( strText2 );

	strText1.Replace( "Str", "Play" );
	strText2.Replace( "C++", "Java" );

	print( strText1 );
	print( strText2 );

	return 0;
}


※결과







※요약
Compare : 대소문자를 구분하여 문자열을 비교한다.
CompareNoCase : 대소문자를 구분하지 않고 문자열을 비교한다.

※특징
operator ==, !=, <, >, <=, >= 도 대소문자를 구분하여 CString의 문자열을 비교할 수 있으며
C언어 함수 중 strcmp, strncmp, stricmp, strnicmp 등과 비슷하다.
또 한 비교는 아스키코드를 기준으로 비교하므로 아스키코드표를 참고하면 된다.

※함수 원형 및 설명
int Compare( LPCTSTR lpsz ) const;
int CompareNoCase( LPCTSTR lpsz ) const;
//lpsz : NULL로 종결되는 비교할 문자열
//반환값 : 문자열이 lpsz보다 작을 경우 -1
//         문자열이 lpsz와 같을 경우 0
//         문자열이 lpsz보다 큰 경우 1

※예제

#include <atlstr.h>       //CString

#define print( str ) printf( "%d\n", str )

int main( )
{
	CString strText1;
	CString strText2;
	CString strText3;

	strText1 = "ABC";

	//Compare - 대소문자 구분
	print( strText1.Compare( "ABC" ) );
	print( strText1.Compare( "abc" ) );
	print( strText1.Compare( "123" ) );

	//CompareNoCase - 대소문자 구분 안 함
	print( strText1.CompareNoCase( "ABC" ) );
	print( strText1.CompareNoCase( "abc" ) );

	return 0;
}


※결과

첫 번째는 ABC == ABC 이므로 0

두 번째는 ABC < abc이므로 -1

세 번째는 ABC > 123 이므로 1

네 번째, 다섯 번째는 대소문자를 구분하지 않음으로 둘 다 0






※요약
Empty : CString 개체의 문자열을 비운다.
IsEmpty : CString 개체가 갖고 있는 문자열이 비어있는지 조사한다.

※특징
Empty 함수는 CString 개체의 문자열을 비우며 내부적으로 할당된 메모리를 해제한다.

※함수 원형 및 설명
void Empty( );
BOOL IsEmpty( ) const;
//반환값 : 문자열이 비어있으면 TRUE, 비어 있지 않으면 FALSE를 반환

※예제
#include <atlstr.h>       //CString

#define print( str ) printf( "%s\n", str )

int main( )
{
	CString strText;

	strText = "abcd13579";
	print( strText );

	if( strText.IsEmpty( ) != TRUE )	//strText에 문자열이 있나 확인한다.
	{
		strText.Empty( );				//strText에 문자열이 있으면 지운다.
		print( strText );
	}

	return 0;
}


※결과




※MFC 계층도

16년 01월 25일 기준 최신 계층도이다.

출처 - MSDN

 

아래 그림은 CObject로부터 파생된 MFC 클래스들을 나타낸다.

 

아래 그림은 CWnd 및 CCmdTarget로부터 파생된 MFC 클래스들을 나타낸다.

아래 그림은 CObject로부터 파생되지 않은 MFC 클래스들을 나타낸다.

 

※MFC 프로그램 실행 요약

프로젝트 이름이 Temp라고 했을 때, 

각 추적점 및 TRACE를 추가하여 프로그램을 실행시킨 결과는 아래와 같다.

CTempApp::CTempApp()   ------ App 클래스 변수가 전역변수로 선언되어있으므로 제일 먼저 생성자가 호출된다

CTempApp::InitInstance()   ------ MFC 코드에 숨겨진 AfxWinMain함수에서 호출된다. (프로그램의 설정정보 로딩, 파라미터 처리등을 담당)

CTempDoc::CTempDoc(void)   ------ InitInstance()에 의해 Document 객체가 제일먼저 생성된다

CMainFrame::CMainFrame(void)

CMainFrame::LoadFrame()   ------ 윈도우가 생성된다

CMainFrame::PreCreateWindow()

CMainFrame::PreCreateWindow()

CMainFrame::OnCreate()   ------ CMainFrame객체가 생성 및 윈도우가 생성되며 자동으로 WM_CREATE 메시지가 발생하여 호출된다

CMainFrame::OnCreateClient()

CTempView::CTempView()   ------ OnCreateClient()에 의해 View 객체가 생성된다

CTempView::Create()

CTempView::PreCreateWindow()

CTempView::OnCreate()

CTempView::OnShowWindow()   ------ 여기까지 진행하여 클라이언트 뷰를 생성하여 화면에 보여진다

CMainFrame::OnCreateClient() - Return

CMainFrame::OnCreate() - Return   ------ 여기까지 해서 최종적으로 윈도우의 생성이 완료된다

CTempDoc::OnNewDocument()   ------ 새 문서를 만든다

CTempView::OnInitialUpdate()   ------ 새 문서를 만들거나 기존 문서를 열었다면 이 함수를 호출하여 화면 정리 및 적합한 내용을 화면에 표시한다

CMainFrame::OnActivateApp()

CMainFrame::OnActivate()   ------ 응용 프로그램의 최상위 윈도우가 화면에 표시 및 활성화된다

CMainFrame::OnShowWindow()

CTempView::GetDocument()

CTempApp::Run()   ------ 메시지 루프 돌입

------------------------------------------------------------------------------------ 여기까지가 실행 초기화

CMainFrame::OnClose()   ------ 윈도우를 닫았을 대 WM_CLOSE 메시지에 의해 호출

CMainFrame::OnShowWindow()

CMainFrame::OnActivate()

CMainFrame::OnActivateApp()

CMainFrame::DestroyWindow()   ------ OnClose()에 의해 호출된다

CMainFrame::OnDestroy()

CTempView::OnDestroy()   ------ 메인 프레임의 WM_DESTROY 메시지는 자식인 View 객체에도 전달된다

CTempView::PostNcDestroy()

CTempView::~CTempView()

CMainFrame::OnNcDestroy()

CMainFrame::PostNcDestroy()

CMainFrame::~CMainFrame()

CMainFrame::OnNcDestroy() - Return

CTempDoc::~CTempDoc()   ------ 모든 윈도우가 소멸되면 Document 객체도 소멸된다

CMainFrame::OnClose() - Return

CTempApp::ExitInstance()

CTempApp::Run() - Return


출처 - 쿨랜드



Win32 API 나 MFC에서 사용되는 가상 키 코드 ( VK_ ) 입니다.

출처는 마이크로소프트 MSDN입니다.


http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx



VK_LBUTTON
0x01
Left mouse button
VK_RBUTTON
0x02
Right mouse button
VK_CANCEL
0x03

Control-break processing

VK_MBUTTON
0x04

Middle mouse button (three-button mouse)

VK_XBUTTON1
0x05

X1 mouse button

VK_XBUTTON2
0x06

X2 mouse button

-
0x07

Undefined

VK_BACK
0x08

BACKSPACE key

VK_TAB
0x09

TAB key

-
0x0A-0B

Reserved

VK_CLEAR
0x0C

CLEAR key

VK_RETURN
0x0D

ENTER key

-
0x0E-0F

Undefined

VK_SHIFT
0x10

SHIFT key

VK_CONTROL
0x11

CTRL key

VK_MENU
0x12

ALT key

VK_PAUSE
0x13

PAUSE key

VK_CAPITAL
0x14
CAPS LOCK key
VK_KANA
0x15
IME Kana mode
VK_HANGUEL
0x15
IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL
0x15
IME Hangul mode
-
0x16
Undefined
VK_JUNJA
0x17
IME Junja mode
VK_FINAL
0x18
IME final mode
VK_HANJA
0x19
IME Hanja mode
VK_KANJI
0x19
IME Kanji mode
-
0x1A
Undefined
VK_ESCAPE
0x1B
ESC key
VK_CONVERT
0x1C
IME convert
VK_NONCONVERT
0x1D
IME nonconvert
VK_ACCEPT
0x1E
IME accept
VK_MODECHANGE
0x1F
IME mode change request
VK_SPACE
0x20
SPACEBAR
VK_PRIOR
0x21
PAGE UP key
VK_NEXT
0x22
PAGE DOWN key
VK_END
0x23
END key
VK_HOME
0x24
HOME key
VK_LEFT
0x25
LEFT ARROW key
VK_UP
0x26
UP ARROW key
VK_RIGHT
0x27
RIGHT ARROW key
VK_DOWN
0x28
DOWN ARROW key
VK_SELECT
0x29
SELECT key
VK_PRINT
0x2A
PRINT key
VK_EXECUTE
0x2B
EXECUTE key
VK_SNAPSHOT
0x2C
PRINT SCREEN key
VK_INSERT
0x2D
INS key
VK_DELETE
0x2E
DEL key
VK_HELP
0x2F
HELP key
0x300 key
0x311 key
0x322 key
0x333 key
0x344 key
0x355 key
0x366 key
0x377 key
0x388 key
0x399 key
-
0x3A-40
 
Undefined
 
0x41
 
A key
 
0x42
 
B key
 
0x43
 
C key
 
0x44
 
D key
 
0x45
 
E key
 
0x46
 
F key
 
0x47
 
G key
 
0x48
 
H key
 
0x49
 
I key
 
0x4A
 
J key
 
0x4B
 
K key
 
0x4C
 
L key
 
0x4D
 
M key
 
0x4E
 
N key
 
0x4F
 
O key
 
0x50
 
P key
 
0x51
 
Q key
 
0x52
 
R key
 
0x53
 
S key
 
0x54
 
T key
 
0x55
 
U key
 
0x56
 
V key
 
0x57
 
W key
 
0x58
 
X key
 
0x59
 
Y key
 
0x5A
 
Z key
 
VK_LWIN
0x5B
 
Left Windows key (Natural keyboard)
 
VK_RWIN
0x5C
 
Right Windows key (Natural keyboard)
 
VK_APPS
0x5D
 
Applications key (Natural keyboard)
 
-
0x5E
 
Reserved
 
VK_SLEEP
0x5F
 
Computer Sleep key
 
VK_NUMPAD0
0x60
 
Numeric keypad 0 key
 
VK_NUMPAD1
0x61
 
Numeric keypad 1 key
 
VK_NUMPAD2
0x62
 
Numeric keypad 2 key
 
VK_NUMPAD3
0x63
 
Numeric keypad 3 key
 
VK_NUMPAD4
0x64
 
Numeric keypad 4 key
 
VK_NUMPAD5
0x65
 
Numeric keypad 5 key
 
VK_NUMPAD6
0x66
 
Numeric keypad 6 key
 
VK_NUMPAD7
0x67
 
Numeric keypad 7 key
 
VK_NUMPAD8
0x68
 
Numeric keypad 8 key
 
VK_NUMPAD9
0x69
 
Numeric keypad 9 key
 
VK_MULTIPLY
0x6A
 
Multiply key
 
VK_ADD
0x6B
 
Add key
 
VK_SEPARATOR
0x6C
 
Separator key
 
VK_SUBTRACT
0x6D
 
Subtract key
 
VK_DECIMAL
0x6E
 
Decimal key
 
VK_DIVIDE
0x6F
 
Divide key
 
VK_F1
0x70
 
F1 key
 
VK_F2
0x71
 
F2 key
 
VK_F3
0x72
 
F3 key
 
VK_F4
0x73
 
F4 key
 
VK_F5
0x74
 
F5 key
 
VK_F6
0x75
 
F6 key
 
VK_F7
0x76
 
F7 key
 
VK_F8
0x77
 
F8 key
 
VK_F9
0x78
 
F9 key
 
VK_F10
0x79
 
F10 key
 
VK_F11
0x7A
 
F11 key
 
VK_F12
0x7B
 
F12 key
 
VK_F13
0x7C
 
F13 key
 
VK_F14
0x7D
 
F14 key
 
VK_F15
0x7E
 
F15 key
 
VK_F16
0x7F
 
F16 key
 
VK_F17
0x80
 
F17 key
 
VK_F18
0x81
 
F18 key
 
VK_F19
0x82
 
F19 key
 
VK_F20
0x83
 
F20 key
 
VK_F21
0x84
 
F21 key
 
VK_F22
0x85
 
F22 key
 
VK_F23
0x86
 
F23 key
 
VK_F24
0x87
 
F24 key
 
-
0x88-8F
 
Unassigned
 
VK_NUMLOCK
0x90
 
NUM LOCK key
 
VK_SCROLL
0x91
 
SCROLL LOCK key
 
0x92-96
 
OEM specific
 
-
0x97-9F
 
Unassigned
 
VK_LSHIFT
0xA0
 
Left SHIFT key
 
VK_RSHIFT
0xA1
 
Right SHIFT key
 
VK_LCONTROL
0xA2
 
Left CONTROL key
 
VK_RCONTROL
0xA3
 
Right CONTROL key
 
VK_LMENU
0xA4
 
Left MENU key
 
VK_RMENU
0xA5
 
Right MENU key
 
VK_BROWSER_BACK
0xA6
 
Browser Back key
 
VK_BROWSER_FORWARD
0xA7
 
Browser Forward key
 
VK_BROWSER_REFRESH
0xA8
 
Browser Refresh key
 
VK_BROWSER_STOP
0xA9
 
Browser Stop key
 
VK_BROWSER_SEARCH
0xAA
 
Browser Search key
 
VK_BROWSER_FAVORITES
0xAB
 
Browser Favorites key
 
VK_BROWSER_HOME
0xAC
 
Browser Start and Home key
 
VK_VOLUME_MUTE
0xAD
 
Volume Mute key
 
VK_VOLUME_DOWN
0xAE
 
Volume Down key
 
VK_VOLUME_UP
0xAF
 
Volume Up key
 
VK_MEDIA_NEXT_TRACK
0xB0
 
Next Track key
 
VK_MEDIA_PREV_TRACK
0xB1
 
Previous Track key
 
VK_MEDIA_STOP
0xB2
 
Stop Media key
 
VK_MEDIA_PLAY_PAUSE
0xB3
 
Play/Pause Media key
 
VK_LAUNCH_MAIL
0xB4
 
Start Mail key
 
VK_LAUNCH_MEDIA_SELECT
0xB5
 
Select Media key
 
VK_LAUNCH_APP1
0xB6
 
Start Application 1 key
 
VK_LAUNCH_APP2
0xB7
 
Start Application 2 key
 
-
0xB8-B9
 
Reserved
 
VK_OEM_1
0xBA
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the ';:' key
 
VK_OEM_PLUS
0xBB
 
For any country/region, the '+' key
 
VK_OEM_COMMA
0xBC
 
For any country/region, the ',' key
 
VK_OEM_MINUS
0xBD
 
For any country/region, the '-' key
 
VK_OEM_PERIOD
0xBE
 
For any country/region, the '.' key
 
VK_OEM_2
0xBF
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '/?' key
 
VK_OEM_3
0xC0
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '`~' key
 
-
0xC1-D7
 
Reserved
 
-
0xD8-DA
 
Unassigned
 
VK_OEM_4
0xDB
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '[' key
 
VK_OEM_5
0xDC
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '' key
 
VK_OEM_6
0xDD
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '] ' key
 
VK_OEM_7
0xDE
 
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the 'single-quote/double-quote' key
 
VK_OEM_8
0xDF
 
Used for miscellaneous characters; it can vary by keyboard.
 
-
0xE0
 
Reserved
 
0xE1
 
OEM specific
 
VK_OEM_102
0xE2
 
Either the angle bracket key or the backslash key on the RT 102-key keyboard
 
0xE3-E4
 
OEM specific
 
VK_PROCESSKEY
0xE5
 
IME PROCESS key
 
0xE6
 
OEM specific
 
VK_PACKET
0xE7
 
Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in  KEYBDINPUT  SendInput , WM_KEYDOWN , and  WM_KEYUP
 
-
0xE8
 
Unassigned
 
0xE9-F5
 
OEM specific
 
VK_ATTN
0xF6
 
Attn key
 
VK_CRSEL
0xF7
 
CrSel key
 
VK_EXSEL
0xF8
 
ExSel key
 
VK_EREOF
0xF9
 
Erase EOF key
 
VK_PLAY
0xFA
 
Play key
 
VK_ZOOM
0xFB
 
Zoom key
 
VK_NONAME
0xFC
 
Reserved
 
VK_PA1
0xFD
 
PA1 key
 
VK_OEM_CLEAR
0xFE
 
Clear key
 







CString 문자열 대문자나 소문자로 변환하는 함수 MakeUpper() 와 MakeLower() 에 대한 내용이다.


※요약

MakeUpper : 모든 문자열을 대문자로 변환한다.

MakeLower : 모든 문자열을 소문자로 변환한다.



※특징

C언어 중 strupr, strlwr 함수와 비슷하다.



※함수 원형 및 설명

void MakeUpper( );
void MakeLower( );



※예제

#include <atlstr.h>       //CString

#define print(str)	printf( "%s\n", str )

int main( )
{
	CString strText1 = "ABCDE";
	CString strText2 = "abcde";
	CString strText3 = "a1b2c3d4e";

	strText1.MakeLower( );
	print( strText1 );		//abcde

	strText2.MakeUpper( );
	print( strText2 );		//ABCDE

	strText3.MakeUpper( );
	print( strText3 );		//A1B2C3D4E

	return 0;
}







※요약

SpanIncluding : 필요한 문자들만 추출한다.

SpanExcluding : 필요없는 문자들을 걸러낸다.



※특징

SpanIncluding()는 필요한 문자들만 추출할 때 편리하며,

SpanExcluding()는 필요없는 문자들을 걸러낼 때 편리하다.



※함수 원형 및 설명

CString SpanIncluding( LPCTSTR lpszCharSet ) const;
//lpszCharSet : NULL로 종결되는 문자셋
//반환값 : 추출된 문자열을 포함하는 CString 개체.

CString SpanExcluding( LPCTSTR lpszCharSet ) const;
//lpszCharSet : NULL로 종결되는 문자셋
//반환값 : 추출된 문자열을 포함하는 CString 개체.



※예제

#include <atlstr.h>		//CString

#define print(str) printf( "%s \n", str )

int main( )
{
	CString strText = "age is 19 ~*^^*";
	CString spnstr;
	
	//소문자 a ~ z 그리고 공백 문자가 포함된 문자열까지 추출합니다.
	spnstr = strText.SpanIncluding( "abcdefghijklmnopqrstuvwxyz " );
	print( strText );
	print( spnstr );

	//"~!@#$%^&*()-=_+[]{},.<>/?;:'`" 를 포함하지 않는 문자열까지 추출합니다.
	spnstr = strText.SpanExcluding( "~!@#$%^&*()-=_+[]{},.<>/?;:'`" );
	print( strText );
	print( spnstr );

	return 0;
}




CString 문자셋 검색 함수 중 FindOneOf()에 관한 내용이다.


※요약

FindOneOf : CString 개체의 문자열에서 지정된 문자셋 중 일치하는 문자가 하나라도 있는지 검사한다.

C언어에서는 strspn, strcspn과 대응된다.



※특징

다시 한 번 강조하지만 문자열이 아닌 문자 단위로 검사하는 함수다.

예를 들어 FindOneOf( "abc" ) 라면, Find( "a" ), Find( "b" ), Find( "c" )를 차례로 수행한 것과 같다.



※함수 원형 및 설명

int FindOneOf( LPCTSTR lpszCharSet );
//lpszCharSet : 검색할 문자셋
//반환값 : 처음으로 일치되는 문자가 검색된 위치



※예제

#include <atlstr.h>		//CString

int main( )
{
	CString strTemp = "Sample 123 string";
	int nResult(0);

	nResult = strTemp.FindOneOf( "m1s2r3" );
	printf( "%d\n", nResult );	//2

	nResult = strTemp.FindOneOf( "x4c5v6" );
	printf( "%d\n", nResult );	//-1

	return 0;
}





CString 문자열 검색 관련 함수 중 Find(), ReverseFind()에 관한 내용이다.


※요약

Find : CString 개체의 문자열 기준, 좌측에서부터 문자 혹은 문자열을 검색

ReverseFind : CString 개체의 문자열 기준, 우측(역순)에서부터 문자를 검색



※특징

Find나 ReverseFind의 반환값은 0 ~ (문자열 길이 n-1)이다.

찾으려는 문자열이 없을 경우 -1을 리턴한다.



※함수 원형 및 설명

int Find( TCHAR ch ) const;
//ch : 검색할 단일 문자
//반환값 : 검색된 위치, 실패 시 -1

int Find( TCHAR ch, int nStart ) const;
//ch : 검색할 단일 문자
//nStart : 검색을 시작할 위치. 생략 시 디폴트 값 0
//반환값 : 검색된 위치, 실패 시 -1

int Find( LPCTSTR lpszSub ) const;
//lpszSub : NULL로 종결되는 검색할 문자열
//반환값 : 검색된 위치, 실패 시 -1

int Find( LPCTSTR lpszSub, int nStart ) const;
//lpszSub : NULL로 종결되는 검색할 문자열
//nStart : 검색을 시작할 위치. 생략 시 디폴트 값 0
//반환값 : 검색된 위치, 실패 시 -1

int ReverseFind( TCHAR ch ) const;
//ch : 검색할 단일 문자
//반환값 : 검색된 위치, 실패 시 -1

※예제

#include <atlstr.h>		//CString

int main( )
{
	int nIndex = 0;
	CString strDate( "2013-12-16" );

	nIndex = str.Find( '0' );
	printf( "%d\n", nIndex );

	nIndex = str.Find( '12' );
	printf( "%d\n", nIndex );

	nIndex = str.ReverseFind( '-' );
	printf( "%d\n", nIndex );

	return 0;
}






※요약

Left  : CString 개체의 문자열에서 왼쪽을 기준으로 문자열 추출

Mid : CString 개체의 문자열에서 지정한 중간 부분의 문자열 추출

Right : CString 개체의 문자열에서 오른쪽을 기준으로 문자열 추출



※함수 원형 및 설명

CString  Left( int nCount ) const;
//nCount : 왼쪽 기준 추출할 문자의 수
//반환값 : 추출된 문자열을 포함하는 CString 임시 개체

CString  Right( int nCount ) const;
//nCount : 오른쪽 기준 추출할 문자의 수
//반환값 : 추출된 문자열을 포함하는 CString 임시 개체

CString  Mid( int nFirst ) const;
CString  Mid( int nFirst, int nCount ) const;
//nFirst : 추출을 시작할 문자열의 위치
//nCount : 추출할 문자의 수
//반환값 : 추출된 문자열을 포함하는 CString 임시 개체



※예제

#include <atlstr.h>		//CString

int main( )
{
	CString strDate( "2013-12-16" );
	
	CString strYear;
	CString strMonth;
	CString strDay;

	strYear = strDate.Left( 4 );
	strMonth = strDate.Mid( 5, 2 );
	strDay = strDate.Right( 2 );
	
	printf( "%s년 %s월 %s일", strYear, strMonth, strDay );

	return 0;
}


+ Recent posts