GTK 프로그래밍중 위젯모양 변경하기

linuxs의 이미지

안녕하세요
GTK로 어플리케이션 만들때 모양을 이쁘게 만들려구 합니다.
보통 윗젯들이 사각형으로 되어 있는데 GtkWindow 같은 메인 위젯을 모양을 좀 다르게 만들려구 합니다.
가능한가요..
예를들어 mplayer에 스킨을 바꾸면 모양이 변하던데 그런건 어떻게 해야 되나요
위젯에 이미지를 입힐때 그 이미지에 알파값을 줘서 하는건가요?
김프로 이미지에 알파값을 줘서 했더니 알파값이 적용된 부분에 흰색으로 나오고 적용되지 않은 부분만 그냥 이미지로 나오던데
?
그럼 감사합니다.

sylphong의 이미지

xmms처럼 스킨입힐수있게 윈도 위젯을 만들고 싶으신거라면 gtk로는 힘들고 gdk를 이용하셔야 될꺼같습니다...

ddoman의 이미지

잘은 기억이 안나는데
Gtk소스를 받아서 보시면 포함 된 예제중에

펭귄 비트맵모양의 윈도우를 띄우는 예제가 있었습니다.
....펭귄이 Qt였나?...햇깔리네요...펭귄아니면 무슨 수레 모양이었던가

암튼 gtk랑 qt랑 둘다 그런예제가 하나씩있었는데..gtk가 펭귄인지
수레인지 기억이안나네요..
암튼 예제 뒤져보시면 비트맵모양을 불러오고 그거에서 투명 마스크를
뽑아내온후 윈도우에 마스크를 셋하는 과정이었던걸로 기억합니다.
암튼 예제도 간단하고 어렵지 않으니 예제 디렉토릴 찾아보세요.
거기있는거 전부 실행시켜보면 의외로 재미있는것들이 많습니다.

linuxs의 이미지

ddoman wrote:
잘은 기억이 안나는데
Gtk소스를 받아서 보시면 포함 된 예제중에

펭귄 비트맵모양의 윈도우를 띄우는 예제가 있었습니다.
....펭귄이 Qt였나?...햇깔리네요...펭귄아니면 무슨 수레 모양이었던가

암튼 gtk랑 qt랑 둘다 그런예제가 하나씩있었는데..gtk가 펭귄인지
수레인지 기억이안나네요..
암튼 예제 뒤져보시면 비트맵모양을 불러오고 그거에서 투명 마스크를
뽑아내온후 윈도우에 마스크를 셋하는 과정이었던걸로 기억합니다.
암튼 예제도 간단하고 어렵지 않으니 예제 디렉토릴 찾아보세요.
거기있는거 전부 실행시켜보면 의외로 재미있는것들이 많습니다.

찾아보니까 GTK에서는 못찾고요.. QT example에 보니 tux라는 디렉토리에 있네요 상당히 귀여운 녀석이더군요..^^
예상대로 이미지를 보니까 알파값 적용하고 그걸 이용하고 있네요
음 GTK에서는 윗분 말씀대로 GDK쪽을 찾아 봐야 겠네요..

참고로 tux 예제소스 올립니다.


#include <qapplication.h>
#include <qwidget.h>
#include <qimage.h>
#include <qpixmap.h>
#include <qbitmap.h>
#include <qfile.h>

#include <stdlib.h>

class MoveMe : public QWidget
{
public:
    MoveMe( QWidget *parent=0, const char *name=0, WFlags f = 0)
	:QWidget(parent,name, f) {}

protected:
    void mousePressEvent( QMouseEvent *);
    void mouseMoveEvent( QMouseEvent *);
private:
    QPoint clickPos;
};

void MoveMe::mousePressEvent( QMouseEvent *e )
{
    //    if ( e->button() == LeftButton )
	clickPos = e->pos();
}

