Prof-UIS (UI library) 사용하기

VS2008의 경우 최신 UI 라이브러리를 제공해 주기 때문에 그다지 필요성이 없지만 아직도 VC++ 6.0으로 개발을 해야 하는
상황에서는 외부 라이브러리를 가져다가 사용하는게 한결 수월할 것이다.

Prof-UIS(www.prof-uis.com)는 상용 라이브러리지만 공개용으로도 일정 기능을 제공하기 있기 때문에 개인이 쓰기엔 괜찮은
라이브러리다.


< 압축을 해제 한 후의 폴더 모습 >



0. VS 환경 설정하기

< VC++ 6.0 기준 >

VC++ 6.0을 실행한 후 Tool - Options - Directories 를 다음과 같이 설정한다.

     - Include files : ../Prof-UIS/Include
     - Source files : ../Prof-UIS/Src
     - Library files : ../Prof-UIS/Bin_600



1. Prof-UIS 라이브러리 빌드하기

Prof-UIS를 DLL형태로 사용 하려면 ProfUISDLL 폴더안에 있는 ProfUISDLL_600.dsw 로 빌드를 하면 되고,
static library로 사용하려면 ProfUISLIB 폴더안에 있는 ProfUISLIB_600.dsw 로 빌드를 해주면 된다.

다양한 빌드 환경을 제공해 주므로 자신의 프로젝트에 맞는 빌드 환경을 선택한 후 Build(F7) 한다.(중요)
이렇게 빌드한 라이브러리는 ../Prof-UIS/Bin_600 폴더안에 생성된다.

만약 DLL 형태로 생성하였다면 해당 DLL 파일을 자신의 프로젝트 폴더로 복사해 줘야 한다. 프로젝트를 컴파일 할 때는 상관
없지만 컴파일 하고 바로 실행(Ctrl+F5)을 하려면 DLL 파일이 같은 폴더에 있어야 하기 때문이다.

자세한 빌드 환경에 대한 설명은 ../Prof-UIS/Help/ProfUIS285.chm 파일을 연 후
Articles - Prof-UIS Build Configurations을 참고한다.


2. 내 프로젝트에 Prof-UIS 라이브러리 추가하기

이제 라이브러리도 빌드하였으니 내 프로젝트에서 사용 가능하도록 라이브러리를 추가해 보자.
먼저 StdAfx.h 파일을 열고 다음을 추가 해 준다.

        #include <Prof-UIS.h>

내 프로젝트 폴더에 있는 res/Test.rc2 파일을 메모장으로 열고 다음 내용을 추가 한다.(프로젝트명이 Test라고 가정)

        #if ( !(defined _AFXDLL && !defined __STATPROFUIS_WITH_DLLMFC__) )
                #include <Resources/Resource.rc>
        #endif


3. Prof-UIS 라이브러리 사용하기

라이브러리를 사용하기 위한 모든 환경 설정이 끝났으므로 간단한 예제를 통하여 UI를 적용해 보자.

Dialog based Application

Step 1에서 라이브러리를 빌드 할때 빌드 환경을 Win32 Static MBCS Debug로 설정한 후 Build 한다.

그런 다음 Dialog based application 프로젝트를 하나 생성한다. 프로젝트명은 Test로 한다고 가정한다.

Project Settings(Alt+F7) 창에서 General - Mircosoft Foundation Classes 를 Use MFC in a Static Library로 설정한다.

Step 2에서 처럼 StdAfx.h 파일과 Test.rc2 파일을 수정한다.

CTestDlg는 기본적으로 CDialog를 상속받게 되어 있는 데 CExtResizableDialog라는 클래스에서 상속받도록 수정을 해줘야
한다. TestDlg.h 와 TestDlg.cpp 파일에서 CDialog 단어를 CExtResizableDialog로 바꿔준다. Replace(Ctrl+H) 기능을 이용
하면 편리하다.

< Replace 기능을 사용하여 부모 클래스를 바꿔치기 해주자 >


CTestApp::InitInstance() 함수에 아래 코드를 추가한다. 코드를 보면 알겠지만 이 후 다른 UI 테마를 적용하고 싶으면 주석을
해제해 주면 된다.

    g_PaintManager.InstallPaintManager(
        //RUNTIME_CLASS(CExtPaintManager)
        //RUNTIME_CLASS(CExtPaintManagerXP)
        //RUNTIME_CLASS(CExtPaintManagerOffice2003)
        //RUNTIME_CLASS(CExtPaintManagerOffice2003NoThemes)
        //RUNTIME_CLASS(CExtPaintManagerStudio2005)
        //RUNTIME_CLASS(CExtPaintManagerNativeXP)
        //RUNTIME_CLASS(CExtPaintManagerOffice2007_R1)
        RUNTIME_CLASS(CExtPaintManagerOffice2007_R2_LunaBlue)
        //RUNTIME_CLASS(CExtPaintManagerOffice2007_R2_Obsidian)
        );

어느 정도 작업이 끝났으니 컴파일 한 후 실행을 시켜 보자.

