2010/03/31

[Study Note] Options 메뉴 다루기

import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;

// 추가하기 위한 메뉴를 위한 상수
static final int MENU_NEW = 1;
static final int MENU_EDIT = 2;
static final int MENU_SEL = 3;
static final int MENU_CHECK = 4;

// 추가하기 위한 서브 메뉴를 위한 상수
static final int MENU_SEL_1 = 5;
static final int MENU_SEL_2 = 6;
static final int MENU_SEL_3 = 7;

public boolean onCreateOptionsMenu( Menu menu )
{
super.onCreateOptionsMenu( menu );

menu.add( 0, MENU_NEW, 0, "NEW" ) // New 메뉴 추가
.setAlphabeticShortcut( 'n' ); // 단축키 지정

menu.add( 0, MENU_CHECK, 0, "CHECK" ) // Check 메뉴 추가
.setCheckable( true ); // 체크 옵션 추가

menu.add( 0, MENU_EMPTY, 0, "Empty" ) // Empty 메뉴 추가
.setCheckable( true ); // 체크 옵션 추가

SubMenu sub = menu.addSubMenu( "Select" ); // Select 서브 메뉴 추가
sub.add( 0, MENU_SEL_1, 0, "Selection 1" ); // 메뉴 추가
sub.add( 0, MENU_SEL_2, 0, "Selection 2" ); // 메뉴 추가
sub.add( 0, MENU_SEL_3, 0, "Selection 3" ); // 메뉴 추가

return true;
}

public boolean onOptionsItemSelected( MenuItem item )
{
switch ( item.getItemId() )
{
case MENU_NEW:
{
// Alert 대화상자 생성
AlertDialog alert = new AlertDialog.Builder( this )
.setTitle( "타이틀" )
.setMessage( "메세지" )
.setPositiveButton( "OK",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{

}
}
)
.setNeutralButton( "?",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{

}
}
)
.setNegativeButton( "Cancel",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
}
)
.create();

alert.show();
}
return true;
}

return false;
}






<

Original Post : http://neodreamer-dev.tistory.com/395

2010/03/28

[Study Note] 디버그 로그 뿌리고 확인하기

Eclipse를 이용한 안드로이드의 개발에도 Visual C++ 에서의 TRACE 기능이 있다. android.util.Log 가 그 기능을 한다.



아래는 Log 클래스를 이용한 디버그 메세지 출력 예이다.

import android.util.Log;

public void onClick( View v )
{
Log.d("DEBUG", "testmsg - Onclick");
Log.e("ERROR", "testmsg - Onclick");
Log.i("INFO", "testmsg - Onclick");
Log.v("VERBOSE", "testmsg - Onclick");
Log.w("WARN", "testmsg - Onclick");
}




위와 같이 로그 메세지를 뿌리면 아래와 같이 LogCat 창에서 확인을 수 있다. 로그의 종류별로 색상을 다르게 출력을 해 주어 한 눈에 확인할 수 있다.



LogCat 창은 Window 메뉴의 Open Perspective 의 Debug 를 선택하면 볼 수 있다.




또는 현재 작업 화면에서 LogCat을 추가할 수 있는데 Window 메뉴의 Show View 의 Other... 를 선택하고,



Android 항목 아래에 있는 LogCat 을 선택하면 LogCat를 현재의 작업 환경에 추가할 수 있다.


Android 개발 문서의 Log에 대한 설명<

Original Post : http://neodreamer-dev.tistory.com/394

2010/03/26

리스트 컬럼크기를 자동으로 설정하기


CHeaderCtrl* pHeader = m_ListCtrl.GetHeaderCtrl();
int numcol = pHeader->GetItemCount();

for (int col = 0; col < numcol; col++)
{
m_ListCtrl.SetColumnWidth(col,LVSCW_AUTOSIZE);
}
<

Original Post : http://neodreamer-dev.tistory.com/393

CEdit 의 내용을 클립보드로 복사하기


GetDlgItem(IDC_EDT_RESULT)->SendMessage(EM_SETSEL, 0, -1);
GetDlgItem(IDC_EDT_RESULT)->SendMessage(WM_COPY, 0, 0);
<

Original Post : http://neodreamer-dev.tistory.com/392

2010/03/24

QueryPerformanceCounter 이용한 StopWatch 클래스

#pragma once

