336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Protocol Java interface 같다 어떤 protocol 따르는(adopting하는클래스는 protocol에서 선언된 모든 메소드들을 구현해야한다.


  다음은 object copy하는 copyWithZone 메소드가 담긴 NSCopying protocol 선언과 이것을 adopt하는 클래스의 @interface이다.


    @protocol NSCopying


    - (id) copyWithZone: (NSZone*) zone;


    @end



    @interface Car : NSObject <NSCopying> // <NSCopying, NSCoding> 같이 

                                                                // 여러개의 protocal adopt 수도 있다.

    {

        // instance variables...

    }


    // methods...

    // protocol 안에 선언되어 있는 메소드는 따로 다시 선언할 필요 없다.


    @end



  copyWithZone 메소드의 zone 할당할 메모리 영역을 나타내는 NSZone 타입의 매개변수이다. object copy 메소드를 호출할 경우내부적으로 copyWithZone 메소드로 변환되어 호출된다따라서 클래스에 따라  copyWithZone 메소드를 구현함으로써  클래스에 맞는 올바른 copy 되도록   있다.


  다음은 <NSCopying> adopt하여 deep copy 되도록 하는 Engine, Tire, Car 클래스의 copyWithZone 메소드 구현이다.@interface 부분은 생략하겠다.


    @implementation Engine


    - (id) copyWithZone: (NSZone*) zone

    {

        /* allocWithZone 메소드는 NSObject 클래스의 class method로서

         * 해당 클래스의 새로운 객체를 생성한다.

         * 객체 자신이 아닌 [self class] 사용함으로써 

         * subclass 역시 [super copyWithZone] 호출하여 copy 사용할  있다. */

        // Engine instance variable 가지지 않으므로 instance variable copy 과정 없이

        // 바로 init으로 초기화하면 된다.

        Engine* engineCopy = [[[self classallocWithZone:zone] init];

        return engineCopy;

    }


    @end


    @implementation Tire


    - (id) copyWithZone: (NSZone*) zone

    {

        Tire* tireCopy = [[[self classallocWithZone: zone]

                          initWithPressure: pressure treadDepth: treadDepth];

        return tireCopy;

    }


    @end


    @implementation Car


    - (id) copyWithZone: (NSZone*) zone

    {

        Car *carCopy = [[[self classallocWithZone: zone] init];

        

        carCopy.name = self.name;

        

        // engineCopy copy 의해 생성된 것이므로 memory management rule 의하여 release까지 책임을 져야 한다.

        // 여기에서는 autorelease 걸어주었다.

        Engine* engineCopy = [[engine copyautorelease];

        carCopy.engine = engineCopy;

        

        int i;

        for(i = 0; i < 4; i++)

        {

            Tire* tireCopy = [[self tireAtIndex: i] copy];

            // tire역시 copy 생성되었으므로 autorelease 걸어준다.

            [tireCopy autorelease];

            

            [carCopy setTire:tireCopy atIndex:i];

        }

        

        return carCopy;

    }


    @end




  앞서 id 타입은 어떠한 object 가리킬  있는 generic 타입이라고 설명하였다다음과 같이 id protocol 붙여줌으로써 protocol 만족하는 object들만을 가리키게   있다.


    - (void) setObjectValue: (id<NSCopying>) obj;



  Objective-C 2.0 이후부터는 protocol 선언에 @optional @required라는 modifier 추가되었다@optional  구현하지 않아도 괜찮은 메소드들을 나타내고( 장에서 설명한 informal protocol처럼), @required 기존의 protocol 선언된 메소드들처럼  구현되어야 하는 메소드들을 나타낸다


    @protocol BaseballPlayer


    - (void) slideHome;

    - (void) catchBall;

    - (void) throwBall;


    @optional

    - (void) drawHugeSalary;


    @required

    - (void) swingBat;


    @end




Reference

[1] Dalrymple. M., Learn Objective-C on the Mac, Apress.



블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
[문제점]Code Sign error: Provisioning profile '*' specifies the Application Identifier '*' which doesn't match the current setting '*'

The executable was signed with invalid entitlements. The entitlements specified in your application's Code Signing Entitlements file do not match those specified in your provisioning profile.

 (0xE8008016).


[해결방법]

1. File -> New File ->  Code Signing -> Entitlements -> *.plist 생성
2. Project  -> Edit Project Setting -> Build -> Code Signing -> Code Signing Entitlements -> *.plist 로 수정..


'Programming > Mac' 카테고리의 다른 글

IOS Provisioning Portal (아이폰에 앱 올리기 정리)  (2) 2011.01.04
블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

IOS Provisioning Portal 에 오신걸 환영합니다.

본 내용은 개인개발자등록이 아닌 Team 개발자 등록을 목적으로 작성되었습니다. IOS Provisioning Profile 목적은 한마디로 정의해서 개발자 혹은 개발팀에서 개발한 프로그램을 Apple Device (iPhone, iPod touch 등) 에 올리기 위한등록과정입니다. 물론 상업적인 목적인 경우는 AppStore 에 최종배포를 할 수도 있으며 이와 별도로 Mac개발이나 Safari개발인 경우에도 개발등록을 해야 애플제품 프로그램을 배포할 수 있습니다.

제품을 만든다면 반드시 장치에 올려봐야 하는데, 그 이유는 시뮬레이터에서는 Accelerometer, 가속도계, 카메라 사용 그리고 위치기반 서비스 등 서비스가 매우 제한적이기 때문이다.

궁극적으로는 진행하는 모든 작업은 ‘프로비저닝 프로파일(Provisioning Profile)을 얻기 위한 것

[원본파일] IOS Developer Program- Standard Program User Guide for IOS 4 ver2.7

1. https://developer.apple.com/ios/manage/overview/index.action

2. iPhone 개발자 ID와 PW 입력

(등록이 안되었다면 Apple Developer Connection (http://developer.apple.com) 에서 팀개발 등록)

3. https://developer.apple.com/membercenter/index.action > Invitations 팀멤버를 등록.

3.1. Program & Add-on 에서 개발팀이 개발하고자하는 분야(Mac 개발, iPhone 개발, Safari 개발)를 선택 결정.( 각 개발별 99$/1년 소요되며 Safari 개발은 무료임.)

Team Group (팀멤버구성)

  • Team Agent : 아이폰 개발자 프로그램에 최초 가입하고 애플과의 계약서에 사인한 어드민이며 배포하는 모든 제품에 대한 법적인 책임을 진다. 그러므로 모든 배포는 Agent를 통해서만 가능하다. 에이전트는 어드민과 멤버를 추가할 수 있으며 인증서 발급을 승인하고, 패포용 프로비저닝 프로파일을 관리할 수 있다.
  • Team Admin : 다른 어드민과 멤버를 추가하고 관리할 수 있으며 멤버로부터의 인증서 발급신청을 승인할 수 있고 아이폰/아이팟 터치를 프로그램 포털에 등록 할 수 있다. 하지만 배포용 인증서를 만들 수 없으므로 배포는 할수 없다.
  • Team Member : 개발용 인증서를 신청할 수 있으며, Provisioning Profile을 이용해 개발장치에 프로그램을 인스톨할 수 있다.
  • 개인개발자 등록과정은 1인이 Admin, Agent, Member 되는 것으로 별도의 팀을 만들수는 없다.

Certificates (인증서발급)

Certificates

팀멤버라면 개별적으로 iOS 개발 인증서를 요청하여 발급 받아야합니다.

1. 인증서 발급 요청서를 만들기. ( Utility 폴더> Keychain Access )

2. 키체인 접근 > 환경설정 클릭

3. 키체인 접근 > 인증지원 > 인증기관에서 인증서 요청…

4. 인증서 신청하는 멤버의 이메일과 save to disk 선택

(공개키까지 함께 관리하기 원한다면 “자시의 키페어 정보 지정”선택)

5. 공개키페어 정보 2048bits와 RSA 알고리즘 지원

Devices (디바이스 등록)

개발한 에플리케이션을 아이폰 장치에 올려보려면 장치의 정보가 프로그램 포털에 등록되어 있어야 한다.

등록은 프로그램 가입 후 언제든지 추가할 수 있지만 등록한 장치정보를 삭제하는 것은 일년에 한 번 프로그램 갱신할떄만 가능합니다. 관리하는 아이폰 장치가 많다면 애플이 제공하는 별도의 프로그램(iPhone Configuration Utility)을 이용해 일괄 등록할 수도 있다.

1. 개발장비의 UDID (Unique Device Identifier) 40 HEX문자열을 취득함.

  • Organizer 를 통해서 취득방법

  • iTunes 를 통해서 취득방법

2. 개인장비 등록하기

  • 장비명칭(장비명칭은 가급적 영어로 기재)을 기재후 UDID 등록

ADD ID (애플리케이션 구분 아이디 만들기)

AppStore나 사용자의 아이폰 환경에서 애플리케이션을 구분하기 위해 사용하는 문자열입니다. com.yourcompany.AppID 역순으로 적은 뒤 애플리케이션 실행 파일이름을 붙입니다. 다양한 애플리케이션을 하나의 App ID로 묶으려면 프로그램 포털에서 실행파일 이름을 와일드 카드 문자(*)로 정해줍니다.

ex) com.google.*

Provisioning (프로비져닝 프로파일 만들기)

프로비저닝 프로파일은 우리가 프로젝트를 빌드하면서 포함시켜야 하는 정보로서 인증서와 정치정보 그리고 App ID를 모두 포함되고 있다. 프로비저닝 프로파일을 만들면서 인증서와 App ID 그리고 개발장비를 체크해 주면 됩니다.

프로비저닝 프로파일 3가지 종류

  • 개발용 프로파일 : 개발 테스트 목적으로 준비된 프로파일.
  • 배포용 프로파일 : 임시배포용(Ad-Hoc)과 App Store 등록용 프로파일로 구분. 배포용 인증서는 에이전트만 할수 있습니다.

1. 프로비저닝 프로파일 생성

Profile Name은 통상적으로 프로젝트 이름을 명시합니다.

2. 프로비젼 프로파일을 다운로드받아서 Xcode > Organizer 의 Provisioning 위에 삽입(+ 키버튼)

3. Xcode 빌드 & 인스톨

  • Build 선택을 Device 4.x 와 Debug or Release 를 선택합니다.
  • Target > Copy Bundle identifier > Add ID 세팅(예 com.google.* or com.google.iAdSample)
  • Target 을 선택해서 애플리케이션 프로퍼티스의 identifier 를 수정합니다.

4. Xcode > Project > Edit Project Setting > Build

  • Code Signing > Any iPhone OS Device 에서 등록된 프로비젼 파일을 선택합니다.

자 여기까지 오시느라 수고했습니다.

나의 아이폰에 어플리케이션이 제대로 들어간것이 확인되면 성공입니다.


[출처] COM+EDDY'S BLOG

블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

디렉토리를 생성할때 디렉토리가 생성되어 있는지 검사도 해야 한다.

Directory 나 DirectoryInfo 를 사용하면 디렉토리 생성 및 검사도 가능하다.

방법#1

if (Directory.Exists(rootPath) == false)

    Directory.CreateDirectory(rootPath);

방법#2

DirectoryInfo di = new DirectoryInfo(rootPath);

if (di.Exists == false)

{

    di.Create();

}



블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
UIview
- 아이폰 화면에 보여지는 대부분은 View
 색, 그림, 버튼들을 가질 수 있다
- 드래그, 크기 조정,  등이 가능
- UIView는 GUI를 구성하는 단위 블록
- UIWindow는  UIView
01.//parentView(상위뷰)에 childView(하위뷰) 추가
02.[parentView addSubview:childView];
03. 
04.//parentView(상위뷰)가 가진 하위뷰들의 배열을 가져오기 (가장 뒤부터 가장 앞까지)
05.[parentView subview];
06. 
07.//childView(하위뷰)를 자신이 속한 상위뷰로부터 제거
08.[childView removeFromSuperview];
09. 
10.//i번째에 있는 하위뷰를 j번째에 있는 하위뷰와 순서를 바꿈
11.[parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j];
12. 
13.//View의 투명도 조정 (value값은 0.0[완전투명]부터 1.0[완전불투명]까지)
14.[myView setAlpha:0.5];
15. 
16.//뷰의 배경색 지정
17.[myView setBackgroundColor:[UIColor redColor]];


CGPoint
- 포인트는  y 좌표로 정의된 위치를 말한다.
1.//x, y의 CGPoint를 생성한다.
2.CGPointMake(x, y);
3. 
4.//CGPoint를 문자열로 변환한다.
5.NSStringFromCGPoint(someCGPoint);
6. 
7.//문자열을 CGPoint로 변환한다.
8.CGPointFromString(aString);
 

CGSize
- 폭과 높이를 가지는 구조체
1.//width, height의 CGSize를 생성한다.
2.CGSizeMake(width, height);
3. 
4.//CGSize를 문자열로 변환한다.
5.NSStringFromCGSize(someCGSize);
6. 
7.//문자열을 CGSzie로 변환한다.
8.CGSizeFromString(aString);

 
CGRect
- 모든 View는 경계를  데 프레임을 사용한다.
- 프레임은 뷰의 위치, 폭, 높이와 같은  지정한다.
- 코어 그래픽 구조를 사용하여 프레임 직사각형을 정의한다.
 보통 시작점(CGPoint)과 크기(CGSize)로 구성된다.
01.//직사각형 정의
02.CGRectMake(origin.x, origin.y, size.width, size,height);
03. 
04.//CGRect 구조체를 특정 형식을 가진 문자열로 변환한다.
05.NSStringFromCGRect(someCGRect);
06. 
07.//위의 코드로 변환된 특정 형식을 가진 문자열을 CGRect구조체로 복구한다.
08.CGRectFromString(aString);
09. 
10.//직사각형의 위치에서 직사각형의 크기만큼 외곽을 잘라내거나 덧붙인 가운데 정렬된 직사각형을 만든다. 양수로는 잘라내고 음수로는 덧붙여 만들게 된다.
11.CGRectInset(aRect);
12. 
13.//직사각형 구조체 rect1과 rect2가 겹치는지 알 수 있다.
14.CGRectIntersectsRect(rect1, rect2);
15. 
16.//(0,0)에 가로, 세로 길이가 0인 직사각형 상수
17.CGRectZero;



Reference :  iPhone Developer's Cookbook - Erica Sadun

블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[Objective-C]NSArray, NSMutableArray객체

[Objective-C] 2009/01/05 14:15
NSArray는 다른 객체 포인터들의 목록이다.

- 자주 사용되는 메소드
- (unsigned)count -> 현재 배열의 객체의 수를 리턴한다.
- (id)objectAtIndex:(unsigned)i -> i번째 위치한 객체를 리턴한다.
- (id)lastObject -> 현재 배열의 맨 마지막 객체를 리턴한다.
- (BOOL)containsObject:(id)anObject -> 현재의 배열에 anObject오브젝트를 포함하면 YES 아니면 NO
- (unsigned)indexOfObject:(id)anObject -> 리시버에서 anObject가 있는지 가장 낮은 색인부터 검색하  여 배열의 색인 값을 리턴한다. 찾지 못하면 NSNotFound를 리턴한다.

- NSMutableArray는 NSArray를 상속받았지만 객체를 삽입하고 삭제할 수 있도록 확장되었다.

자주 사용되는 메소드

             - (void)addObject:(id)anObject -> anObject를 리시버의 끝에 삽입한다. nil배열은 넣을 수 없다.

 - (void)addObjectsFromArray:(NSArray *)otherArray ->

 - (void)insertObject:(id)anObject atIndex:(unsigned)index -> 

             - (void)removeAllObjects -> 리시버에 포함된 모든객체를 제거한다.
             - (void)removeObject:(id)anObject -> 리시버 배열 안의 anObject를 삭제한다.
             - (void)removeObjectAtIndex;(unsigned)index -> index의 객체를 제거한다.


[출처] 마음으로 보는 블로그

블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


object-c에서의 메모리 관리는 레퍼런스 카운트 (reference count)를 이용합니다.

모든 객체는 자신을 참조하는 수에 대한 내부 카운터를 가지고 있습니다.


-alloc : 해당 객체에 메모리를 할당하고 레퍼런스 카운트를 1 올립니다.

-retain : 해당 객체의 레퍼런스 카운트를 1 올립니다.

-copy : 해당 객체의 복사본을 만듭니다. 그리고 복사본의 레퍼런스 카운트를 1 올립니다.

-release : 해당 객체의 레퍼런스 카운트를 1 낮춥니다.

-autorelease : 정해지지 않은 시점에 해당 객체의 레퍼런스 카운트가 -1 낮아집니다.


규칙

1. 블록 내에서 alloc, retain, copy의 수와 release, autorelease 수가 동일해야 합니다.

2. factory 함수를 사용해 생성한 객체의 경우는 대부분 autorelease로 반환됩니다. 따로 release를 할 필요가 없습니다.

3. 클래스의 인스턴스 변수들은 dealloc 메소드에서 다 release해야 합니다.


예1. dealloc


- (void) dealloc

{

[vid release];

[title release];

}


예2. 로컬블록


{

NSString *name = [[NSString alloc] initWithString:@"Dreaming"];

NSString *co = [NSString stringWithString:"daum"];

NSString *book = @"iPhone Book";


//alloc만 release하면 됩니다.

[name release];

}


예3. autorelease 블록지정 : 해당블록의 autorelease메시지를 받은 객체들은 autorelease가 release되자마자 메모리에서 사라집니다.


NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

~~~

~~~

~~~

[pool release];


예4. 다양한 예


-(void) resetTitle

{

//alloc으로 인해 1 올라감

NSString *newTitle = [[NSString alloc] initWithString:@"A"];

[self setTitle:newTitle];    //접근자 사용

[newTitle release];         //메모리에서 제거

}


-(void) resetTitle

{

//factory함수로 autorelease가 됨, release할 필요 없음.

NSString *newTitle = [NSString stringWithString:@"A"];

[self setTitle:newTitle];      //접근자사용

}


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [NSNumber numberWithInt:i];

[array addObject:n];

}


NSNumber인 n을 생성했고 autorelease 메시지를 받아 언젠가 레퍼런스 카운트가 0으로 되어 사라질 것 같습니다만, 배열에 추가하는 addObject는 받는 인자를 바로 retain합니다. 그러니 한시적으로 레퍼런스 카운트가 2가 됩니다만 pool이 비워질 때 1이 되고, 배열이 사라질때 0이 됩니다.


NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];

int i;


for ( i = 0; i < 10; i++)

{

NSNumber *n = [[NSNumber alloc] initWithInt:i];

[array addObject:n];

[n release];

}


[출처]새카만곰돌이님의 블로그

블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

  
void __fastcall ScrollBoxPaintTo(TScrollBox *ScrollBox,HDC DC,int X,int Y,int Wid,int Hei) 

    int I, EdgeFlags, BorderFlags, SaveIndex; 
    TRect R; 

    ScrollBox->ControlState=ScrollBox->ControlState<< csPaintCopy; 
    MoveWindowOrg(DC, X, Y); 
    IntersectClipRect(DC, 0, 0, Wid, Hei); 

    BorderFlags = 0; 
    EdgeFlags = 0; 

    if( GetWindowLong(ScrollBox->Handle, GWL_EXSTYLE) & WS_EX_CLIENTEDGE != 0 ) 
    { 
        EdgeFlags  = EDGE_SUNKEN; 
        BorderFlags = BF_RECT | BF_ADJUST; 
    } 
    else if( GetWindowLong(ScrollBox->Handle, GWL_STYLE) & WS_BORDER != 0 ) 
    { 
        EdgeFlags = BDR_OUTER; 
        BorderFlags = BF_RECT | BF_ADJUST | BF_MONO; 
    } 

    if( BorderFlags !=0) 
    { 
        R=Rect( 0, 0, Wid, Hei); 
        DrawEdge(DC, &R, EdgeFlags, BorderFlags); 
        MoveWindowOrg(DC, R.Left, R.Top); 
        IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top); 
    } 

    //일반 캡쳐의 경우 ... 
    //scroll전체 캡쳐를 위해 빼버림 
// ScrollBox->Perform(WM_ERASEBKGND, (int)DC, 0); 
// ScrollBox->Perform(WM_PAINT, (int)DC, 0); 

    for ( int i=0;i< ScrollBox->ControlCount;i++) 
    { 
        if(ScrollBox->Controls[i]->Visible) 
        { 
            if(ScrollBox->Controls[i]->InheritsFrom(__classid(TWinControl))) 
            { 
                ((TWinControl *)ScrollBox->Controls[i])->PaintTo(DC,ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position ,ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position); 
            } 
            else if(ScrollBox->Controls[i]->InheritsFrom(__classid(TGraphicControl))) 
            { 
                 MoveWindowOrg(DC, ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position, ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position); 
                ((TGraphicControl *)ScrollBox->Controls[i])->Perform(WM_PAINT,(int)DC,0);// PaintTo(DC,ScrollBox->Controls[i]->Left+ScrollBox->HorzScrollBar->Position ,ScrollBox->Controls[i]->Top+ScrollBox->VertScrollBar->Position); 
                 MoveWindowOrg(DC, -ScrollBox->Controls[i]->Left-ScrollBox->HorzScrollBar->Position, -ScrollBox->Controls[i]->Top-ScrollBox->VertScrollBar->Position);//MoveWindowOrg(DC, R.Left, R.Top); 
            } 
        } 
    } 
    ScrollBox->ControlState=ScrollBox->ControlState>>csPaintCopy;// Exclude(FControlState, csPaintCopy); 



Graphics::TBitmap * __fastcall GetScrollBoxImage(TScrollBox *ScrollBox) 

    if(ScrollBox==NULL)return NULL; 

    Graphics::TBitmap *bmp=NULL; 
    TRect rc=Rect(0,0,ScrollBox->HorzScrollBar->Range,ScrollBox->VertScrollBar->Range); 

    bmp=new Graphics::TBitmap; 

    bmp->Width=ScrollBox->HorzScrollBar->Range; //ScrollBox->ClientWidth; 
    bmp->Height=ScrollBox->VertScrollBar->Range; //ScrollBox->ClientHeight; 
    bmp->Canvas->Brush = ScrollBox->Brush; 
    bmp->Canvas->FillRect(rc);//ScrollBox->ClientRect); 
    bmp->Canvas->Lock(); 

    try 
    { 
        int Ofs=0; 
        if(GetWindowLong(ScrollBox->Handle, GWL_STYLE) & WS_BORDER ) 
            Ofs = -1;  // Don't draw form border 
        else 
            Ofs = 0;  // There is no border 

        ScrollBoxPaintTo(ScrollBox,bmp->Canvas->Handle,Ofs, Ofs, rc.right,rc.bottom); 
    // ScrollBox->PaintTo(bmp->Canvas->Handle, Ofs, Ofs); 

    } 
    __finally 
    { 
        bmp->Canvas->Unlock(); 
    } 

    return bmp; 

void __fastcall TForm3::Button5Click(TObject *Sender) 

    Graphics::TBitmap *bmp; 

    bmp=GetScrollBoxImage(ScrollBox1); 
// bmp->SaveToFile("C:\\TestScrollBoxImage.bmp"); 
    Image1->Picture->Bitmap->Assign(bmp); 
    Image1->AutoSize=true; 
    delete bmp; 

//---------------------------------------------------------------------------
     

 

 

추가   08-11-25

출처  http://www.delphi.co.kr/zboard/view.php?id=qanda&page=1&page_num=20&select_arrange=headnum&desc=&sn=off&ss=on&sc=on&keyword=&no=115191&category=

 

http://delphi.newswhat.com/geoxml/forumhistorythread?groupname=borland.public.delphi.graphics&messageid=40446566$1@newsgroups.borland.com

 

 

  
procedure Tform1.PaintControl( aControl: TWinControl; aCanvas: TCanvas; offsetx, offsety: Integer ); 
begin 
   SaveDC( aCanvas.handle );  
   try  
      SetWindowOrgEx( aCanvas.handle, - (acontrol.left + offsetx), - (acontrol.top + offsety), nil );  
      acontrol.perform( WM_PRINT, acanvas.handle, PRF_CHILDREN or PRF_CLIENT or PRF_NONCLIENT or PRF_ERASEBKGND );  
   finally  
      RestoreDC( aCanvas.handle, - 1 );  
   end;  
end;  


procedure Tform1.Button1Click(Sender: TObject);  
var  
 bmp: TBitmap;  
 i: integer;  
begin  

  bmp := TBitmap.Create;  
  try  
    bmp.width := scrollbox1.HorzScrollBar.Range;  
    bmp.height := scrollbox1.VertScrollBar.Range;  

    bmp.canvas.lock;  
    SetMapMode( bmp.canvas.handle, MM_ISOTROPIC );  
    SetWindowExtEx( bmp.canvas.handle, 400, 400, nil );  
    SetViewportExtEx( bmp.canvas.handle, 400, 400, nil );  
    try  
      SetWindowOrgEx( bmp.canvas.handle, - scrollbox1.HorzScrollBar.Position, - scrollbox1.VertScrollBar.POsition, nil );  
      bmp.Canvas.Brush := scrollbox1.Brush; 
      bmp.Canvas.FillRect(Rect(0,0,bmp.width,bmp.height)); 
      scrollbox1.perform( WM_PAINT, bmp.canvas.handle, 1 );  
      SetWindowOrgEx( bmp.canvas.handle, 0, 0, nil );  
      for i := 0 to scrollbox1.controlcount - 1 do  
         if scrollbox1.Controls[i] is TWincontrol then  
            Paintcontrol(TWincontrol(scrollbox1.Controls[i]), bmp.canvas, scrollbox1.horzscrollBar.Position, scrollbox1.vertScrollBar.Position ); 
    finally  
         bmp.canvas.unlock;  
    end;  

    bmp.SaveToFile('c:\test.bmp');  
  finally  
    bmp.free;  
  end;  

end; 
     

 

추가 08-12-02

위 델파이 버젼 코드를 다시 좀 수정 했습니다.

다른사람코드를 거의 그대로 복사해 넣다보니 쓸데없는 부분이 좀 있네요

다음은 수정한 코드입니다.

 

  
function GetScrollBoxImage(ScrollBox:TScrollBox):TBitmap; 
var 
  bmp: TBitmap; 
  i: integer; 
  wCtrl:TWinControl; 

  function iMax(iVal1,iVal2:Integer):Integer; 
  begin 
    if iVal1>iVal2 then Result:=iVal1 
    else Result:=iVal2; 
  end; 
begin 

  Result:=nil; 
  bmp := TBitmap.Create; 

  // bitmap을 Scroll-Range 크기만하게 만들어준다. 
  // Scroll-Range가 ScrollBox의 원래크기보다 작은경우가 잇으므로 Max값으로 한다. 
  bmp.width := iMax(ScrollBox.HorzScrollBar.Range,ScrollBox.Width); 
  bmp.height :=iMax(ScrollBox.VertScrollBar.Range,ScrollBox.Height); 

  bmp.canvas.lock; 

  //ScrollBox의 Brush를 이용해서 배경을 그려준다. 
  bmp.Canvas.Brush := ScrollBox.Brush; 
  bmp.Canvas.FillRect(Rect(0,0,bmp.width,bmp.height)); 

  //ScrollBox의 이미지 즉 ScrollBox와 그위에 올려진 GraphicControl의 그린다. 
  //그릴때 현재 ScrollBar의 위치만큼 DC의 Offset을 설정하고 그린다. 
  SetWindowOrgEx( bmp.canvas.handle, - ScrollBox.HorzScrollBar.Position, - ScrollBox.VertScrollBar.POsition, nil ); 
  ScrollBox.perform( WM_PAINT, bmp.canvas.handle, 0 ); 

  //ScrollBox위에 모든 Window-Control을 그려준다. 
  for i := 0 to ScrollBox.controlcount - 1 do 
  begin 
     if ScrollBox.Controls[i] is TWincontrol then 
     begin 
      wCtrl:=TWinControl(ScrollBox.Controls[i]); 
      SaveDC( bmp.Canvas.Handle ); 
      SetWindowOrgEx( bmp.Canvas.Handle, - (wCtrl.Left + ScrollBox.horzscrollBar.Position), - (wCtrl.Top +  ScrollBox.vertScrollBar.Position), nil );
      wCtrl.Perform(WM_PAINT,bmp.Canvas.Handle,0); 
      RestoreDC(bmp.Canvas.Handle,-1 ); 
     end; 
  end; 

  bmp.canvas.Unlock; 
  Result:=Bmp; 
end; 

//사용예 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  bmp:TBitmap; 
begin 
  bmp:=GetScrollBoxImage(ScrollBox1); 
  Image2.Picture.Bitmap.Assign(bmp); 
  Image2.AutoSize:=true; 
  bmp.free; 
end;
     

 



[출처]

http://cafe.naver.com/bcbmaster.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=759

블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
DateTime oldDate = new DateTime(2002,7,15);
DateTime newDate = DateTime.Now;

// Difference in days, hours, and minutes.
TimeSpan ts = newDate - oldDate;
// Difference in days.
int differenceInDays = ts.Days;

Console.WriteLine("Difference in days: {0} ", differenceInDays);
블로그 이미지

By훈트

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

C#에서 윈도우즈의 해상도를 가져오는 방법은 다음과 같다.

1. 

Screen.PrimaryScreen.Bounds.Width
Screen.PrimaryScreen.Bounds.Height

 

2.

System.Windows.Forms.SystemInformation.VirtualScreen.Width;

System.Windows.Forms.SystemInformation.VirtualScreen.Height;


이를 이용해 폼을 윈도우즈의 정중앙에 띄울수 도 있다.

 

this.Location = new Point(

   Screen.PrimaryScreen.Bounds.Width/2 - this.Size.Width/2,

   Screen.PrimaryScreen.Bounds.Height/2 - this.Size.Height/2

); 

 
1, 2 의 차이점은 듀얼모니터를 쓸경우 1은 모니터 1대의 해상도를 가져오고 2는 2대를 합한 총 해상도를 가져옵니다.


블로그 이미지

By훈트

,