• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
KMUG 케이머그

소프트웨어

[기타질문] Xcode 2.2 에서 카본 프로그램 만들자 (2)

본문

윈도우 프로그래밍을 처음 공부한ㄴ 사람들이 한결같이 내놓는 불만은 "왜 이렇게 어렵냐?" 라는 것입니다. 막말로, C 에서는

printf("Hello World\\n") ;

요거 하나만 하면 글을 볼 수 있는데, 윈도우에서는 글자 하나를 보기 위해서 수많은 단계를 거쳐야 하기 때문입니다.

매킨토시의 출력 시스템이 QuickDraw 에서 QuartzExtreme 으로 이전하면서 수많은 그림 그리기 함수들이 새로 추가되었습니다. 기본 루틴들은 주로 Core Graphics 함수들이 담당하고 있고요, 그림을 다룰 때에는 Quartz2D 가 역할을 수행하고 있습니다. 쿼츠는 퀵드로우와는 전혀 다른 시스템이지요.

첫 번째 예제, 그리고 오늘 보는 예제도 계속해서 퀵드로우를 이용한 그림 그리기 루틴입니다. 쿼츠를 동원할 필요가 없는 간단한 프로그램, 그리고 Classic 과 호환되는 프로그램을 만들려면 퀵드로우를 써야 합니다.

그림 그리기, 그리고 글자 출력 루틴은 첫 번째 예제의 MyDraw() 함수를 보면서 어떻게 선분을 그리고 있는지, 글꼴을 어떻게 선택해서 어떻게 출력하고 있는지, 사용된 함수는 어떤 것인지를 하나하나 짚어보면 공부가 될 것입니다. 함수에 대한 도움말을 보고 싶으면 Option+마우스 하고 함수를 더블클릭하면 됩니다.

이번에는 마우스 이벤트를 받아서 마우스 좌표로 그림을 그리는 루틴입니다. 이벤트에 대해서는 추후에 좀 더 자세히 설명해 보도록 하고, 일단 오늘도 MyDraw.h 와 MyDraw.c 에 다음의 내용을 복사해서 붙여 넣으세요.

이왕이면 그냥 마우스로 주욱 긁어서 복사하지 말고 하나하나 타이핑해서 소스에 입력하는 것이 더 공부가 됩니다. ^^ (누구에게 하는 이야기인지는 알죠? ㅎㅎㅎㅎㅎ)

--- MyDraw.h ---

#include <Carbon/Carbon.h>


void InstallMyDraw( WindowRef window ) ;
OSStatus MyDrawEventHandler( EventHandlerCallRef myHandler,
                                                                        EventRef event,
                                                                        void *userData ) ;

void InstallMouseHandler( WindowRef window ) ;
OSStatus MyDrawMouseHandler( EventHandlerCallRef myHandler,
                                                         EventRef event,
                                                         void *userData ) ;
void MyDraw( WindowRef window ) ;


--- MyDraw.c ---

#include "MyDraw.h"

HIViewRef myHIView ;

void InstallMyDraw( WindowRef window )
{

        HIViewID myHIViewID = { 'mVue', 130 } ;
        EventTypeSpec        myHIViewSpec[] = {
        { kEventClassControl, kEventControlDraw },
        } ;
        OSStatus err ;
        
        HIViewFindByID( HIViewGetRoot( window ), myHIViewID, &myHIView ) ;
        
        err = InstallEventHandler( GetControlEventTarget( myHIView ),
                                                           NewEventHandlerUPP( MyDrawEventHandler ),
                                                           GetEventTypeCount( myHIViewSpec ),
                                                           myHIViewSpec,
                                                           (void *)myHIView,
                                                           NULL ) ;
        
        InstallMouseEvent( window ) ;
        
}



void InstallMouseEvent( WindowRef window )
{
        EventTypeSpec        mouseEventSpec[] = {
        { kEventClassMouse, kEventMouseDown },
        { kEventClassMouse, kEventMouseUp },
        { kEventClassMouse, kEventMouseMoved },
        { kEventClassMouse, kEventMouseDragged },
        { kEventClassMouse, kEventMouseWheelMoved },
        } ;
        OSStatus err ;
        
        err = InstallEventHandler( GetWindowEventTarget( window ),
                                                           NewEventHandlerUPP( MyDrawMouseHandler ),
                                                           GetEventTypeCount( mouseEventSpec ),
                                                           mouseEventSpec,
                                                           (void *)window,
                                                           NULL ) ;
        
}