class CAStopWatch
{
private:
int m_Initialized;
BOOL m_BeginFlag;
__int64 m_Frequency;
__int64 m_BeginTime;
__int64 m_EndTime;

__int64 m_i64Elapsed;
double m_dblElapsed;

public:
CAStopWatch(void)
{
// Get CPU Frequency
m_Initialized = QueryPerformanceFrequency((LARGE_INTEGER *)&m_Frequency);

m_BeginFlag = FALSE;
}

virtual ~CAStopWatch(void)
{
}

BOOL Begin()
{
if( !m_Initialized )
{
return 0;
}

// Get Begin Counter
m_BeginFlag = QueryPerformanceCounter( (LARGE_INTEGER *)&m_BeginTime );

return m_BeginFlag;
}

double End()
{
if( !m_Initialized || !m_BeginFlag )
{
return 0.0;
}

// Get End Counter
QueryPerformanceCounter( (LARGE_INTEGER *)&m_EndTime );

// calculate elapse count
m_i64Elapsed = m_EndTime - m_BeginTime;

// Convert count to second
m_dblElapsed = (double)m_i64Elapsed / (double)m_Frequency;

return m_dblElapsed;
}

BOOL Available()
{
return m_Initialized;
}

__int64 GetFreq()
{
return m_Frequency;
}

double GetElapsedTime()
{
return m_dblElapsed;
}

double GetElapsedSecond()
{
return m_dblElapsed;
}

double GetElapsedMillisecond()
{
return m_dblElapsed * 1000;
}

double GetElapsedMicroSecond()
{
return m_dblElapsed * 1000000;
}
};

// 사용 예
CAStopWatch watch;

watch.Begin();
:
:
watch.End();

double sec = watch.GetElapsedSecond();
<

Original Post : http://neodreamer-dev.tistory.com/391

[MFC] 메인창 크기 고정

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;

cs.x = ::GetSystemMetrics(SM_CXSCREEN) / 2 ; // WIndow 위치
cs.y = ::GetSystemMetrics(SM_CYSCREEN) * 1 / 5; // Window 위치
cs.cx = 500; // Window 크기
cs.cy = 400; // Window 크기
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX; // Window 속성 - 최대화 Button Disable

return TRUE;
}
<

Original Post : http://neodreamer-dev.tistory.com/390

[MFC] 제목 표시줄 고정

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
...
// Set Window Style
cs.style &= ~FWS_ADDTOTITLE;
cs.lpszName = "제목";
...
return TRUE;
}

Original Post : http://neodreamer-dev.tistory.com/389

2010/03/23

툴바 또는 상태바를 숨기거나 보이게하기

// 툴바 감추기
if( ((CMainFrame*)GetParent())->m_wndToolBar.IsWindowVisible()) {
GetParent()->SendMessage(WM_COMMAND, ID_VIEW_TOOLBAR, 0L);
}

// 상태바 감추기
if( ((CMainFrame*)GetParent())->m_wndStatusBar.IsWindowVisible()) {
GetParent()->SendMessage(WM_COMMAND, ID_VIEW_STATUS_BAR, 0L);
}

//보이게 하려면 wParam값을 0이 아닌 값을 넣어줌

Original Post : http://neodreamer-dev.tistory.com/388

실행 파일의 경로 가져오기 _splitpath

    
TCHAR filename[MAX_PATH];
GetModuleFileName(NULL, filename, sizeof(filename));

TCHAR Drive[_MAX_DRIVE];
TCHAR Path[_MAX_DIR];
TCHAR Filename[_MAX_FNAME];
TCHAR Ext[_MAX_EXT];
_tsplitpath_s(filename, Drive, _MAX_DRIVE, Path, _MAX_DIR, Filename, _MAX_FNAME, Ext, _MAX_EXT);




MSDN 의 _splitpath 설명보기




출처 : MSDN
Original Post : http://neodreamer-dev.tistory.com/387

2010/03/22

파일 존재 유무 파악 _access


#include

// Check for existence.
if( (_access( "crt_ACCESS.C", 0 )) != -1 )
{
printf_s( "File crt_ACCESS.C exists.\n" );

// Check for write permission.
// Assume file is read-only.
if( (_access( "crt_ACCESS.C", 2 )) == -1 )
printf_s( "File crt_ACCESS.C does not have write permission.\n" );
}


_access 설명 보기




2010/03/18

IDE Fix Pack 3.01 for RAD Studio 2010


몇일 전에 3.0 버전을 공개 했는데 패키징 과정에서 2010버전에 실험적 코드가 있어서 이를 수정하여 재 공개 하였음.



