예제 소스 참조한곳 주소 => http://zetcode.com/tutorials/cairographicstutorial/basicdrawing/
#include <cairo.h>
#include <gtk/gtk.h>


static gboolean
on_expose_event(GtkWidget *widget,
    GdkEventExpose *event,
    gpointer data)
{
  cairo_t *cr;

  cr = gdk_cairo_create (widget->window);

  cairo_set_source_rgba(cr, 0, 0, 0, 1);

  static const double dashed1[] = {4.0, 1.0};
  static int len1  = sizeof(dashed1) / sizeof(dashed1[0]);

  static const double dashed2[] = {4.0, 1.0, 4.0};
  static int len2  = sizeof(dashed2) / sizeof(dashed2[0]);

  static const double dashed3[] = {1.0};

  cairo_set_line_width(cr, 1.5);

  cairo_set_dash(cr, dashed1, len1, 0);

  cairo_move_to(cr, 40, 30);  
  cairo_line_to(cr, 200, 30);
  cairo_stroke(cr);

  cairo_set_dash(cr, dashed2, len2, 1);

  cairo_move_to(cr, 40, 50);  
  cairo_line_to(cr, 200, 50);
  cairo_stroke(cr);

  cairo_set_dash(cr, dashed3, 1, 0);

  cairo_move_to(cr, 40, 70);  
  cairo_line_to(cr, 200, 70);
  cairo_stroke(cr);

  cairo_destroy(cr);

  return FALSE;
}


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

  GtkWidget *window;
  GtkWidget *darea;  

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  darea = gtk_drawing_area_new();
  gtk_container_add(GTK_CONTAINER(window), darea);

  g_signal_connect(darea, "expose-event",
      G_CALLBACK (on_expose_event), NULL);
  g_signal_connect(window, "destroy",
      G_CALLBACK (gtk_main_quit), NULL);

  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(window), 250, 100); 

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

결과창




선긋는 예제인듯.

난 저중에서 소스를 일부를 뽑아내서

void drawline(mx, my, lx, ly)
{
  cairo_set_source_rgba(cr, 0, 0, 0, 1); // color setting
  cairo_set_line_width(cr, 1); // line width setting
  cairo_move_to(cr, mx, my); // start point
  cairo_line_to(cr, lx, ly); // end point
  cairo_stroke(cr); // draw?
}

라는 함수를  만들었다.

mx, my가  시작위치 lx, ly 가 끝위치로해서 선을 긋는 함수다.  물론 cairo_t 타입으로 cr이라는 변수가 선언되어있어야한다.

마우스가 눌리면 전역변수 x,y값에 마우스가 누른 좌표값을 넣고, 마우스가 떼어지면 함수를 이용해 drawline함수를 사용해서 선을 그어보고싶었지만 마우스를 누르고떼는 이벤트와 그 값이 넘어가는 방식을 몰라서 막혔다. 국내에 Gtk, Cairo로 무언가 만들어본사람의 조언이있으면 좋을텐데... 예제파일이랑 영문문서를 찾아야하는건가... @.@...

'프로그래밍 > Gtk+/binding gtk' 카테고리의 다른 글

gtkmm 예제 프로그램  (0) 2011.11.03
gtkmm! Anjuta!  (0) 2011.11.02
gtkbuilder의 사용  (0) 2011.06.09

설정

트랙백

댓글

#include <gtkmm.h>
#include <iostream>

#include "config.h"

#ifdef ENABLE_NLS
#  include <libintl.h>
#endif

Gtk::Window* main_win = 0;

/* For testing propose use the local (not installed) ui file */
/* #define UI_FILE PACKAGE_DATA_DIR"/gtk_test_1/ui/gtk_test_1.ui" */
#define UI_FILE "src/gtk_test_1.ui"

Glib::RefPtr<Gtk::Builder> builder;

Glib::ustring id;
Glib::ustring pass;

Gtk::Entry* idbox = 0;
Gtk::Entry* passbox = 0;

void destroy()
{
exit(0);
}

void debug_on_console()
{
printf("successed debug\n") ;
}

void test()
{
if(idbox)
{
id = idbox->get_text();
}
if(passbox)
{
pass = passbox->get_text();
}
if(id == "1234" && pass == "1234")
{
Gtk::MessageDialog dialog(*main_win,"로그인 성공!",false);
dialog.run();
}
else
{
}
}

