• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
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 로 정정합니다.

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

악동시니님의 댓글

전체 27 건 - 1 페이지