검색결과 리스트
프로그래밍에 해당되는 글 12건
- 2011.11.15 본격 Gtk에서 Cairo 사용하기
- 2011.11.05 예외처리
- 2011.11.03 delete 와 new
- 2011.11.03 C++ 생성자와 소멸자
- 2011.11.03 gtkmm 예제 프로그램
- 2011.11.03 virtual class
- 2011.11.03 C++ 상속
- 2011.11.03 프리미티브 타입
- 2011.11.02 C언어 키워드
- 2011.11.02 gtkmm! Anjuta!
글
본격 Gtk에서 Cairo 사용하기
프로그래밍/Gtk+/binding gtk
2011. 11. 15. 23:11
예제 소스 참조한곳 주소 => http://zetcode.com/tutorials/cairographicstutorial/basicdrawing/
결과창

선긋는 예제인듯.
난 저중에서 소스를 일부를 뽑아내서
라는 함수를 만들었다.
mx, my가 시작위치 lx, ly 가 끝위치로해서 선을 긋는 함수다. 물론 cairo_t 타입으로 cr이라는 변수가 선언되어있어야한다.
마우스가 눌리면 전역변수 x,y값에 마우스가 누른 좌표값을 넣고, 마우스가 떼어지면 함수를 이용해 drawline함수를 사용해서 선을 그어보고싶었지만 마우스를 누르고떼는 이벤트와 그 값이 넘어가는 방식을 몰라서 막혔다. 국내에 Gtk, Cairo로 무언가 만들어본사람의 조언이있으면 좋을텐데... 예제파일이랑 영문문서를 찾아야하는건가... @.@...
#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 |
글
예외처리를 전문으로 해주는 키워드 try catch....
과거엔 if else로 일일히 예외 처리를 해줘야했는데 C++ 에선 이걸 try catch 문으로 쉽게 처리해 줄 수 있디.
예를들면
try {
...
if(...) throw a
{ ... }
}
catch(int a) {
...
}
이런식으로 try 부분에선 할일, 수행할 코드를 적고 throw는 값을 넘겨주는 역할을, catch 문은 throw로부터 받은 값을 이용해 예외 발생시 할 일을 적는다.
이 키워드는 자바에서도 C#에서도 거의 비슷하게 동작하는것 같다
과거엔 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 |
글
delete 와 new
프로그래밍
2011. 11. 3. 16:24
new는 객체를 메모리에 할당, delete는 할당된 객체를 삭제... 인듯 하다
그런데 new [] 와 delete[] 라는 키워드도 존재하는 듯하다.
좀더 자세히 풀어보면
new -> 객체 한개를 동적으로 할당하고 초기화
delete -> 할당된 객체 한개를 삭제
new [] -> 객체 배열을 동적으로 할당하고 초기화
delete [] -> 할당된 객체 배열 하나하나를 없애고 배열을 삭제
인듯 하다.
이렇게 new 와 new [] , delete 와 delete [] 키워드로 분리한 이유는
객체 하나의 정보만 저장한다면 배열의 갯수를 표현하는 부분이 필요 없으니까 그 부분을 절약하기 위해 그런듯하다.
new 연산자로 할당한건 객체만, new [] 연산은 배열 갯수 + 객체 X 갯수 로 표현하는듯.
그런데 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 |
글
C++ 생성자와 소멸자
프로그래밍
2011. 11. 3. 14:09
생성자는 조금 들어봤는데 소멸자는 처음 들어봤다.
class A {
A() // 생성자
{
~~
}
~A() // 소멸자
{
~~
}
}
이런 형태로 쓰이는 거 같다
생성자는 객체를 생성할때, 소멸자는 객체를 없앨때(delete를 이용하는듯) 사용하나보다
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 |
글
gtkmm 예제 프로그램
프로그래밍/Gtk+/binding gtk
2011. 11. 3. 13: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라는 값이 있으면 다이얼로그를 띄우는 형식이다.
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
로 해주면 에러가 일어나지 않는다
이를 가상 기반 클래스 라고 부르는듯 하다. 이렇게 지정하면 두번 상속되더라도 한번만 상속을 하게 된다고 한다.
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 |
글
'프로그래밍' 카테고리의 다른 글
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 |
글
뭔지 몰라서 검색!
latokor.egloos.com/987046
간단히 정리하자면
프리미티브 타입은 char, int, double 같은걸 말하는것 같다
latokor.egloos.com/987046
간단히 정리하자면
프리미티브 타입은 char, int, double 같은걸 말하는것 같다
'프로그래밍' 카테고리의 다른 글
delete 와 new (0) | 2011.11.03 |
---|---|
C++ 생성자와 소멸자 (0) | 2011.11.03 |
virtual class (0) | 2011.11.03 |
C++ 상속 (0) | 2011.11.03 |
C언어 키워드 (0) | 2011.11.02 |
글
오늘 여러 키워드에 대해 검색해봤다
먼저
extern.. 요놈은 걍 외부에서도 사용가능하게 지정하는 변수정도로만 알고 있었다.
그런데 extern "C"를 이용하면 컴파일러가 해주던 네임 맹글링(같은 이름의 함수와 변수를 구분가능하게 해주는 작업) 을 "안해주도록" 하여 일반 C함수이름으로 선언되게 하는거라고 한다.
한마디로 C++소스 내에서 exturn "C"로 덮혀있으면 C에서도 사용이 가능하게 되는것과 C++에서 C의 문법을 쓰게 해줄수 잇는것 같다.
그다음
volatile 이놈도 걍 컴파일러 최적화 안하기...정도로만 알고 있었는데 다음과 같은때에 쓴다고한다
a = 1;
a = 2;
a = 3;
a = 4;
a = 5;
같은식으로 되어있으면 컴파일러는 a = 5;만 수행하도록 할것이다(그것이 제일 효율적이니까) 그러나 만약 a대신에 값이 들어가는 것마다 다른것이 일어나는... 예를들면 인터럽트같은걸 사용할때는 값마다 수행하는게 다르고 1,2,3,4,5 처럼 각각 들어가는 값이 다르지만 다 수행되야한다면 나머지를 지울수 없게 될것이고 따라서 컴파일러 최적화를 수행못하게 하기 위해 volatile을 써야하게 된다는 것이다.
그리고 마지막으로 Null Pointer
널포인터, 걍 값없는거 아냐? 정도로만 생각했던 나에게 코웃음을 치며 제대로 모르는구나! 빨리 검색해봐! 라는 말에 검색하게 되었다.
#define NULL 0 으로 선언되어있다고 한다.(시스템마다 조금씩 틀릴것 같지만... 일단 내가본글에선 프로그래머가 NULL의 자세한 값을 알 필요가 없다는듯 하다.)
이 널포인터는 다른 포인터와 달리 0이란 값이 들어있고 "할당되지 않은 상태"라는 듯하다.
Gtk를 알려면 포인터를 제대로 알아야한다는 말을 듣고 포인터관련 자료를 찾고 정리하는 시간을 가져봐야겠다.
먼저
extern.. 요놈은 걍 외부에서도 사용가능하게 지정하는 변수정도로만 알고 있었다.
그런데 extern "C"를 이용하면 컴파일러가 해주던 네임 맹글링(같은 이름의 함수와 변수를 구분가능하게 해주는 작업) 을 "안해주도록" 하여 일반 C함수이름으로 선언되게 하는거라고 한다.
한마디로 C++소스 내에서 exturn "C"로 덮혀있으면 C에서도 사용이 가능하게 되는것과 C++에서 C의 문법을 쓰게 해줄수 잇는것 같다.
그다음
volatile 이놈도 걍 컴파일러 최적화 안하기...정도로만 알고 있었는데 다음과 같은때에 쓴다고한다
a = 1;
a = 2;
a = 3;
a = 4;
a = 5;
같은식으로 되어있으면 컴파일러는 a = 5;만 수행하도록 할것이다(그것이 제일 효율적이니까) 그러나 만약 a대신에 값이 들어가는 것마다 다른것이 일어나는... 예를들면 인터럽트같은걸 사용할때는 값마다 수행하는게 다르고 1,2,3,4,5 처럼 각각 들어가는 값이 다르지만 다 수행되야한다면 나머지를 지울수 없게 될것이고 따라서 컴파일러 최적화를 수행못하게 하기 위해 volatile을 써야하게 된다는 것이다.
그리고 마지막으로 Null Pointer
널포인터, 걍 값없는거 아냐? 정도로만 생각했던 나에게 코웃음을 치며 제대로 모르는구나! 빨리 검색해봐! 라는 말에 검색하게 되었다.
#define NULL 0 으로 선언되어있다고 한다.(시스템마다 조금씩 틀릴것 같지만... 일단 내가본글에선 프로그래머가 NULL의 자세한 값을 알 필요가 없다는듯 하다.)
이 널포인터는 다른 포인터와 달리 0이란 값이 들어있고 "할당되지 않은 상태"라는 듯하다.
Gtk를 알려면 포인터를 제대로 알아야한다는 말을 듣고 포인터관련 자료를 찾고 정리하는 시간을 가져봐야겠다.
'프로그래밍' 카테고리의 다른 글
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 |
글
gtkmm! Anjuta!
프로그래밍/Gtk+/binding gtk
2011. 11. 2. 19:21
C++로 바인딩된 Gtk언어 gtkmm.
C++공부삼아 해보기로 결심했다.
Class, Public, Protected, Private, Vitual... 객체지향의 개념이 추가된 C...라는 느낌이기보단 C랑 많이 다르다는 느낌이 들었다.
Virtual이란 키워드... 가상함수? 자바의 abstract 과 비슷한 키워드인듯 하다.
Anjuta IDE라는 gtk개발툴. 몇개월전만 해도 별로였던거 같은데 제법 쓸만한 툴이 되었다.
glade랑 통합되어서 UI는 비주얼스튜디오의 도구상자처럼 Label이나 Button을 끌어다 디자인을 할 수 있다.
그다음 소스코드에서 불러와서 사용하면 끗!
제법 쓸만한 툴이 생긴거 같아서 기쁘다.
열심히 개발해야징 히힛.
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 |