IDE Fix Pack 3.01 for RAD Studio 2010

2010/03/17

윈도우폰 7 개발환경 공개


MS 의 스마트 폰 운영체제인 Windows Phone 7 의 개발 환경이 공개 되었다.




Windows Phone 7 의 개발환경은 C# 기반의 Silverlight 만을 지원한다고 한다. C++ 에 대한 지원이 없어 좀 아쉽다.




개발 환경 설치할 경우 설치되는 툴들:


  • Visual Studio 2010 Express for Windows Phone CTP

  • Windows Phone Emulator CTP

  • Silverlight for Windows Phone CTP

  • XNA 4.0 Game Studio CTP







시스템 요구 사항


  • Supported Operating Systems: Windows 7; Windows Vista

  • Windows® Vista® (x86 and x64) ENU with Service Pack 2 – all editions except Starter Edition

  • Windows 7 (x86 and x64) ENU – all editions except Starter Edition

  • Installation requires 3 GB of free disk space on the system drive.

  • 2 GB RAM

  • DirectX 10 capable graphics card with a WDDM 1.1 driver









IDE Fix Pack 2009/2010 3.0 Released

RadStudio IDE 의 버그를 수정한 IDE Fix Pack 이 3.0 버전을 공개하였다.



RAD Studio 2010 fixes:


  • Undo destroys editor buffer

  • F1 key doesn’t work if invoked from the ObjectInspector

  • Vista compatible icons (256×256) aren’t supported

  • Stepping through the code can be slow

  • QC #80822: ObjectInspecor: Properties are duplicated after scrolling

  • QC #80776: ObjectInspector shows “EditControl” instead of the real content

  • QC #79776: Clicking on object Inspector rejects focus

  • QC #29732: Class Completion adds published section

  • Step-Out doesn’t recognize the return address at ESP

  • QC #75738: Debugging extremly slow

  • QC #68493: Switching away and back to Delphi orphans focus on Code Editor




RAD Studio 2009 fixes:


  • Stepping through the code can be slow

  • Vista compatible icons (256×256) aren’t supported

  • Undo destroys editor buffer

  • 64 bit Debugger assertion (see hotfix from Embarcadero for 2009)

  • QC #75738: Debugging extremly slow

  • QC #71575: Delphi 2009 literal string assigment

  • QC #47807: Error insight fails to find TObject class

  • Possible deadlock when Error Insight calls ProcessMessages

  • QC #68493: Switching away and back to Delphi orphans focus on Code Editor

  • QC #37462: IDE may select the wrong file when performing a ctrl + left-click on a filename in the editor

  • QC #22880: Cannot resolve unit name

  • QC #58045: Component captions and component icons disappear from form designer

  • QC #69456: IDE dead lock when updating the editors

  • QC #55910: TDBText.Color always reverts to Parent.Color

  • QC #59963: Closing non-modal forms after a task switch can deactivate the application

  • QC #56252: TPageControl flickers a lot with active theming

  • QC #68730: TLabel is not painted on a themed, double-buffered TTabSheet in Vista

  • ToolsAPI IOTAProjectOptions.GetOptionNames destroys options.

  • QC #74646: Buffer overflow in TCustomClientDataSet.DataConvert with ftWideString

  • QC #80822: ObjectInspecor: Properties are duplicated after scrolling

  • QC #80776: ObjectInspector shows “EditControl” instead of the real content

  • QC #79776: Clicking on object Inspector rejects focus

  • QC #29732: Class Completion adds published section









<

Original Post : http://neodreamer-dev.tistory.com/383

2010/03/16

주어진 각도로 회전 된 포인트 구하기


// Positive - Counter clock wise
// Negative - Clock wise
void CalcRotatedPoint(double x, double y, double fAngle, double& x2, double& y2)
{
double pi = 3.1415926535;

x2 = cos(fAngle * pi / 180.0f) * x - sin(fAngle * pi / 180.0f) * y;
y2 = sin(fAngle * pi / 180.0f) * x + cos(fAngle * pi / 180.0f) * y;
}

2010/03/15

주어진 점이 다각형에 포함되는지 확인하기


