2011년 4월 19일 화요일

안드로이드 Android GPS 개발시 좌표 지정하는 방법

요즘 Professional Android2 Application Development 를 보고 있는데
GPS프로그래밍을 하면서 가상 좌표를 안드로이드 에뮬레이터에 넣는것에 막혀 있었다.
책에있는 코드를 휴대폰에 넣으면 잘 동작한다.

해결방법은

1. Setting - Application - Development - Allow mock locations 체크해제를 하면 GPS가 동작 가능 상태가 된다.

2. Location & sequrity - Use GPS satellites 체크되어 있는지 확인하고,

3. Eclips 메뉴 - Window - Open Perspective - DDMS 를 선택하면 나오는 창에서 Emulator control 하단에 Manual Tab 에서 [Send]버튼을 누르면 해당 좌표가 GPS좌표로 설정된다.

* 이때 Manual tab의 항목이 disable 되어 있으면 Devices 창 우측의 STOP 버튼을 눌러준다.

* 인터넷 검색중에 Setting - Date & Time 에서 Automatic 체크해제하고 time zone 을 seoul로 설정하라는 글을 봤는데 안해도 무방했음. but 설정을 하면 시간이 정확하게 나와서 좋음

* 안드로이드 에뮬레이터 : Android 2.2 - API Level 8
* Eclipse IDE for Java Developers : Helios Service Release 2

2011년 4월 11일 월요일

MFC에서 GDI+ 사용하기

1. Anti alias 라인을 그리기 위한 GDI+ 를 사용

Step1. stdafx.h 에 선언추가

#include
#pragma comment(lib, "gdiplus")
using namespace Gdiplus;



Step2. 초기화

[ProjectName]App.c 파일의 InitInstance() 함수에 초기화를 추가한다.

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

그리고 아래 두 라인을 광역변수로 추가한다.

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;



Step3. 정리

[ProjectName]App.c 파일의 ExitInstance() 함수(없으면 만든다)에 정리코드를 추가한다.

GdiplusShutdown(gdiplusToken);



Step4. 사용

Graphics graphics( pDC->m_hDC );
graphics.SetSmoothingMode( SmoothingModeAntiAlias );
Color c(50,200,255);
Pen p(c, 1.0);
Gdiplus::PointF p1, p2;
p1.X = 0.0;
p1.Y = 0.0;
p2.X = 100.0;
p2.Y = 10.0;

graphics.DrawLine (&p, p1, p2);



2. Pen : 연결된 선의 꺽임 처리

p.SetLineJoin (LineJoinRound);

enum LineJoin
{
    LineJoinMiter = 0,
    LineJoinBevel = 1,
    LineJoinRound = 2,
    LineJoinMiterClipped = 3
};






3. Pen : 선의 시작과 끝부분 처리

p.SetStartCap(LineCapRoundAnchor);
p.SetEndCap(LineCapArrowAnchor);

enum LineCap
{
    LineCapFlat = 0,
    LineCapSquare = 1,
    LineCapTriangel = 3,

    LineCapNoAnchor = 0x10,
    LineCapSquareAnchor = 0x11,
    LineCapRoundAnchor = 0x12,
    LineCapDiamondAnchor = 0x13,
    LineCapArrowAnchor = 0x14,

    LineCapCustom = 0xff,
    LineCapAnchorMask = 0xf0
}





4. 안티엘러어싱 적용

graphics.SetSmoothingMode(SmoothingModeHighQuality);

enum SmoothingMode
{
//XP이상 사용가능
SmoothingModeInvalid =QualityModeInvalid,
SmoothingModeDefault =QualityModeDefault,
SmoothingModeHighSpeed =QualityModeLow,
SmoothingModeHighQuality =QualityModeHigh,
SmoothingModeNone,
SmoothingModeAntiAlias,
#if(GDIPVER>=0x0110)
//비스타 이상 버전에서만 사용가능..
SmoothingModeAntiAlias8x4 =SmoothingModeAntiAlias,
SmoothingModeAntiAlias8x8
#endif//(GDIPVER>=0x0110)
};




5. 부드러운 선그리기

graphics.DrawCurve(&p, points, 6, 0.5f);

Struct DrawCurve(const Pen* pen, const Pointf* points, INT count, REAL tension);
arg1: Pen클래스 객체의 주소
arg2: Point배열 클래스의 주소
arg3: 두번째로 전달 받은 Point배열의 클래스 객체의 수..
arg4: 곡선을 그릴때 각이 생기지 않도록 끝을 강제로 늘려주는 장력을 명시 한다.




 

2011년 4월 8일 금요일

VC2008 MFC 인쇄관련 버그

Windows7 에서 VC2008 MFC Wizard 로 생성한 project 의 인쇄관련 버그



1. GetStockObject

void CView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { } 함수에서

    pDC->SelectObject (GetStockObject(WHITE_BRUSH));

'SelectObject' 실행중 오류발생 -> API를 사용해서 해결했음

    ::SelectObject (pDC->m_hDC, GetStockObject(WHITE_BRUSH));



2. System menu

인쇄미리보기중 창의 우측 상단에 있는 최소, 최대, 닫기 버튼을 클릭하면 프로그램이 정지함

System menu 를 일시적으로 삭제함으로 회피했음

// 인쇄미리보기 시작시 System menu 를 삭제함
void CFrictionTesterView::OnBeginPrinting(CDC*, CPrintInfo*) {
    CMainFrame* mf = (CMainFrame*)AfxGetMainWnd();
    LONG style = GetWindowLong(mf->m_hWnd, GWL_STYLE);
    style &= ~WS_SYSMENU;
    SetWindowLong(mf->m_hWnd, GWL_STYLE, style);
}


// 인쇄미리보기 종료시 System menu 를 복구함
void CFrictionTesterView::OnEndPrinting(CDC*, CPrintInfo*) {
    CMainFrame* mf = (CMainFrame*)AfxGetMainWnd();
    LONG style = GetWindowLong(mf->m_hWnd, GWL_STYLE);
    style |= WS_SYSMENU;
    SetWindowLong(mf->m_hWnd, GWL_STYLE, style);
}