int
main (int argc, char *argv[])
{
//pair < int , int > ttwa ;
Gtk::Main kit(argc, argv);

//Load the Glade file and instiate its widgets:
try
{
builder = Gtk::Builder::create_from_file(UI_FILE);
}
catch (const Glib::FileError & ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
builder->get_widget("main_window", main_win);
builder->get_widget("pwbox", passbox);
builder->get_widget("idbox", idbox);
if (main_win)
{
Gtk::Button* btnexit = 0;
Gtk::Button* btnok = 0;
Gtk::Button* btnclose = 0;
builder->get_widget("btnexit", btnexit);
if(btnexit)
{
btnexit->signal_clicked ().connect(sigc::ptr_fun (&destroy));
}
builder->get_widget("btnlogin", btnok);
if(btnok)
{
btnok->signal_clicked ().connect (sigc::ptr_fun(&test));
}
kit.run(*main_win);
}
return 0;
}

void testing()
{
printf("TEST");
}

Glade의 도움을 받아 UI를 작성하고 코드에서 불러오는 형태이다.

위에 나온거처럼 signal_type().connect(sigc::ptr_fun(&함수이름)); 의 형식으로 시그널과 함수를 이어주는 역활을 한다. 근데 이상하게 인자값이 존재하는 함수를 해봤을땐 에러가 나서 어떻게 값을 주고받지...하고 고민하다가 결국 Gtk::Entry와 Glib::ustring(Entry에서 텍스트를 뽑아오는 함수 get_text()의 리턴값이 Glib::ustring 이다)을 전역변수로 사용하는 길을 택했다.

기능은 login버튼을 눌렀을때 맨위 상자에 1234, 두번째 상자에도 1234라는 값이 있으면 다이얼로그를 띄우는 형식이다.

'프로그래밍 > Gtk+/binding gtk' 카테고리의 다른 글

본격 Gtk에서 Cairo 사용하기  (0) 2011.11.15
gtkmm! Anjuta!  (0) 2011.11.02
gtkbuilder의 사용  (0) 2011.06.09

설정

트랙백

댓글

C++로 바인딩된 Gtk언어 gtkmm.
C++공부삼아 해보기로 결심했다.
Class, Public, Protected, Private, Vitual... 객체지향의 개념이 추가된 C...라는 느낌이기보단 C랑 많이 다르다는 느낌이 들었다.
Virtual이란 키워드... 가상함수? 자바의 abstract 과 비슷한 키워드인듯 하다.

Anjuta IDE라는 gtk개발툴. 몇개월전만 해도 별로였던거 같은데 제법 쓸만한 툴이 되었다.
glade랑 통합되어서 UI는 비주얼스튜디오의 도구상자처럼 Label이나 Button을 끌어다 디자인을 할 수 있다.
그다음 소스코드에서 불러와서 사용하면 끗!

제법 쓸만한 툴이 생긴거 같아서 기쁘다.
열심히 개발해야징 히힛.

'프로그래밍 > Gtk+/binding gtk' 카테고리의 다른 글

본격 Gtk에서 Cairo 사용하기  (0) 2011.11.15
gtkmm 예제 프로그램  (0) 2011.11.03
gtkbuilder의 사용  (0) 2011.06.09

설정

트랙백

댓글

gtk+.. 이거 그냥 일일히 설정하기엔 코드도 길어지고 복잡하고... 아무래도 glade라고 GUI로 끌어와서 .glade라는 xml형식의 파일을 만든다음 불러와서 파싱해서 위젯으로 쓰는 방식인듯 하다.

어떻게 하는건지 역시 한국어 문서가 적다는 점이 날 괴롭게 했다....(이래서 영어를 배워야하나봐...)

아무튼 열심히 구글의 문을 두들기다보면 나오지 않는 정보는 없는법 결국 어떻게든 찾아서 사용방법을 알아냈다

GtkBuilder = *builder
builder = gtk_builder_new();
gtk_builder_add_from_file(builder,"file.glade",NULL)

먼저 builder 라는 이름으로 변수를 생성한뒤 그 변수에 gtk_builder_new() 값을 넣는 것처럼 넣고 세번째 줄에서는 함수의 이름 그대로 파일로부터 값을 받아온다. 세번째 패러미터는 error값을 의미하는데 GError 타입의 변수를 선언해 error를 받아올 수 있는것 같다. 첫번째는 값이 들어갈 GtkBuilder 타입의 변수, 두번째는 파일 이름이다.

잡소리지만 Java나 C#에서 쓰이는 객체지향에서 객체를 저런식으로 포인터로 할당한다고 들었다. 그렇다면 위에 두줄은 GtkBuilder builder = new GtkBuilder(); 라는 의미(실제로 이렇게 쓰이는 건 없을듯 하지만)를 지니고 있는게 아닌가 싶어졌다.

'프로그래밍 > Gtk+/binding gtk' 카테고리의 다른 글

본격 Gtk에서 Cairo 사용하기  (0) 2011.11.15
gtkmm 예제 프로그램  (0) 2011.11.03
gtkmm! Anjuta!  (0) 2011.11.02

설정

트랙백

댓글