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






배너 신청 문의

 
작성일 : 04-12-17 11:44
메뉴구성 및 글자색 변경 참고 소스
 글쓴이 : 장진혁
조회 : 20,816  
   menu.c (0byte) [38] DATE : 0000-00-00 00:00:00

menu.c

#define MWINCLUDECOLORS
#include <stdio.h>
#include "nano-X.h"

#define WIDTH    240
#define HEIGHT    320

typedef struct
{
    int nitems;
    GR_COLOR titlecolor;
    struct
    {
        char           *txt;
        GR_COLOR color;
    }items[11];
} list_type;

const list_type sub_menu_1 = { //menu name
11, //title + menu count
LTBLUE, //title color
    {
        {"Menu Title", BLACK},
             {"1st Menu", MAGENTA},
         {"2nd Menu", RED},
         {"3rd Menu", GREEN},
         {"4th Menu", BROWN},
         {"5th Menu", BLACK},
         {"6th Menu", RED},
         {"7th Menu", LTGRAY},
         {"8th Menu", YELLOW},
         {"9th Menu", BLACK},
         {"10th Menu", LTBLUE},
    }
};   

list_type  *ui_list;
int ui_val=1; //current menu select value
int i;
int y_pos = 12;
char tmp[3];

GR_WINDOW_ID w;
GR_GC_ID gc;
GR_EVENT event;

void draw_menu();
void draw_select();

int main(int ac,char **av)
{
    if (GrOpen() < 0)
    {
        fprintf (stderr, "Can't open graphics\n");
        exit(1);
    }

    w = GrNewWindow(GR_ROOT_WINDOW_ID, 10, 10, WIDTH, HEIGHT, 0, BLACK, WHITE);
   
    gc = GrNewGC();
   
    GrSetGCUseBackground(gc, GR_TRUE);

    GrSelectEvents(w, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_KEY_DOWN );
    GrMapWindow(w);

    ui_list= (list_type *)&sub_menu_1;

    for (;;)
    {
        GrGetNextEvent(&event);

        switch (event.type)
        {

            case GR_EVENT_TYPE_EXPOSURE:
                fprintf (stderr, "\n GR_EVENT_TYPE_EXPOSURE");
                draw_menu();
                draw_select();
                break;
               
            case GR_EVENT_TYPE_CLOSE_REQ:
                fprintf (stderr, "\n GR_EVENT_TYPE_CLOSE_REQ");
                GrClose();
                exit(0);
                break;
               
            case GR_EVENT_TYPE_ERROR:
                fprintf (stderr, "\n GR_EVENT_TYPE_ERROR => %s",event.error.name);
                printf(nxErrorStrings[event.error.code],event.error.id);
                break;
           
            case GR_EVENT_TYPE_KEY_DOWN:
                {
                    switch(event.keystroke.ch)
                    {
                        case MWKEY_UP:
                            if(ui_val <= 1)
                                ui_val = ui_list->nitems - 1;
                            else
                                ui_val--;

                            break;

                        case MWKEY_DOWN:
                            if(ui_list->nitems - 1 > ui_val)
                                ui_val ++;
                            else
                                ui_val = 1;

                            break;   
                    }
                    draw_menu();
                    draw_select();
                }
                break;

           
        }
    }
}

void draw_menu()
{
    y_pos = 12;
    GrSetGCUseBackground(gc, GR_FALSE);
    GrSetGCForeground(gc, WHITE);
    GrFillRect(w,gc,0,0,240,320);

    GrSetGCForeground(gc, ui_list->titlecolor);
    GrFillRect(w,gc,0,0,240,20);

    GrSetGCForeground(gc, WHITE);
    GrText(w, gc, 70, y_pos, ui_list->items[0].txt, -1, MWTF_DBCS_EUCKR);
    GrRect(w,gc,0,0,240,y_pos+8);

    GrSetGCForeground(gc, BLACK);

    y_pos+=22;
   
    for(i=1;i<ui_list->nitems;i++)
    {
        GrSetGCForeground(gc, ui_list->items[i].color);
        GrRect(w,gc,0,0,240,y_pos+8);
        sprintf(tmp, "%d.", i);
        GrText(w, gc, 10, y_pos, tmp , -1, MWTF_DBCS_EUCKR);
        GrText(w, gc, 35, y_pos, ui_list->items[i].txt, -1, MWTF_DBCS_EUCKR);
        y_pos += 22;
    }

}

void draw_select()
{
    GrSetGCForeground(gc, LTGRAY);
    GrFillRect(w,gc,0,-2+22*ui_val,240,20);
    GrSetGCForeground(gc, WHITE);
    sprintf(tmp, "%d.", ui_val);
    GrText(w, gc, 10, 12+22*ui_val, tmp , -1, MWTF_DBCS_EUCKR);
    GrText(w, gc, 35, 12+22*ui_val, ui_list->items[ui_val].txt, -1, MWTF_DBCS_EUCKR);
}