function PtInPoly
(const Points: Array of TPoint; X,Y: Integer):
Boolean;
var Count, K, J : Integer;
begin
Result := False;
Count := Length(Points) ;
J := Count-1;
for K := 0 to Count-1 do begin
if ((Points[K].Y <=Y) and (Y < Points[J].Y)) or
((Points[J].Y <=Y) and (Y < Points[K].Y)) then
begin
if (x < (Points[j].X - Points[K].X) *
(y - Points[K].Y) /
(Points[j].Y - Points[K].Y) + Points[K].X) then
Result := not Result;
end;
J := K;
end;
end;





Radian <-> Dgree 매크로


#define RAD2DEG(x) (x * 180.0 / 3.14159265358979323846)
#define DEG2RAD(x) (x * 3.14159265358979323846 / 180.0)
<

Original Post : http://neodreamer-dev.tistory.com/380

2010/03/11

프로그래밍의 도(道) - The Tao Of Programming


아주 오래된 글이다. 원본 글로 볼 때 20년이 넘은 글인데도 현대의 프로그래밍의 큰 틀에서 벗어나지 않는다. 오래전에 스쳐지나며 본 듯한 글이 였는데 오늘 다시 보게 되었다. 띄엄띄엄 몇 구절 읽어보았는데 심심풀이로 한 번 읽어 봄 직한 글인 것 같아 블로그에 발췌를 해 두었다.




It's a joke





프로그래밍의 도 원문 보기







프로그래밍의 도 번역 보기






원본 출처 : The Tao Of Programming

2010/03/10

한글판 안드로이드 입문서 3rd Edition 제본하다






그간 "알짜만 골라 배우는 안드로이드 프로그래밍"라는 책으로 틈틈히 공부를 하고 있다가 Kandroid 에서 공개한 "한글판 안드로이드 입문서 3rd Edition"을 접하고서는 학습서를 바꾸었다. "한글판 안드로이드 입문서 3rd Edition"가 "알짜만 골라 배우는 안드로이드 프로그래밍"보다 체계적으로 정리가 된 것 같으며 설명한 내용도 보다 충실해 보였다.





책으로 출판없이 PDF 로만 공개가 되어 휴대의 편의성은 있지만 왠지 모니터 화면으로 보는 책은 익숙치 않아서 제본을 하였다. 5백여 페이지에 이르는 방대한 양을 한 권의 책으로 만들기 위해 한 페이지에 두 화면을 인쇄하여 만들었는데

그런데로

그런대로 볼만 하였다.







SQLite 3.6.23 Released & Library (Static, Dynamic, VC, CB)

SQLite Release 3.6.23 On 2010 March 09 (3.6.23)



Changes associated with this release include the following:


  • Added the secure_delete pragma.

  • Added the sqlite3_compileoption_used() and sqlite3_compileoption_get() interfaces as well as the compile_options pragma and the sqlite_compileoption_used() and sqlite_compileoption_get() SQL functions.

  • Added the sqlite3_log() interface together with the SQLITE_CONFIG_LOG verb to sqlite3_config(). The ".log" command is added to the Command Line Interface.

  • Improvements to FTS3.

  • Improvements and bug-fixes in support for SQLITE_OMIT_FLOATING_POINT.

  • The integrity_check pragma is enhanced to detect out-of-order rowids.

  • The ".genfkey" operator has been removed from the Command Line Interface.

  • Updates to the co-hosted Lemon LALR(1) parser generator. (These updates did not effect SQLite.)

  • Various minor bug fixes and performance enhancements.










SQLite Library for C++ Builder (DLL 및 정적라이브러리)


SQLite Library for Visual C++ ( DLL 및 정적라이브러리 32/64bit)

2010/03/09

SDK Tools, Revision 5 Released (March 2010)




Android SDK 가 설치된 경로에서 "SDK Setup.exe"를 실행 시키면 자동으로 업데이트 체크를 하고 업데이트를 할 수 있다.


















SDK Tools, Revision 5 내용 보기







Android NDK, Revision 3 Released


Android 에서 C/C++ 기반의 개발을 지원하는 NDK 가 업데이트 되었다. 이번 업데이트에는 OpenGL ES 2.0 지원이 추가 되었다.



Android NDK, Revision 3 (March 2010)




General notes:


  • Adds OpenGL ES 2.0 native library support.

  • Adds a sample application,hello-gl2, that illustrates the use of OpenGL ES 2.0 vertex and fragment shaders.

  • The toolchain binaries have been refreshed for this release with GCC 4.4.0, which should generate slightly more compact and efficient machine code than the previous one (4.2.1). The NDK also still provides the 4.2.1 binaries, which you can optionally use to build your machine code.