지식
 

지식 : 팁사용기   새글 5점 / 간단한 글 5점 / 답글 5점

 
  total 글수 2362
Xcode 2.2 에서 카본 프로그램 만들자 (2)
hongjuny
조회수 : 1,903
댓글 9
2005-12-17 11:35:52
윈도우 프로그래밍을 처음 공부한ㄴ 사람들이 한결같이 내놓는 불만은 "왜 이렇게 어렵냐?" 라는 것입니다. 막말로, 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
애플 제품 구매 애플 교육할인 구매
짧은 주소  http://j.mp/er5toL  

댓글댓글 : 9   
준범이
2005-12-17 11:47:41
타이핑할때 Xcode에서 대소문자를 구별하나요?
hongjuny
2005-12-17 11:49:10
C/C++/Obj-C 는 모두 case-sensitive 입니다. 다시 말해서 대문자/소문자가 다른 뜻으로 쓰인다는 뜻이지요.

WindowRef window, Window, WINDOW, WiNdOw ;

요렇게 하면 네 변수 모두 다 다르게 선언됩니다. ^^
sunnyday
2005-12-17 22:08:23
어쩜 내년엔 프로그래머로 job assign이 완전히 바뀔 것 같은데, 저런 어려운 것은 아니었으면 합니다.
악동시니
2005-12-17 22:10:26
열심히 해보삼.. 흐흐흐.. 근데..홍준님.. 이것 좀더 많이 해주시죠..흐흐흐.. 공짜로 배우니 좋네요.. 카본말고.. 코코아도..흐흐흐..
악동시니
2005-12-17 22:10:53
근데..누구한테 하는야근데요..그게 궁금.. 누구야.. 흐흐흐..
악동시니
2005-12-17 22:20:32
잘되는구만유..하하하..
악동시니
2005-12-17 22:34:32
실행해보니..경고가 두개 뜨는데..실행하는데는 문제가 없지만.. 그래도..흐흐흐..
hongjuny
2005-12-17 23:03:21
오호, 소스에 타이포가 있군요. 헤더 파일에 있는 함수 정의 중에서

InstallMouseHandler 를
InstallMouseEvent 로 정정합니다.

저는 소스 철회는 안 합니다. ㅡㅡ;
악동시니
2005-12-17 23:09:18
굿잡..흐흐흐..




케이머그 이용 규정안내

신규사용자 이용안내

레벨제도 소개

Xcode 2.2 에서 카본 프로그램 만들자 (2) [지식 : 팁사용기] KMUG  
번호 제목 글쓴이 조회수 날짜
182
 데스크탑 화면 바꾸어 보기    베리 3264 2005/12/29
9:20 am
.
181
 환경설정-화면해상도 조절하기    베리 3014 2005/12/28
9:34 am
.
180
 환경설정에서 에너지절약 사용하기    베리 1981 2005/12/26
4:23 pm
.
179
 개인에 필요에 맞도록 시스템 환경설정하기    베리 2860 2005/12/24
8:54 pm
.
178
 dock에 자주 사용하는 프로그램 추가하기 덧글2    베리 2459 2005/12/24
8:53 pm
.
177
 dock 사용자 하기    베리 2235 2005/12/24
8:52 pm
..
176
 동영상 강좌 - 파인더 아이콘 바꾸어 보기    베리 2728 2005/12/22
1:47 pm
.
175
 동영상이 안보이시는 분...^^    베리 2514 2005/12/21
9:47 am
맥 사파리에서는 문제가 없는데요. 원도우 피씨에서 익스플로어에서 화면이 안보이네요. F5를 눌러서 새로고침을 여러번 하시기 바랍니다. 3-4번 하면 보여요... 원인은 분석중인데...꼭 찾아내겠습니다. ^^ 베리.
174
 동영상 강좌 - 파인더 원도우 사용자화 하기    베리 2634 2005/12/21
12:02 am
.
173
 동영상 강좌 - 휴지통 사용하기    베리 2491 2005/12/21
12:00 am
.
172
 동영상 강좌 - 빠른 파일 찾기    베리 2560 2005/12/20
11:59 pm
.
171
 동영상 강좌 - 홈폴더 사용하기    베리 2163 2005/12/20
11:57 pm
.
170
 동영상 강좌 - Mac os Dock 사용하기 덧글1    베리 3218 2005/12/20
11:55 pm
.
169
 동영상 강좌 - 파인더 사용하기 덧글2    베리 2358 2005/12/20
11:54 pm
.
168
 동영상 강좌 - 주소록 사용해보기    베리 2542 2005/12/20
11:03 am
.
167
   응용문제 덧글1 이미지    hongjuny 2024 2005/12/20
1:19 am
예전에 대입 학력고사에 본고사가 있던 시절, 서울대 본고사 문제에 나왔다는 전설의 그 문제! 사이클로이드라는 것이 있습니다. 이 예제는 사이클로이드와 똑같지는 않지만 대략 비슷한 원리입니다. 자전거 바퀴살에 불을 하나 달고 밤...
166
 Xcode 2.2 에서 카본 프로그램 만들자 (3) 덧글2 이미지    hongjuny 3180 2005/12/19
7:52 am
이번에는 본격적으로 Quartz 의 Core Graphics 를 이용해서 그림을 그려 보겠습니다. 참고 자료로는 애플 홈페이지에서 다운로드 받으실 수 있는 Quartz 2D Programming Guide 입니다. 프로그램의 기본 구조는 이...
 Xcode 2.2 에서 카본 프로그램 만들자 (2) 덧글9    hongjuny 1903 2005/12/17
11:35 am
윈도우 프로그래밍을 처음 공부한ㄴ 사람들이 한결같이 내놓는 불만은 "왜 이렇게 어렵냐?" 라는 것입니다. 막말로, C 에서는 printf("Hello Worldn") ; 요거 하나만 하면 글을 볼 수 있는데, 윈도우에서는 글...
164
 Xcode 2.2 에서 카본 프로그램 만들자 (1) 덧글13    hongjuny 2270 2005/12/16
12:32 pm
Xcode 새 버젼의 카본 어플리케이션 템플릿이 좀 더 친절해졌더군요. 한편, 지금까지 자기 고유의 이벤트 핸들러를 갖고 계시던 분들에게는 더 힘들어 졌더군요. ㅠㅠ 자 해 봅시다. 일단. Xcode 를 실행하고, File->N...
163
사용기  [Apple] Mac mini 리뷰 덧글9 이미지    김영권 11280 2005/12/15
11:25 am
2005년 1월 11일. 애플은 세계를 깜짝 놀라게 할 만한 새로운 매킨토시 시스템인 Mac mini를 발표하였다. Mac mini 가 발표된후 지금까지 경험할 수 없었던 슬림한 사이즈로인해 많은 화제를 불러일으켰다. 슬림한 사...



KMUG서비스안내    비욘드테크소개    광고/제휴    연락처/오시는길    공지사항    회원레벨가이드    사이트맵
Copyright ⓒ kmug.co.kr 2000~2019. All rights reserved 개인정보취급방침
지식 : 팁사용기