gtk로 프로그래밍을 짜고 있는데요. 배경화면 지정에 관한 질문

초코리의 이미지

안녕하세요.

GTK 1.2로 프로그래밍을 시작하는 초보 GTK프로그래머 입니다.

네모난 윈도우를 위젯을 만든후에

그위에 박스를 만들어 넣고 그위에 pixmap위젯을 패킹하여

픽스맵을 박스에 뛰우기 까지 했습니다.

(박스와 픽스맵이 처음만든 윈도우 위젯을 꽉채워서 배경처럼쓰려고 합니다.)

그위에

버튼하고 픽스맵 같은것을 올리려고 하는데요

이런 방식으로 작성하는게 맞는지 궁굼해서 질문드립니다.

이렇게 일단 프로그래밍은 시작했는데

그위에 버튼이랑 픽스맵이 올라갈수 못올라 갈거 같아 고민되어

질문드립니다.

답변 부탁드립니다...

saxboy의 이미지

안될것 같은데요. 이렇게 채운 박스위에 다시 위짓을 올리기도 힘들뿐더러 올린다고 해도 위짓의 자체 드로잉루틴이 아마 redraw하는 순간 지워버릴것 같군요. 제가 제대로 이해한것이 맞다면... 코드를 잘라붙여 올리시면 좀 더 자세하게 적을 수 있을것 같군요.

기본으로 제공되는 위짓에 배경을 쓰려면 스타일을 알아보시는 것이 더 좋을 것 같습니다.

초코리의 이미지

소스는 다음과 같습니다.

어제 밤에 고민해봤는데 안될것 같았는데..

역시 힘들군요.. 스타일 쪽으로 알아봐야 겠습니다..

#include <gtk/gtk.h>

#include "phone.xpm"//픽스맵을 include 한다 픽스맵이 배열이기때문에 가능하다.
                                                                                                                                                   
gboolean delete_event_handler(GtkWidget *widget,GdkEvent * event,
                                gpointer user_data)//콜백루틴
        //리턴값이 있는 핸들러를 사용할때 사용
{
        gtk_main_quit();//gtk를 종료시키는 함수이다.;
        return(FALSE);
}
                                                                                                                                                   
void print_and_quit(GtkWidget *was_clicked,gpointer user_data){//핸들러
        //리턴값이 없는 작업을 할때 핸들러를 사용
                                                                                                                                                   
        g_print("destory\n");//콘솔에 프린트한다.:
        gtk_main_quit();//gtk를 종ㄹ시키는 함수이다.:
}
void button_click(GtkWidget *button_clicked,gpointer uesr_data){
        g_print("button clicked\n");
}
                                                                                                                                                   
int main(int argc, char * argv[]){
                                                                                                                                                   
        GtkWidget *top_widget,*button;
        GdkPixmap *pixmap;//xpm화일을 로딩하기위한 포인터, GDK데이타 타입이다.
        GdkBitmap *transparent;//GDK데이타 타입니다.
        GtkWidget *pixmap_widget;//픽스맵을 받는 위젯이다
        GtkWidget *box;//픽스맵등을 저장하는 장소이다.
        GdkCursor *new_cursor;
                                                                                                                                                   
                                                                                                                                                   
        char * pixmap_filename;//그림화일을 저장하기 위하여
                                //파일의 이름을 저장하는 변수
                                                                                                                                                   
        gtk_init(&argc,&argv);//gtk프로그램의 초기화
                                                                                                                                                   
                                                                                                                                                   
        top_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);//윈도우를 하나 만든다
        gtk_window_set_title(GTK_WINDOW (top_widget),"Pixmap");
                                                                                                                                                   
        box = gtk_vbox_new(FALSE,0);
        gtk_container_add(GTK_CONTAINER(top_widget),box);
//XPM을 부르기 위한 부분
        pixmap = gdk_pixmap_colormap_create_from_xpm_d(NULL,
                        gdk_colormap_get_system(),&transparent,NULL,phone_xpm);
        //배열에서 읽어와 픽스맵을 쓴다.
        pixmap_widget = gtk_pixmap_new(pixmap,transparent);//픽스맵위젯을 생성한다.
        gdk_pixmap_unref(pixmap);//픽스맵 위젯을 생성하였기 때문에 픽스맵을 제거한다.
        gtk_box_pack_start_defaults(GTK_BOX(box),pixmap_widget);
        //픽스맵 위젯을 box에 패킹한다.
