예제 소스 참조한곳 주소 => 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

설정

트랙백

댓글

헝가리안 표기법!

기타 2011. 11. 8. 16:25
팀프로젝트땐 이 방식으로 코딩한다고한다.

변수, 함수 마다 각 타입이나 기타등등을 이름으로 적고 줄바꿈을 할땐 띄어쓰기 네칸이라던가...

확실히 이렇게하면 보기 좋을 것 같다.

링크해둬야지

http://sarum.tistory.com/85 

'기타' 카테고리의 다른 글

Nateon Client  (0) 2011.11.07
Lingr API 의 문제점  (0) 2011.11.04
핑퐁 스크립트  (1) 2011.07.14
ざわざわ  (0) 2011.06.07
잡담 여러개  (0) 2011.06.04

설정

트랙백

댓글

Nateon Client

기타 2011. 11. 7. 17:23
socket 열고 send, recv 함수 쓰고... 뭐 그런건 잘되는데 ticket 값이라고 nateon으로 로그인 할때 필요한 값이 있는데 이 값을 받아오는게 골치다. curl로 받아왔는데 이걸 어떻게 문자열로 저장하고 끊을지 막막.......

'기타' 카테고리의 다른 글

헝가리안 표기법!  (0) 2011.11.08
Lingr API 의 문제점  (0) 2011.11.04
핑퐁 스크립트  (1) 2011.07.14
ざわざわ  (0) 2011.06.07
잡담 여러개  (0) 2011.06.04

설정

트랙백

댓글

예외처리

프로그래밍 2011. 11. 5. 13:34
예외처리를 전문으로 해주는 키워드 try catch....
과거엔 if else로 일일히 예외 처리를 해줘야했는데 C++ 에선 이걸 try catch 문으로 쉽게 처리해 줄 수 있디.

예를들면

try {
...
if(...) throw a
{ ... }
}
catch(int a) {
...
}

이런식으로 try 부분에선 할일, 수행할 코드를 적고 throw는 값을 넘겨주는 역할을, catch 문은 throw로부터 받은 값을 이용해 예외 발생시 할 일을 적는다.

이 키워드는 자바에서도 C#에서도 거의 비슷하게 동작하는것 같다

'프로그래밍' 카테고리의 다른 글

delete 와 new  (0) 2011.11.03
C++ 생성자와 소멸자  (0) 2011.11.03
virtual class  (0) 2011.11.03
C++ 상속  (0) 2011.11.03
프리미티브 타입  (0) 2011.11.03

설정

트랙백

댓글

Lingr API 의 문제점

기타 2011. 11. 4. 20:28
API를 설명한 위키페이지에서는 


session.create

Creates a new Lingr API session. Once you create a session, you must perform some API call at least once every ten minutes, or the session will time out and be automatically destroyed.

HTTP Method:

  • POST
URL:
  • http://www.lingr.com/api/session/create

Parameters:

api_key * Your API Key
client_type The type of your API client- if provided, must be either human or automaton. If not provided, the default is automaton. For more information, see the client type page.

(*) Required

Example Response:

<?xml version="1.0" encoding="UTF-8"?>
<response>
 
<status>ok</status>
 
<session>g5K1smWyhwa</session>
</response>

라고 설명되어 있었다. 그러나 api_key값이 정확하게 무엇인지 설명도 나와있지않다. developer 페이지에 가면 key와 secret이 있는데 이 값을 넣어도 도저히 안된다.

그래서 구글링을 통해 API메모 라는 이름으로 된 GitHub 페이지를 발견했다. 그곳에선


 
session/create

セッションID作成する

リクエスト

POST
user: ユーザ名
password: パスワード

レスポンス

session: セッションID
nickname: ニックネーム
public_id: パブリックID
is_online: online/offline
user.name: 表示名
user.username: ユーザ名

ユーザ名かパスワードが無効のときは
{status: “error”, code: “invalide_user_credentials”, … }

が返る 

 라고 되어있는데
해석하자면  POST방식으로 user값엔 유저 ID를, password라는 값엔 비밀번호를 입력하게 하면 값이 돌아온다 설명해놓고 각 값에 대한 의미를 설명했다.

