커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
827
1,134
3,878
3,632,990
  현재접속자 : 50 (회원 0)






배너 신청 문의

 
작성일 : 06-10-24 21:52
ko 라이브러리
 글쓴이 : korone
조회 : 19,065  
   ko-20061024.tgz (42.0K) [41] DATE : 2006-10-24 21:52:50
ko 라이브러리를 공개합니다.

1. ko 라이브러리
ko 라이브러리는 SDL을 이용한 C++ GUI Framework 입니다.
SDL이 멀티플랫폼 라이브로서 윈도우, 리눅스, 임베디드 리눅스등에서 신뢰할만한
성능과 구현으로 인해 많이 사용되고 있습니다.
하지만 SDL의 경우 이식성을 위해 C언어로 기반으로 작성되어 실제 프로그램개발에 있어서
많은 어려움을 가지고 있습니다.
이에따라 C++기반의 ko 라이브러리를 제작하게 되었습니다.
물론, SDL을 기반으로 하는 많은 C++ GUI Framwork이 존재하지만(paragui등), ko 라이브러리의 제작의도는, 임베디드 리눅스 환경에서 작은 용량과 꼭 필요한 최소 기능만을 가지는 목표로 설정하였습니다.
기존 Qt나 paragui등은 임베디드 GUI요소에서는 필요없는 표준 Control이 많아서  오버헤드가 되지만, ko 라이브러리는 이러한 꼭 필요한 필수 요소만 고려하고 그외 나머지 부분은 직접 구현함을 원칙으로 하고 있습니다.

2. 주요기능
- Application Framework
- Frame rate 조절
- Widget, Button 등 GUI 요소
- 타이머
- signal/slot
- 기타(ini file 제어)

3. 라이센스
SDL의 라이센스인 LPGL을 그대로 따릅니다.

4. 설치
ko 라이브러리는 기본적으로 trolltech의 qmake를 기본적으로 이용합니다.
qmake는 복잡한 Makefile 작성을 손쉽게 해주며, 임베디드 Makefile 작성시에도
굉장히 편리합니다.
따라서 ko 라이브러리를 컴파일 하기 위해서는 반드시 qmake가 필요합니다.
qmake의 설치는 다음과 같습니다.

- debian, ubuntu 계열
$ sudo apt-get install qt3-dev-tools
- 소스코드 컴파일 : trolltech ftp site(ftp://ftp.trolltech.com/qt/source/)에서 qt-x11-free-3.x.x 이상 받아서 컴파일 하시면 bin 디렉토리에 qmake가 생성됩니다.)

ko라이브러리는 기본적으로 SDL라이브러리를 사용합니다.
따라서 시스템에 SDL라이브러리가 미리 설치되어 있어야 합니다.
설치방법 : http://lazyfooproductions.com/SDL_tutorials/lesson01/linux/cli/index.php

1) 소스코드 다운로드 및 압축해제
$ wget http://www.korone.net/ko/ko-20061024.tgz
$ tar xzf ko-20061024.tgz

2) 컴파일
$ cd ko
$ make

컴파일이 완료되면
lib 디렉토리밑에 libko.so.1.0.0 파일이 생성됩니다.

5. 예제
예제를 실행하기 위해서는 ko 라이브러리가 위치한 디렉토리를 LD_LIBRARY_PATH에 설저하여야 합니다.
만약 /home/korone/ko/lib 밑에 컴파일된 ko 라이브러리가 있다면
$ export LD_LIBRARY_PATH=/home/korone/ko/lib
만 설정해 주시면 됩니다.

ko 라이브러리의 기본예제는 ko/examples디렉토리내에 존재합니다.

1) hello, world
- 컴파일 및 실행
$ cd ko/examples/hello
$ make
$ ./hello

- 소스코드 리뷰
#include <KOApp.h>
#include <KOWidget.h>

class hello : public KOWidget
{
public:
    SDL_Surface* text;

public:
    hello() : KOWidget()
    {
        // 폰트설정, 시스템에 알맞는 폰트를 설정해 주면 됩니다.
        setFont( new KOFont("../../lib/fonts/lazy.ttf", 28) );

        // RGB(255,255,0)인 색상의 Hello, world글자를 생성합니다.
        text = font()->renderTextSolid("Hello, world", KORGB(255,255,0));
    }
    ~hello()
    {
        SDL_FreeSurface(text);
    }

protected:
    void paintEvent(SDL_Surface* s)
    {
        // RGB(0,0,255)색상의 배경색을 칠합니다.
        SDL_FillRect(s, NULL, SDL_MapRGB(s->format, 0, 0, 255));

        // X=10, Y=10 위체에 "Hello, world"글자를 출력합니다.
        SDL_Rect dstRect;
        dstRect.x = 10;
        dstRect.y = 10;
        SDL_BlitSurface(text, NULL, s, &dstRect);
    }
};

