가장 단순한 컨트롤, CStatic,은 static 텍스트를 보여준다. CStatic은 데이터 멤버를 가지고 있지 않고, 단지, 약간의 멤버 함수만을 갖고 있다. 생성자, Create 함수등이다. 이것은 유저 이벤트에 응답하지 않는다. 단순하기에, 윈도 컨트롤을 배우기 시작하기에 좋다.
이 튜토리얼에서는 어떻게 컨트롤들이 변형되고, 커스터마이징 되는 지를 이해하기 위해서,
CStatic클래스를 살펴볼 것이다. 다음 튜토리얼에서는 CButton과, CScrollBar클래스를, 이벤트 핸들링의 이해를 위해 살펴볼 것이다. 모든 컨트롤과, 클래스를 이해한다면, 완전한 어플리케이션을 만들 준비가 된 것이다. The Basics
MFC의
CStatic클 래스는 static 텍스트 메시지들을 유저에게 보여준다. 이 메시지들은 정보만을 전달할 수 있다.(예로, 에러 메시지 다이얼로그의 텍스트), 또는 다른 컨트롤들을 구별하게 하는 조그마한 레이블 같은 것으로 이용될 수 있다. 윈도 어플리케이션의 파일 열기 다이얼로그를 열어보면, 여섯 개의 텍스트 레이블을 볼 수 있을 것이다. 다섯 개의 레이블은 리스트와, 텍스트 영역, 그리고, 체크 박스등을 나타내고, 변하지 않는 것들이다. 여섯 번째의 레이블은 현재의 디렉토리를 보여주고, 현재의 디렉토리가 바뀔 때마다, 변하는 것이다. CStatic
객 체는 몇가지 다른 형태를 갖는다. 레이블의 스타일을 변경하여, 사각형으로 보일 수도 있고, 경계선으로 보일 수도 있고, 아이콘으로 보일 수도 있다. CStatic 클래스의 사각 프레임 형태를 이용하면, 관련있는 컨트롤들과 그렇지 않은 컨트롤들을 그룹으로 분류하여 보여줄 수 있다.
CStatic
객체는 항상 어떤 부모 윈도에 대한 차일드 윈도이다. 전형적으로, 부모 윈도는 어플리케이션이나, 다이얼로그 박스를 위한 메인 윈도이다. 튜토리얼 2에서 얘기한 것 처럼, 두 줄의 코드로, static 컨트롤을 만든다. CStatic *cs;
...
cs = new
CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50,80, 150, 150),this );
이 두 줄의 생성 스타일은 MFC로 생성되는 컨트롤들의 전형이다.
CStatic의 인스턴스를 위해, new를 호출하여, 메모리를 확보하고, 클래스의 생성자를 호출한다. 생성자는 클래스에 필요한 초기화를 한다. Create
함수는 윈도 레벨의 컨트롤을 생성하고, 스크린으로 보여준다. Create함수는 다섯 파라미터를 받는다. MFC의 헬프에 적혀있는 것 처럼 말이다. Visual C++의 Help메뉴의 Search옵션을 선택하고, Create를 넣어보라. 리스트에서CStatic::Create를 선택할 수 있다. 양자택일로, CStatic를 서치 박스에 입력해서, 그 오버뷰 페이지의 Members
버튼을 누르는 방법도 있겠다.
대개의 값들은 자신을 설명하고 있다.
lpszText파라미터는 레이블로 보여지는 텍스트를 명시하는 것이다. rect 파라미터는 위치와 사이즈, 텍스트의 모양을 조절한다. 부모 윈도 안에 보여질 때 말이다. 텍스트의 왼쪽 윗편 코너는 rect파라미터의 윈쪽 윗편 코너로 정의된다. 사각형은 rect 파라미터의 넓이와 높이를 통해서 정의된다. pParentWnd파라미터는 CStatic컨트롤의 부모를 가리킨다. 이 컨트롤은 부모 윈도에 나타날 것이고, 컨트롤의 위치는 부모의 클라이언트 영역의 왼쪽 윗편 코너와 관계가 있게 될 것이다.nID
파라미터는 API 함수에서 컨트롤 ID로서 사용되는 정수 값이다. 우리는 다음 튜토리얼에서 이 파라미터의 예제들을 보게 될 것이다. dwStyle
파라미터는 제일 중요한 파라미터이다. 컨트롤의 외형과 동작을 제어한다. 다음 섹션들에서 이 파라미터에 대해 자세하게 적을 것이다.
CStatic Styles
모든 컨트롤은 다양한 디스플레이 스타일을 갖는다. 스타일은,
Create함수에서 넘겨지는 dwStyle파라미터를 이용하여, 생성할 때 정의한다. CStatic컨트롤에서 유효한 상수들은 MFC 헬프에서 찾을 수 있고, (이전 섹션에서 얘기한 CStatic::Create함수를 위한 이 페이지를 찾아라. 그리고, 페이지 상단 근처에 있는 Static Control Styles링크를 클릭하라.) 아래에 대강 적어두었다.
Valid styles for the CStatic class-
Styles inherited from CWnd:WS_CHILD Mandatory for CStatic.
WS_VISIBLE The control should be visible to the user.
WS_DISABLED The control should reject user events.
WS_BORDER The control's text is framed by a border.
Styles native to CStatic:
SS_BLACKFRAME The control displays itself as a rectangular border. Color is the same as window frames.
SS_BLACKRECT The control displays itself as a filled rectangle. Color is the same as window frames.
SS_CENTER The text is center justified.
SS_GRAYFRAME The control displays itself as a rectangular border. Color is the same as the desktop.
SS_GRAYRECT The control displays itself as a filled rectangle. Color is the same as the desktop.
SS_ICON The control displays itself as an icon. The text string is used as the name of the icon in a resource file. The rect parameter controls only positioning.
SS_LEFT The text displayed is left justified. Extra text is word-wrapped.
SS_LEFTNOWORDWRAP The text is left justified, but extra text is clipped.
SS_NOPREFIX "&" characters in the text string indicate accelerator prefixes unless this attribute is used.
SS_RIGHT The text displayed is right justified. Extra text is word-wrapped.
SS_SIMPLE A single line of text is displayed left justified. Any CTLCOLOR messages must be ignored by the parent.
SS_USERITEM User-defined item.
SS_WHITEFRAME The control displays itself as a rectangular border. Color is the same as window backgrounds.
SS_WHITERECT The control displays itself as a filled rectangle. Color is the same as window backgrounds.
이 상수들은 두 개의 다른 뿌리로부터 왔다. "SS"(Static 스타일)상수는 단지 CStatic컨트롤에만 적용된다. "WS"(Window 스타일)상수는 모든 윈도에 적용되며, 그러므로, CStatic 이 그 동작을 상속 받은, CWnd객체에서 정의된다. CWnd::Create함수를 MFC 문서에서 찾으면 된다. 위의 네 가지만이 CStatic객체에 적용되는 것들이다.
CStatic객 체는 항상 최소한의 두 가지 스타일 상수를 가질 것이다. WS_CHILD 와 WS_VISIBLE 이 그것이다. 컨트롤은 다른 윈도의 차일드가 아니면, 생성되지 않는다. 그리고, WS_VISIBLE 로 설정되지 않으면, 보이지도 않는다. WS_DIABLED 는 레이블의 이벤트로의 응답을 제어한다. 레이블이 키입력이나, 마우스 클릭과 같은 이벤트에 반응이 없기에, 여분이라 할 수 있다. 다른 스타일 속성들은 선택 사항이며, 레이블의 외형을 제어한다.
CStatic::Create함수로의 스타일 속성들을 조정하여, 스크린에 static 객체를 어떻게 나타낼 지를 결정한다. 다음 섹션에서 다룰, 스타일 속성을 이용하여, CStatic객체의 외형을 조정하는 것을 배우면, 스타일들에 대해 많이 이해할 수 있을 것이다.
CStatic Text Appearance아래에 보여진 코드는
CStatic객체의 동작을 이해하는 데에, 유용하다. 이것은 튜토리얼 2에서 본 것과 비슷하다. 그러나, CStatic객체의 생성 부분을 조금 변화시킨 것이다. 튜토리얼 1의 설명으로 돌아가서, 이 코드를 컴파일 해보라.
//static1.cpp #include <afxwin.h>
// Declare the application class class CTestApp : public CWinApp
{public: virtual BOOL InitInstance();
};
// Create an instance of the application class
CTestApp TestApp;
// Declare the main window class class CTestWindow : public CFrameWnd
{
CStatic* cs;public:
CTestWindow();
};
// The InitInstance function is called
// once when the application first executes
BOOL CTestApp::InitInstance()
{
m_pMainWnd = new CTestWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();return TRUE;
}
// The constructor for the window class
CTestWindow::CTestWindow()
{
CRect r;// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));// Get the size of the client rectangl e
GetClientRect(&r);
r.InflateRect(-20,-20);// Create a static label
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,this );
}
라인 수와 함께 아래에 반복된, 윈도 생성자를 위한 함수 안의, 코드이다.
CTestWindow::CTestWindow()
{
CRect r;// Create the window itself
1 Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));// Get the size of the client rectangl e
2 GetClientRect(&r);
3 r.InflateRect(-20,-20);// Create a static label
4 cs = new CStatic();
5 cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,this );
}
함수는 먼저 라인 1에서 윈도를 위해
CTestWindow::Create함수를 불러낸다. 이것은 CFrameWnd객체를 위한 Create함수이다. CTestWindow는 그 동작을 CFrameWnd로부터 상속받았기 때문이다. 라인 1의 코드는 윈도가 200 X 200 픽셀 사이즈를 가져야 하고, 윈도의 왼쪽 윗편이 스크린의 0,0에 초기 위치를 가져야 한다는 것을 말한다. rectDefault상수는 CRect파라미터를 대신할 수 있다. 원한다면 말이다. 라인 2에서 코드는 파라미터
&r을 넘기는, CTestWindow::GetClientRect를 호출한다. GetClientRect함수는 CWnd클래스로부터 상속된다. (MFC 문서내의 함수를 찾을 때, 사이드 바를 보라.) 이 변수 r은 CRect형이고, 함수의 초기 부분에서 로컬 변수로 선언되었다.
이 코드를 이해하려고 할 때, 두 가지 질문이 떠오른다.: 1)
GetClientRect함수가 뭘 하는가? 2) CRect변수는 무엇을 하는가? 문제 1과 시작해보도록 하자.CWnd::GetClientRect함수를 MFC 문서에서 찾을 때, 특정 윈도의 클라이언트 사각형 영역의 사이즈를 포함하는, CRect 구조체를 돌려준다는 것을 발견할 수 있을 것이다. 이 경우에는 &r을 말이다. 이 주소는 CRect의 위치를 가리킨다. CRect형은 MFC에서 정의된 클래스이다. MFC 문서에서 클래스를 찾아보면, 사각형을 조정하기 위한 30개가 넘는 멤버 함수와 연산자를 정의하고 있음을 알 수 있을 것이다. 우리의 경우, 윈도의 중앙에 "Hello World"를 위치시키고자 한다. 그러므로,
GetClientRect를 클라이언트 영역을 얻기 위해 사용한다. 라인 3에서 CRect::InflateRect를 호출한다. 대칭적으로 사각형의 사이즈를 증가시키거나 감소시키는 역할을 하는 함수 말이다.(CRect::DeflateRect도 보라.) 여기 우리는 모든 사이드의 20 픽셀씩을 감소시켰다. 그렇게 하지 않으면, 레이블을 둘러싼 보더가 윈도 프레임으로 혼합되어 버릴 것이다. 그리고, 우리는 그걸 볼 수 없을 것이다.실제 CStatic레이블은 라인 4와 5에서 생성된다. 스타일 속성들은, 레이블로 보여지는 단어들이, 중앙에 위치해야하고, 보더로 감싸져야하게, 기술되어 있다. 보더의 사이즈와 위치는 CRect파라미터 r에 의해서 정의된다.
스타일 속성을 이래저래 변형시켜서, CStatic 객체의 활용을 이해할 수 있을 것이다. 예로, 아래의 코드는 첫 번째 리스트에서의 CTestWindow 생성자 함수를 교체시킨 것을 포함하고 있다.
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
GetClientRect(&r);
r.InflateRect(-20,-20);
// Create a static label
cs = new CStatic();
cs->Create("Now is the time for all good men to \
come to the aid of their country",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,this );
} 위의 코드는 이전의 것과, 동일하다. 텍스트 스트링이 좀 길어진 것을 제외하고 말이다. 여기서 볼 수 있듯이, 코드를 실행해보면,
CStatic 객체는 고정된 사각형 영역 내에서 텍스트를 랩하고, 각각의 라인을 중앙에 위치시킨다.
만약에 고정된 사각형 영역이 모든 라인의 텍스트를 포함하기에 너무 작다면, 텍스트는 유효한 공간에 맞게 필요한 만큼 잘릴 것이다.
CStatic객체의 이런 기능은 사각형 영역의 사이즈를 줄이거나, 스트링의 길이를 늘려서, 확인해 볼 수 있다. 지금까지 우리가 본 모든 코드에서는, SS_CENTER 스타일이 텍스트를 중앙에 위치시키기 위해 사용되었다.
CStatic객 체는 왼쪽, 오른쪽으로의 정렬도 가능하게 한다. 왼쪽으로의 정렬은 SS_CENTER 속성 대신에, SS_LEFT 속성을 사용하면 된다. 오른쪽으로의 정렬은 왼쪽 보다는 오른쪽으로 단어들을 위치시킨다. 그리고, 이것은 SS_RIGHT 속성으로 가능하다.
다른 텍스트 속성도 유효하다. 워드 랩 기능을 해제하고, 종종, 컨트롤들을 설명하는 간단한 레이블로 사용된다. SS_LEFTNOWORDWRAP 스타일은 왼쪽 정렬을 시키고, 랩핑을 없앤다.
Rectangular Display Modes for CStatic
CStatic객 체는 두 개의 사각형 디스플레이 모드를 지원한다.: 속이 차있는 사각형과, 프레임 말이다. 주로 이 두 가지 스타일을 윈도 내에서 다른 컨트롤들을 그룹화하는데 사용할 것이다. 예를 들어, 몇몇의 연관이 있는 에디터 영역을 모아, 윈도에 검은 사각형 프레임을 넣을 것이다. 이런 사각형을 만들 때, 6가지 스타일을 선택할 수 있다.: SS_BLACKFRAME, SS_BLACKRECT, SS_GRAYFRAME, SS_GRAYRECT, SS_WHITEFRAME, SS_WHITERECT 이다. RECT 형은 속이 차있는 사각형이고, 반면에 FRAME은 보더이다. 색상 명은 약간 혼란스러울 수 있다. 예를 들면, SS_WHITERECT는 윈도 배경과 같은 색의 사각형을 보여준다. 이 색상이 기본 값으로 흰색을 사용한다고 해도, 유저는 제어판에서 색을 바꿀 수 있고, 사각형은 실제로 흰색이 아닐 수 있는 것이다. 어떤 머신에서는 말이다. 사각형과 프레임의 속성이 설정될 때,
CStatic의 텍스트 스트링은 무시된다. 빈 스트링이 넘겨지게 된다. 이전 코드에서 몇몇의 이런 스타일을 시도해보고, 결과를 관찰해 보라.
Fonts
CFont객체를 생성하여 CStatic객체의 폰트를 바꿀 수 있다. 그렇게 하는 것은, 어떻게 하나의 MFC 클래스가 다른 것과 함께, 컨트롤들의 동작을 변형해야 하는 몇몇 경우에 있어서, 동작할 수 있는지를 보여준다. MFC의CFont클래스는 특정한 윈도 폰트의 인스턴스 하나를 갖고 있다. 예를 들어, CFont클래스의 하나의 인스턴스는 18 포인트의 Times 폰트를 갖고 있을 것이다. 다른 것이 10 포인트의 Courier 폰트를 가지고 있을 동안 말이다. static 레이블에 의해 사용되는 이 폰트는, CStatic이 CWnd를 통해서 상속 받은 SetFont함수를 통해서 변형할 수 있다.
아래의 코드는 폰트를 동작하는 데 필요한 코드를 보여준다.
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));// Get the size of the client rectangle
GetClientRect(&r);
r.InflateRect(-20,-20);// Create a static label
cs = new CStatic();
cs->Create("Hello World",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,this );// Create a new 36 point Arial font
font = new CFont;
font->CreateFont(36,0,0,0,700,0,0,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
"arial");// Cause the label to use the new font
cs->SetFont(font);
} 보통 그렇듯이, 위의 코드는, 윈도와
CStatic객체를 생성하는 부분부터 시작한다. 다음, 코드는 CFont형의 객체를 생성한다. 폰트 변수는CTestWindow클래스의 데이터 멤버로서 선언되어야 한다. "CFont *font" 라인과 함께 말이다.CFont::CreateFont함 수는 15개의 파라미터를 가지고 있다. (MFC 헬프를 보라.) 하지만, 대부분의 경우, 단지 세 개만이 중요하다. 예를 들면, 36은 폰트 사이즈 포인트를 의미하고, 700은 폰트의 굵기를 의미한다. (400은 "보통", 700은 "굵게", 1부터 1000까지 사용 가능. FW_NORMAL와 FW_BOLD 상수는 그 같은 의미를 갖고 있다. FW 상수를 API 헬프에서 읽어보아라.) 그리고, "arial"은 사용되는 폰트의 이름이다. 윈도는 다섯 개의 트루 타입 폰트와 함께 유통된다.(Arial, Courier New, Symbol, Times New Roman, Wingdings) 그리고, 어떤 머신이라도 이 폰트들이 존재함을 알 수 있을 것이다. 만약 폰트의 이름을 시스템에서 알 수 없는 것으로 사용을 한다면,CFont클래스는 기본 폰트를 선택할 것이다. 이 튜토리얼에서 이용된 모든 예제에서 말이다.
CFont클래스에 대해서, 좀 더 많은 정보를 원한다면, MFC 문서를 보라. API 온라인 헬프 파일에 좋은 오버뷰가 있다. "Fonts and Text Overview"를 찾아라.
SetFont함수는 CWnd클래스로부터 나온다. 이 시점에서 하나의 의문을 가질 것이다. " CWnd의 어느 함수가CStatic 클래스에 적용되는지 어떻게 알지?" 경험에 의해 배워야 한다. 하루 30분씩, CWnd 안의 모든 함수를 읽어라. 많은 것을 얻을 뿐더러, 컨트롤들을 커스터마이징할 수 있는 많은 함수들을 찾을 수 있을 것이다. 다음 튜토리얼에서는 CWnd클래스의 다른 Set함수들을 볼 예정이다.
Conclusion
이 튜토리얼에서는 CStatic객체의 많은 활용을 보았다. CWnd로부터 파생된 Set함수들을 남겨놓은 상태이고, 튜토리얼 4에서 얘기할 것이다.
Looking up functions in the Microsoft Documentation
Visual C++ 5.x에서 잘 모르는 함수들을 찾는 것은 매우 쉽다. 모든 MFC,SDK,윈도 API,C.C++ 표준 라이브러리 함수들이 같은 헬프 시스템에 모여있다. 만약 함수가 어디서 정의되었는지, 또는 어떤 구문을 사용하는지, 확신이 서지 않을 때는, 헬프 메뉴의
Search옵션을 이용하라.
Compiling multiple executables
이 튜토리얼은 몇몇의 다른 예제 프로그램을 갖고 있다. 그것들을 컴파일하는데,두 개의 다른 방법이 있다. 첫 번째는 각각의 프로그램들을 각각의 디렉토리에 넣고, 각각을 위한 새 프로젝트를 만드는 것이다. 이 방법으로, 각각의 프로그램을 분리하여 컴파일하고, 동시에, 독립적으로 각각을 실행할 수 있다. 이 방법의 단점은 많은 양의 디스크 공간이 소모된다는 것이다.
두 번째 방법은 이 튜토리얼의 모든 실행 파일을 포함하는 새로운 디렉토리를 생성하는 것이다. 그 디렉토리에서 새로운 프로젝트 하나를 만들어라. 각각의 프로그램을 컴파일하기 위해서, 프로젝트를 수정할 수 있고, 그 소스 파일을 수정할 수 있다. 프로젝트를 재빌드할 때, 새로운 실행 파일은, 당신이 선택한 소스 파일을 반영할 것이다. 이 방법이 디스크 공간 낭비를 줄일 수 있고, 대개 추천하는 방법이다.
'NativeCode > mfc' 카테고리의 다른 글
Registry 값 읽어오기 (0) | 2010.03.18 |
---|---|
Registry 값 쓰기 (0) | 2010.03.18 |
Static Control Font 설정 (0) | 2010.03.18 |
SystemParametersInfo (0) | 2010.03.18 |
Timer Callback (0) | 2010.03.18 |