< 불완전하게 테마가 적용된 모습 >


실행하고 보니 결과물이 먼가 이상하다. 윈도우 타이블 부분도 그렇고 버튼도 그렇고 UI 테마가 전혀 적용이 되지 않았다.
좀 전에 CDialog를 CExtResizableDialog로 바꿔줬었는데 윈도우 타이틀까지 테마를 적용하려면 이를 다시 CExtNCW 템플릿으로
감싸줘야한다. 다시 Replace기능을 이용하여 CExtResizableDialogCExtNCW< CExtResizableDialog >로 바꿔준다.
TestDlg.h, TestDlg.cpp 모두 바꿔줘야 한다.

버튼의 경우 기본 코드에는 보이지 않지만 CButton 클래스를 사용하는데 이를 CExtButton으로 바꿔줘야 한다. 클래스위자드를
사용하여 각 버튼마다 컨트롤변수를 연결 해 준다.
다시 Replace 기능을 이용하여 CButton 단어를 CExtButton으로 바꿔준다.

Static Text 컨트롤 역시 CExtStatic 클래스와 연결 시켜 줘야 하는데 컨트롤의 이름이 IDC_STATIC으로 되어 있으면 클래스
위자드에 표시가 되지 않는다. Static Text 컨트롤 이름을 IDC_S1으로 바꿔준다.

< IDC_STATIC 이외의 이름으로 바꿔줘야만 클래스 위자드에 표시가 된다. >


클래스 위자드에서 IDC_S1에 대한 컨트롤 변수를 생성해 준 후에 CStatic 단어를 CExtLabel 로 바꿔주자.

지루한 편집 작업이 모두 끝났다. 실행을 시켜 보면 아래 그림과 같이 UI 테마가 적용된 모습을 확인 할 수 있다.

< Office2007_R2_LunaBlue 테마가 적용 된 모습 >


그 외 컨트롤러 들은 다음 표를 보고 적당한 클래스를 연결 시켜 주면 된다.

 Check Box controller CExtCheckBox
 Combo Box controller CExtComboBox
 Static Text controller CExtLabel
 Group Box controller CExtGroupBox
 List Box controller CExtListCtrl
 Radio Button controller CExtRadioButton
 Edit Box controller CExtEdit


4. 추가 정보

Prof-UIS의 국내 판매 대행을 이지플로우(http://www.easyflow.co.kr/)라는 곳에서 하고 있다. 이곳에 가면 몇가지 추가 정보를
얻을 수 있으며 궁금한 점을 질문하면 답변도 얻을 수 있다.

by 빛의탑 | 2009/07/31 22:08 | CS - 프로그래밍 | 트랙백 | 핑백(1) | 덧글(0)

HTK를 이용하여 음소 인식기 만들기

Phone_recognizer.zip
Helper.zip
htkbook.pdf

PBW DB를 이용하여 한국어 음소 인식기를 만드는 자료. 애증의 자료가 아닐 수 없다.
HTK book에 나온 것처럼 flat start 방법으로 초기 각 음소 모델의 값을 구하는 방법은 만들어 봤었는데 manual 하게 음소별로
잘라 놓은 자료로부터 모델의 값을 구하는 법은 딱히 조언을 구할 곳이 없어서 구글에서 구한 강의 자료 하나(lecture5.pdf)만
믿고 만들었었다.

by 빛의탑 | 2009/07/25 12:22 | 잡동사니 | 트랙백 | 덧글(0)

C++에서 추가된 점

1. 변수의 선언 위치가 자유롭다.

2. reference 가 도입되었다.

3. 입출력 방식이 향상되었다.(cin, cout)

4. side effect 있는 연산의 리턴 값은 reference 이다. 후위 연산은 value를 리턴한다.
    C에서는 error C2105: '++' needs l-value 에러가 발생한다. 즉 ++n 결과는 상수 1이 리턴되고 상수값을 증가시키는 연상이
    되기 때문이다. 후위증감일땐 두 언어 모두에서 작동하지 않는다.

5. 문법이 엄격해졌다. (prototype은 반드시 정의 해야 한다. type casting 문법이 엄격해 졌다.)

6. bool type이 추가되었다.

7. tag가 type이다.

8. enum 문법이 엄격해 졌다.

9. namespace 예약어가 추가되었다.

10. inline 함수가 추가되었다.(Optimization level을 조절해야 적용된다.)

11. 함수 overloading 지원(name mangling)
    C++에서는 함수이름이 같더라도 인자의 type과 수가 다르면 어셈블리어로 변환될때 함수이름들이 각각 다르게 변환된다.
    C에서는 단지 함수이름으로만으로 구분하므로, C에서도 호환되게 하려면 extern "C" 라고 선언해 줘야 한다.

12. default argument 지원

13. 함수형 초기화와 type casting이 가능하다.

14. new, delete 연산자가 추가되었다.

by 빛의탑 | 2009/05/26 22:31 | CS - 프로그래밍 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