이 사이트를 보고 나는 다시 이 방식대로 해보고 제대로 값이 돌아오는 걸 볼 수 있었다.

도데체 난..... 왜 뻘짓을 한거냐.... 아무튼... 공식 설명 사이트의 위키 최종 갱신일이 2008년인걸 보면..... 공식 위키는 참조할만한데가 못되는거 아닌가 싶다... 

'기타' 카테고리의 다른 글

헝가리안 표기법!  (0) 2011.11.08
Nateon Client  (0) 2011.11.07
핑퐁 스크립트  (1) 2011.07.14
ざわざわ  (0) 2011.06.07
잡담 여러개  (0) 2011.06.04

설정

트랙백

댓글

delete 와 new

프로그래밍 2011. 11. 3. 16:24
new는 객체를 메모리에 할당, delete는 할당된 객체를 삭제... 인듯 하다

그런데 new [] 와 delete[] 라는 키워드도 존재하는 듯하다. 

좀더 자세히 풀어보면

new  -> 객체 한개를 동적으로 할당하고 초기화
delete  -> 할당된 객체 한개를 삭제
new []  -> 객체 배열을 동적으로 할당하고 초기화
delete []  -> 할당된 객체 배열 하나하나를 없애고 배열을 삭제

인듯 하다.

이렇게 new 와 new [] , delete 와 delete [] 키워드로 분리한 이유는

객체 하나의 정보만 저장한다면 배열의 갯수를 표현하는 부분이 필요 없으니까 그 부분을 절약하기 위해 그런듯하다.
new 연산자로 할당한건 객체만, new [] 연산은 배열 갯수 + 객체 X 갯수 로 표현하는듯.

'프로그래밍' 카테고리의 다른 글

예외처리  (0) 2011.11.05
C++ 생성자와 소멸자  (0) 2011.11.03
virtual class  (0) 2011.11.03
C++ 상속  (0) 2011.11.03
프리미티브 타입  (0) 2011.11.03

설정

트랙백

댓글

생성자는 조금 들어봤는데 소멸자는 처음 들어봤다.

class A {
  A() // 생성자
  {
    ~~
  }
  ~A() // 소멸자
  {
    ~~
  }


이런 형태로 쓰이는 거 같다

생성자는 객체를 생성할때, 소멸자는 객체를 없앨때(delete를 이용하는듯) 사용하나보다

'프로그래밍' 카테고리의 다른 글

예외처리  (0) 2011.11.05
delete 와 new  (0) 2011.11.03
virtual class  (0) 2011.11.03
C++ 상속  (0) 2011.11.03
프리미티브 타입  (0) 2011.11.03

설정

트랙백

댓글

#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

설정

트랙백

댓글

virtual class

프로그래밍 2011. 11. 3. 12:57
http://kldp.org/node/2182

http://www.winapi.co.kr/clec/cpp3/29-3-3.htm

c++에서

class A
{
 int a;


class B : public A
{
 int b;


class C : public A
{
 int c;
}
 
class D : public B, public C
{
}

가 있다면
 
class D 안에서 a를 사용하면 어느쪽의 a인지 애매해진다. 또한 컴파일러가 에러를 내뱉는다.
이를  

class B : virtual public A

class C : virtual public A  

로 해주면 에러가 일어나지 않는다

이를 가상 기반 클래스 라고 부르는듯 하다. 이렇게 지정하면 두번 상속되더라도 한번만 상속을 하게 된다고 한다.

'프로그래밍' 카테고리의 다른 글

delete 와 new  (0) 2011.11.03
C++ 생성자와 소멸자  (0) 2011.11.03
C++ 상속  (0) 2011.11.03
프리미티브 타입  (0) 2011.11.03
C언어 키워드  (0) 2011.11.02

설정

트랙백

댓글

C++ 상속

프로그래밍 2011. 11. 3. 08:18

'프로그래밍' 카테고리의 다른 글

delete 와 new  (0) 2011.11.03
C++ 생성자와 소멸자  (0) 2011.11.03
virtual class  (0) 2011.11.03
프리미티브 타입  (0) 2011.11.03
C언어 키워드  (0) 2011.11.02

설정

트랙백

댓글