OSStatus MyDrawEventHandler( EventHandlerCallRef myHandler,
                                                                        EventRef event,
                                                                        void *userData )
{

        OSStatus err = eventNotHandledErr ;
        
        switch( GetEventClass( event ) ) {
                case kEventClassControl :
                {
                        switch( GetEventKind( event ) )
                        {
                                case kEventControlDraw:
                                        MyDraw( (WindowRef)userData ) ;
                                        break ;
                        }
                        break ;
                }
                        
                default:
                        break ;
        }
        
        return err ;
        
}



OSStatus MyDrawMouseHandler( EventHandlerCallRef myHandler,
                                                         EventRef event,
                                                         void *userData )
{
        
        OSStatus err = eventNotHandledErr ;
        static Point wherefrom, whereto ;
        
        switch( GetEventClass( event ) ) {
                case kEventClassMouse :
                {
                        switch( GetEventKind( event ) )
                        {
                                case kEventMouseDown:
                                        err = GetEventParameter(event,
                                                                                          kEventParamMouseLocation,
                                                                                          typeQDPoint,
                                                                                          NULL,
                                                                                          sizeof(wherefrom),
                                                                                          NULL,
                                                                                          &wherefrom) ;
                                        GlobalToLocal(&wherefrom) ;
                                        break ;
                                        
                                case kEventMouseUp:
                                        err = GetEventParameter(event,
                                                                                          kEventParamMouseLocation,
                                                                                          typeQDPoint,
                        &nb
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 228,692
가입일 :
2003-02-18 14:12:30
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 9

향기님의 댓글

향기 220.♡.199.234 2005.12.17 11:47

타이핑할때 Xcode에서 대소문자를 구별하나요?

hongjuny님의 댓글

C/C++/Obj-C 는 모두 case-sensitive 입니다. 다시 말해서 대문자/소문자가 다른 뜻으로 쓰인다는 뜻이지요.

WindowRef window, Window, WINDOW, WiNdOw ;

요렇게 하면 네 변수 모두 다 다르게 선언됩니다. ^^

sunnyday님의 댓글

어쩜 내년엔 프로그래머로 job assign이 완전히 바뀔 것 같은데, 저런 어려운 것은 아니었으면 합니다.

악동시니님의 댓글

열심히 해보삼.. 흐흐흐.. 근데..홍준님.. 이것 좀더 많이 해주시죠..흐흐흐.. 공짜로 배우니 좋네요.. 카본말고.. 코코아도..흐흐흐..

악동시니님의 댓글

근데..누구한테 하는야근데요..그게 궁금.. 누구야.. 흐흐흐..

악동시니님의 댓글

잘되는구만유..하하하..

악동시니님의 댓글

실행해보니..경고가 두개 뜨는데..실행하는데는 문제가 없지만.. 그래도..흐흐흐..

hongjuny님의 댓글

오호, 소스에 타이포가 있군요. 헤더 파일에 있는 함수 정의 중에서

InstallMouseHandler 를
InstallMouseEvent 로 정정합니다.

저는 소스 철회는 안 합니다. ㅡㅡ;

악동시니님의 댓글

전체 1,227 건 - 25 페이지
2007.10
15

[기타질문] xcode 3.0 에서 클래스 생성 방법이 어떻게 되나요?

cocoa관련 프로그래밍 책을 샀는데 예제를 따라할려구 해도 인터페이스 빌더가 너무 차이가 나니 예제를 따라서 할수가 없더군요. 아마 책은 2.4.1버젼을 기준으로 설명이 되어 있는듯 합니다. ㅠ.ㅠ HELP파일을 봐도 도통…

2007.09
10

[기타질문] OS X 하위버전과 호환되게 만들려면 어떻게 해야 되나요?

OS X 타이거 만이 아닌 팬더, 재규어 등 그 이전의 mac os 와 호환되게 빌드하려면 어떻게 해야 되나요 그냥 빌드만 하면 되는줄 알았는데 동성님이 10.3에서 실행이 안된다 하드라구요. [UB로도...]

2007.08
16

[기타질문] 텍스트 입력을 받는 NSTextField 에서요...

블록 선택이 안 되고 오직 키보드 입력만 되게 하도록 만들려면 어떻게 해야 되나요 isSelectable 메소드를 사용하면 아예 입력이 안 되고.... 그리고 키보드 입력을 받을 때마다 액션을 내게 하려면 어떻게 해야 되지요

2007.08
07

[기타질문] 자동으로 운영체제 키보드 레이아웃을 바꾸는 법에 관해서...

제가 제 개인적인 필요 때문에 타자 연습 프로그램을 만들고 있는데요. 프로그램에서 한글이나 영어 언어를 선택하고 연습 할 때 그 때마다 운영체제의 키보드 레이아웃도 한글이나 영어로 맞춰줘야 되서 불편한데요. 프로그램에서 언…

2007.07
29

[기타질문] Chapter 7의 8쪽에서의 질문....(Cocoa Programming for Mac OS X 2/E)

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index { // Add the inverse of this operation to the undo stack NSUndo…

2007.07
16

[기타질문] helper object 에 관해서...

제가 코코아 책 보며 Helper Object 를 공부하는 중인데 아무리 생각해봐도 도무지 무엇인지 잘 이해가 되지 않습니다. 미숙한 번역실력 때문인듯.. 아무튼 제가 생각하는 helper object 는 클래스를 확장할 때 사용하는 객…

2007.07
01

[기타질문] Xcode 편집기에서 한글 입력할 때의 문제점에 대한 질문

안녕하세요. Xcode를 사용해서 ASCII 텍스트 형태의 소스 코드에 한글 주석을 입력하다 자꾸 특정 부분에서 아래와 같은 메시지 박스가 떠서 문자를 입력할 수가 없는데, 어떻게 하면 될지 그 해결 방법이 궁금합니다. 입력 문자열: 그…

2007.06
17

[기타질문] Cocoa 에 대한 질문..

코코아 책(정확히는 pdf...)을 열심히 보고 있는데.. 정확히 이해를 했는지 못했는지 몰라서.. 질문들을 올리겠습니다. 1. NSMutableArray *array; …

2007.06
06

[기타질문] 다시한번 질문.....

안녕하세요 아래 올렸던 내용과 비슷한데, 해결이 잘 안되서 다시 질문을 드립니다. 하드 디스크의 특정 디렉토리에서 파일의 유무를 검사해야 하는데요, 하드 디스크의 이름이 "ccc" 라면, open("ccc:어쩌구:파일", "r")…

2007.04
28

[기타질문] Dev C++에서 GLUT사용하는법을....

Visual Studio 쓰자니 다운하긴 좀 그렇고.. Express 는 아주 많이 부족하고... 그래서 Dev C++ 를 다운하려고 하는데요. 도대체 이걸로 GLUT프로그래밍 하는 법을 모르겠네요... 윈도우 어플로 GL 프로그래밍하는…

2007.01
27

[기타질문] OpenCV 1.0.0 Frameworks

wlee 님 뿐만 아니라 Mac 에서 이미지 프로세싱 관련 연구를 하시는 분들에게 유용한 툴이 될 듯 싶습니다. 좋은 라이브러리를 알게 되어 wlee 님께 감사말씀 드립니다. ^^ 물론 1.0.0 을 그대로 command-line 으로 컴파일해도…

2007.01
20

[기타질문] [질문] 외부 라이브러리 다시 한번 ~

질문 1. 외부 라이브러리를  External Frameworks and libraries 폴더에 추가하기 위해, 오른쪽 버튼 -> Add->existing files.. 를 선택해서…

2006.12
28

[기타질문] Xcode 에서 디버그 모드 ... 릴리즈 모드...

비주얼 스투디오에서는 빌드 아이콘 옆에 디버그 모드 릴리즈 모드 선택할 수 있어서 편했는데 Xcode 는 어떻게 하나요 오픈지엘 공부하면서 제가 만든 프로젝트들은 Build/Debug 디덱터리에 실행파일이 생기는데 책…

2006.12
22

[기타질문] [질문] XCODE에서 외부 라이브러리 가져다 쓸 때..

안녕하세요. 두 가지 질문을 하려고 합니다. 최근에 OpenGL 프로그래밍을 하고 있습니다. 쉐이더를 쓰려면 필요하다는 GLEW  라이브러리를 AGL 로 빌드된 것을 다운 받아 헤더는 /usr/lo…

2006.10
09

[기타질문] 2.4로 업데이트 했는데도 여전히 깨지네요ㅠㅠ(사진첨부)

인코딩만 UTF-8로 하고 딴건 안했습니다. 프로젝트는 java->javatool로 했고요 이유를 모르겠네요 일단 업데이트형식으로 설치했는데 그래서 그럴까요

2006.10
09

[기타질문] Xcode 한글 깨짐 문제 (마스터님 봐주세요)

위와 같은 코딩을 하는데... 한글의 경우 깨져서 나오는데 프로젝트는 javatool로 했습니다. 환경과 파일인코딩 모두 UTF-8로 했습니다. 그래도 깨지던데... 어떻게 해결해야 하나요.. *ps: 스윙이나 웹 말고 일반적인 …

2006.08
27

[기타질문] OpenGL 질문....

1. 임플리먼테이션이 머죠 2. 소프트웨어와 하드웨어의 차이 3. 파이프라인이 무엇이죠 4. 파이프라인의 구조 부탁드립니다

2006.08
22

[기타질문] 마유라 는 한글이 잘 되는군요. ^^

InputStreamReader 의 속성을 SJIS 에서 EUC-KR 로 바꾸는 방법으로 미와 고스트는 안되는데 마유라 고스트는 잘 되는군요. 인텔 맥에서도 문제없이 돌아가고 있습니다. 영환님도 이미 컴파일 해보셨겠지만, 안되었으면 한 번 …

2006.01
03

[기타질문] Xcode 2.2 에서 C++ 프로그래밍 하기

아직 초보라서 잘 모르는데 어떻게 하는지 알려주세요... Project를 어떤 것을 선택해야하는지...

2005.12
19

[기타질문] Xcode 2.2 에서 카본 프로그램 만들자 (3)

이번에는 본격적으로 Quartz 의 Core Graphics 를 이용해서 그림을 그려 보겠습니다. 참고 자료로는 애플 홈페이지에서 다운로드 받으실 수 있는 Quartz 2D Programming Guide 입니다. 프로그램의 기본 구조는 이…

2005.12
17

열람중 [기타질문] Xcode 2.2 에서 카본 프로그램 만들자 (2)

윈도우 프로그래밍을 처음 공부한ㄴ 사람들이 한결같이 내놓는 불만은 "왜 이렇게 어렵냐" 라는 것입니다. 막말로, C 에서는 printf("Hello World\\n") ; 요거 하나만 하면 글을 볼 수 있는데, 윈도우에서는 글자 하나를 보…

2005.12
16

[기타질문] Xcode 2.2 에서 카본 프로그램 만들자 (1)

Xcode 새 버젼의 카본 어플리케이션 템플릿이 좀 더 친절해졌더군요. 한편, 지금까지 자기 고유의 이벤트 핸들러를 갖고 계시던 분들에게는 더 힘들어 졌더군요. ㅠㅠ 자 해 봅시다. 일단. Xcode 를 실행하고, File->N…

2005.08
15

[기타질문] XCode 2.1로 Maya plug-in 개발하기..?

Maya 6.0에서 제공하는 Maya API를 이용하여 plug-in을 개발하려고 help문서를 뒤져보니.. xcode는 예제의 프로젝트 파일을 컴파일해보라고 나와있는데.. xcode의 버전때문인지 컴파일이 되질 않는군요..-.- MSVC로 프로…

2005.02
10

[기타질문] hdf5설치 성공하신 분 있나요?

라이브러리 설치 문제가 계속 걸려서 fink 를 이용해 봤습니다만, 안되는군요. :-( libpng, libjpeg 등을 모두 설치해도 h5utils 를 configure 하는 도중에 이 라이브러리들이 없다고 하는군요. hdf5 역…

2004.10
13

[기타질문] X Code에서 include 포함 파일이나 라이브러리 파일의 경로는 어떻게 지정하나요 ?

안녕하세요.. 비주얼 스튜디오 같은 곳에서는 포함 파일이나 라이브러리 파일을 옵션에서 설정해 줄 수 있었습니다. X Code 에서는 이를 어떻게 설정해 주어야 하나요 예를 들어 /Volumes/Data/SDKLib 라는 곳에…

2004.01
10

[기타질문] 투명처리 어떻게 하나요?

분명 투명하게 처리해서 tiff포멧 한건데요, 흰 바탕이 그대로 나와버리네요. - (void)drawRect : (NSRect)rect { NSImage *imgFile = [NSImage imageNamed:@"JinPict"]; …

2004.01
07

[기타질문] 왕초보 자바 질문요~

자바기초를 공부하려구 하는데요... 일단 윈도에서 도스모드로 컴파일 하는 기초적인 것들은 알구 있구요... xcode에서 컴파일하는 방법을 모르겠어요...--; xcode에서 새화일 선택해서 코딩한다음 빌드를 하고픈데 메뉴들이 전부 비활성화 …