//XPM END

        gtk_signal_connect(GTK_OBJECT(top_widget),"delete_event",
                                GTK_SIGNAL_FUNC(delete_event_handler),NULL);
        gtk_widget_set_uposition(top_widget,0,0);//생성되는 위젯의 위치를 설정한다.
        gtk_widget_set_usize(top_widget,240,320);//생성되는 위젯의 크기를 설정한다.
                                                                                                                                                   
                                                                                                                                                   
        gtk_widget_show(box);
        gtk_widget_show(pixmap_widget);
        gtk_widget_show(top_widget);//창위젯을 보이게 한다.
        gtk_main();//여기서 이벤트가 발생하도록 블럭시킨다.
                                                                                                                                                   
        return 0;
}
    
초코리의 이미지

스타일을 이용하여 바꿔 봤습니다.

이렇게 스타일을 쓰면 되는건가요??

그리고 스타일과 픽스맵파일을 다른 파일로 넣지않고

소스의 한파일에 넣고 싶은데 어떻게해야할까요?

test.rc파일

                                                                                 
style "window"
{
        bg_pixmap[NORMAL] = "phone.xpm"
}
                                                                                
widget "main_window" style "window"
                                                                                

메인파일
#include <gtk/gtk.h>
#define RC_FILE "test.rc"
gboolean delete_event_handler(GtkWidget *widget,GdkEvent * event,
                gpointer user_data)//콜백루틴
    //리턴값이 있는 핸들러를 사용할때 사용
{
    gtk_main_quit();//gtk를 종료시키는 함수이다.;
    return(FALSE);
    //TRUE : delete이벤트와 함께 자동으로 종료가 되다.
    //FALSE: delete이벤트만 발생하고 자동으로 종료가 되지는 않는다.
    //delete이벤트를 핸들링한다면 정말로 종료하시겠습니까? 같은
    //문장을 낼수 있어서 유용하다.
}
                                                                                                                                          
void print_and_quit(GtkWidget *was_clicked,gpointer user_data){//핸들러
    //리턴값이 없는 작업을 할때 핸들러를 사용
                                                                                                                                          
    g_print("destory\n");//콘솔에 프린트한다.:
    gtk_main_quit();//gtk를 종료시키는 함수이다.:
}
                                                                                                                                          
int main(int argc, char * argv[]){
                                                                                                                                          
    GtkWidget *top_widget;
                                                                                                                                          
    gtk_init(&argc,&argv);//gtk프로그램의 초기화
    gtk_rc_parse(RC_FILE);//RC파일을 읽어온다.
    //배경등을 그냥 정의하면 된다.

                                                                                                                                              top_widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);//윈도우를 하나 만든다
    gtk_window_set_title(GTK_WINDOW (top_widget),"Pixmap");
    gtk_widget_set_name(top_widget,"main_window");
                                                                                                                                          
    gtk_signal_connect(GTK_OBJECT(top_widget),"delete_event",
                GTK_SIGNAL_FUNC(delete_event_handler),NULL);
    //메인 윈도우의 싸이즈와 크기를 설정한다.
    gtk_widget_set_uposition(top_widget,0,0);//생성되는 위젯의 위치를 설정한다.
    gtk_widget_set_usize(top_widget,240,320);//생성되는 위젯의 크기를 설정한다.
                                                                                                                                          
                                                                                                                                          
    gtk_widget_show(top_widget);//창위젯을 보이게 한다.
                                                                                                                                          
                                                                                                                                          
    gtk_main();//여기서 이벤트가 발생하도록 블럭시킨다.
                                                                                                                                          
    return 0;
}
saxboy의 이미지

xpm 을 에디터로 열어보세요. 간단한 구조체입니다. 그냥 a.xpm -> a.xpm.c 로 바꾸어서 같이 컴파일하시면됩니다.

초코리의 이미지

saxboy wrote:
xpm 을 에디터로 열어보세요. 간단한 구조체입니다. 그냥 a.xpm -> a.xpm.c 로 바꾸어서 같이 컴파일하시면됩니다.

픽스맵은 간단한 구조체배열이라서

그냥 #include로 하면 되더군요.

그런데 rc파일은 실행시에 읽어와 수행하는것 같은데

이 rc파일은 소스코드에 XPM같이 같이 넣는 방법은 없습니까??

그리고 rc파일에서 xpm파일을 읽어오는데

그 xpm파일은 같이 저장 않되던데

이 XPM까지 같이 넣고 싶습니다.

=> 한마디로 목적이 뭐냐면 컴파일된 실행파일 하나를 가지고 rc파일이나 xpm파일이 없이 정상적으로 실행하고 싶어서 그러는데 방법이 있을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.