글자 색을 변경하기 위해서는 GrSetGCForeground() 를 쓰면 되는데 문제는 이게 모든것에 다 영향을 미친다는 겁니다. 해서 색깔 바꾸고 싶은 항목마다 이 함수를 써야 하더군요... 더 좋은 방법 아시면 알려주세요

up, down 키로 메뉴 이동할수 있으며 그냥 참고하시라고 만든겁니다



장진혁 04-12-17 13:28
 
앞으로도 많은 도움 부탁드리겠습니다 (^^)(__)
냐옹이 04-12-17 13:24
 
저런 장진혁님. 별것도 아닌데 민망합니다...^^;;
냐옹이 04-12-17 13:17
 
특별히 책은 본 기억이 없네요. 제가 못 찾은 걸 수도 있지만, 상용도 아니고 아직 완전한 버전도 아니라서(v0.9) 기능이 100% 구현되어 있지 않더군요.
하시다 보면 microwindows를 수정해야 되는 경우도 종종 있을 겁니다.
그래서 Qt같은 것에 비해 쓰시는 분이 적은게 아마도 자료가 별로 없는 이유일 겁니다.
그래도 그 library 사이즈에 비해 기능은 상당히 강력합니다.(물론 Qt가 훨씬 더 강력합니다.-_-;) 수정도 편하구요.
플랫폼에 따라 Microwindows가 더 적절한 경우도 있을테니까 계속 공부해 보시길 바랍니다...^^
장진혁 04-12-17 13:15
 
냐옹이님 emoticon_113
냐옹이 04-12-17 13:11
 
GC란 개념은 windows에도 있습니다. 그걸 참고하시면 될 것 같네요. Graphic Context입니다.
그 안에 Graphic에 관한 설정, 속성 등을 넣어 놓은 것으로 보시면 됩니다. font에 관한 사항도 들어갑니다.
GrSetGCForeground()를 통해 GC에 "foreground색은 무슨 색이다" 이런식으로 정의한 것입니다.
따라서 GrText(), GrRect()등 그리는 함수에서는 이 GC를 사용해서 색을 알아내는데, 여기서 그릴 때 foreground색을 이용하므로 위에서 정해준 색으로 그리게 되는 겁니다.
그래서 매번 다른 색으로 그리고 싶을 때 GrSetGCForeground()를 통해서 색을 새로 정해주어야 하는 것입니다.
GrText()나 GrRect() 같은 함수에 색을 넣는 부분은 없고, gc가 인자로 들어간다는 것을 보면 생각하실 수 있습겁니다.
관련된 항목끼리 같은 GC로 관리하는 것도 하나의 방법이죠. 저는 귀찮아서 매번 색만 바꿉니다...-_-;
장진혁 04-12-17 12:57
 
아직 마이크로윈도우에 대한 개념이 없어서 삽질을 좀더 해봐야 겠습니다 ^^
gc 란것도 아직 이해를 못해서요...
마이크로윈도우에 대해 쓴 책같은건 없나요??
한글로 된것이요...
ㅜ.ㅜ
냐옹이 04-12-17 12:48
 
아 횟수는 별로 안 줄겠군요. 다른 항목에는 영향이 가진 않습니다.
냐옹이 04-12-17 12:46
 
GC를 필요한 항목마다 만드시면 됩니다.
같은 항목끼리는 같은 GC를 공유하시도록 하고, 다른 항목끼리는 다른 GC를 쓰시도록 하면 GrSetGCForeground()를 쓰는 횟수를 줄일 수 있을겁니다.
 
 

Total 17
번호 제   목 글쓴이 날짜 조회
17 timer 사용하는 방법 입니다.. 토마토 08-28 18432
16 마이크로윈도우 nano-X api 간단 [tip] 토마토 09-01 20735
15 nano-x에서의 이벤트 처리 (1) 조규봉 01-24 23520
14 왕초보를 위한 Nano-X 5편 (freetype font) 냐옹이 01-02 21320
13 왕초보를 위한 Nano-X 4편 (한글 기본 폰트) 냐옹이 12-28 24129
12 왕초보를 위한 Nano-X 3편 (window 생성) 냐옹이 08-24 19256
11 왕초보를 위한 Nano-X 2편 (이미지 관련 함수 분… 냐옹이 08-11 15538
10 왕초보를 위한 Nano-X 1편 (helloworld.c 분석하기) 냐옹이 08-08 15093
9 microwindows 한글 TrueType fonts 출력하기 최고관… 06-16 14184
8 Cygwin 에서 Microwindows 컴파일 하기 (2) 채영훈 04-07 20485
7 메뉴구성 및 글자색 변경 참고 소스 (8) 장진혁 12-17 20817
6 한글 출력 방법 및 예제 소스 (2) 장진혁 12-13 14474
5 Keyboard Event 입력 처리 소스 장진혁 12-13 15973
4 이미지 출력 소스 장진혁 12-13 14031
3 Hello World 소스 장진혁 12-13 13318
2 Microwindows 0.90 설치 (1) 장진혁 12-13 17379
1 microwindows 한글 TrueType fonts 출력하기 (5) 김용오 12-16 15271


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