void MoveMe::mouseMoveEvent( QMouseEvent *e )
{
    //    if ( e->state() & LeftButton )
	move( e->globalPos() - clickPos );
}



int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    QString fn="tux.png";

    if ( argc >= 2 )
	fn = argv[1];

    if ( ! QFile::exists( fn ) )
	exit( 1 );

    QImage img( fn );
    QPixmap p;
    p.convertFromImage( img );
    if ( !p.mask() )
	if ( img.hasAlphaBuffer() ) {
	    QBitmap bm;
	    bm = img.createAlphaMask();
	    p.setMask( bm );
	} else {
	    QBitmap bm;
	    bm = img.createHeuristicMask();
	    p.setMask( bm );
	}
    MoveMe w(0,0,Qt::WStyle_Customize|Qt::WStyle_NoBorder);
    w.setBackgroundPixmap( p );
    w.setFixedSize( p.size() );
    if ( p.mask() )
	w.setMask( *p.mask() );
    w.show();
    a.setMainWidget(&w);


    return a.exec();

}


꿈은 이루어진다.

ddoman의 이미지

예제에있는 whellbarrow디렉토리를 참고하세요.
컴파일은 안해봤지만 소스보니깐 아마도 이게 맞는거 같습니다.
해본지가 오래되서...^^;;
아래는 소스고...전역변수 xpm은 배열 일부를 삭제해서 붙여넣었습니다.

/* example-start wheelbarrow wheelbarrow.c */

#include <gtk/gtk.h>

/* XPM */
static char * WheelbarrowFull_xpm[] = {
"48 48 64 1",
"       c None",
".      c #DF7DCF3CC71B",

.............................................생략

"X      c #965875D669A6",
"o      c #71C671C671C6",
"O      c #A699A289A699",
"                                                "};


/* When invoked (via signal delete_event), terminates the application */
gint close_application( GtkWidget *widget,
                        GdkEvent  *event,
                        gpointer   data )
{
    gtk_main_quit();
    return(FALSE);
}

int main (int argc,
          char *argv[] )
{
    /* GtkWidget is the storage type for widgets */
    GtkWidget *window, *pixmap, *fixed;
    GdkPixmap *gdk_pixmap;
    GdkBitmap *mask;
    GtkStyle *style;
    GdkGC *gc;
    
    /* Create the main window, and attach delete_event signal to terminate
     * the application.  Note that the main window will not have a titlebar
     * since we're making it a popup. */
    gtk_init (&argc, &argv);
    window = gtk_window_new( GTK_WINDOW_POPUP );
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (close_application), NULL);
    gtk_widget_show (window);

    /* Now for the pixmap and the pixmap widget */
    style = gtk_widget_get_default_style();
    gc = style->black_gc;
    gdk_pixmap = gdk_pixmap_create_from_xpm_d( window->window, &mask,
                                             &style->bg[GTK_STATE_NORMAL],
                                             WheelbarrowFull_xpm );
    pixmap = gtk_pixmap_new( gdk_pixmap, mask );
    gtk_widget_show( pixmap );

    /* To display the pixmap, we use a fixed widget to place the pixmap */
    fixed = gtk_fixed_new();
    gtk_widget_set_usize( fixed, 200, 200 );
    gtk_fixed_put( GTK_FIXED(fixed), pixmap, 0, 0 );
    gtk_container_add( GTK_CONTAINER(window), fixed );
    gtk_widget_show( fixed );

    /* This masks out everything except for the image itself */
    gtk_widget_shape_combine_mask( window, mask, 0, 0 );

    /* show the window */
    gtk_widget_set_uposition( window, 20, 400 );
    gtk_widget_show( window );
    gtk_main ();

    return(0);
}
/* example-end */

이게..아니면...-_-;;;;; 제가 gtk컴파일 환경이 구축이 안되서..테스트를
못해서시리...기억찾아..삼만리.:)

linuxs의 이미지

감사합니다.

꿈은 이루어진다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.