int main(int argc, char** argv)
{
    KOApp app;

    // 해상도를 200x500 16bpp로 설정합니다.
    app.setVideoMode(200, 50, 16);

    // hello 객체를 생성하고 mainWidget으로 설정합니다.
    hello h;
    app.setMainWidget(&h);

    // ko 라이브러리 메시지 루프를 실행합니다.
    return app.exec();
}

2) button
- 컴파일 및 실행
$ cd ko/examples/button
$ make
$ ./button

- 소스코드 리뷰
#include <KOApp.h>
#include <KOButton.h>

class myWidget : public KOWidget
{
private:
    int m_btnIdx;
    KOButton* m_btn1;
    KOButton* m_btn2;

public:
    myWidget(KOWidget* parent=NULL) : KOWidget(parent)
    {
        printf("myWidget::myWidget this:%X\n", this);
        m_btnIdx = 1;
       
        // "btn1_1.png"와 "btn1_2.png"그림이 hover되는 버튼을 생성
        m_btn1 = new KOButton(this);
       
        // m_btn1을 click했을때 호출되는 함수(mainWidget::btn1Clicked())
        m_btn1->sigClicked.connect(this, &myWidget::btn1Clicked);
        m_btn1->setGeometry(10, 10, 133, 34);
        m_btn1->setImage("./btn1_1.png", "./btn1_2.png", "");
        printf("myWidget::myWidget m_btn1:%X\n", m_btn1);

        m_btn2 = new KOButton(this);
        m_btn2->sigClicked.connect(this, &myWidget::btn2Clicked);
        m_btn2->setGeometry(10, 80, 133, 34);
        m_btn2->setImage("./btn2_1.png", "./btn2_2.png", "");
        printf("myWidget::myWidget m_btn2:%X\n", m_btn2);

        m_btn1->setFocus(true);

    }
    ~myWidget()
    {
    }

protected:
    void showEvent()
    {
        // 화면이 보여줄때 호출됨
        printf("myWidet::showEvent\n");
    }

    bool keyPressDownEvent(int key)
    {
        // 키가 눌렸을때 호출됨
        if (key == SDLK_LEFT || key == SDLK_UP)
        {
            if (m_btnIdx-1 < 0) m_btnIdx = 2;
            m_btnIdx--;
        }
        else if (key == SDLK_RIGHT || key == SDLK_DOWN)
        {
            if (m_btnIdx+1 > 2) m_btnIdx = 1;
            m_btnIdx++;
        }

        if (m_btnIdx==1) m_btn1->setFocus(true);
        if (m_btnIdx==2) m_btn2->setFocus(true);

        return true;
    }

    void mousePressDownEvent(int type, int x, int y)
    {
        // 마우스가 눌려졌을때 호출됨
        printf("myWidget::mousePressDownEvent type:%d x:%d y:%d\n", type, x, y);   
    }

    void mousePressUpEvent(int type, int x, int y)
    {
        // 마우스가 눌려졌다가 떨어질때 호출됨
        printf("myWidget::mousePressUpEvent type:%d x:%d y:%d\n", type, x, y);
    }

    void mouseMoveEvent(int x, int y)
    {
        // 마우스가 이동되었을때 호출됨
        //printf("myWidget::mouseMoveEvent x:%d y:%d\n", x, y);
    }

    void btn1Clicked()
    {
        // m_btn1을 click했을때 호출됨
        printf("myWidget::btn1Clicked\n");
    }

    void btn2Clicked()
    {
        // m_btn2을 click했을때 호출됨
        printf("myWidget::btn2Clicked\n");
    }

};

int main(int argc, char* argv[])
{
    KOApp app;

    app.setVideoMode(400, 300, 16);

    myWidget frm;
    app.setMainWidget(&frm);

    return app.exec();
}

3) timer
TODO: ...

4) ini
TODO: ...

이상입니다. 사용중 문의사항이나 버그가 발견되면 꼭 알려주세요.
감사합니다.

조병완 (korone @ gmail . com, http://www.korone.net)



아얌 06-10-25 10:50
 
잘 쓸게요...^^
FreeMan 07-04-29 22:35
 
저도 한번 구현해보고 싶은..
 
 
 


About korone.net | Copyright 2003 korone.net. All rights reserved.