2010/07/23

CMenu 의 메뉴가 존재 하는지 확인하기

MFC 의 CMenu 객체 중에서 특정 메뉴가 존재 하는지 확인 하기 위해서는 CMenu::CheckMenuItem 함수를 사용하면 된다.





이 함수는 아래와 같은 형태를 갖추고 있으며 반환값으로 메뉴의 체크 여부 또는 메뉴가 존재 하지 않을 경우 0xFFFFFFFF 를 반환한다.



UINT CheckMenuItem(
UINT nIDCheckItem,
UINT nCheck
);







아래는 사용 예이다.



bool bExist = ( m_Menu.CheckMenuItem( IDM_MYMENU, MF_BYCOMMAND ) != 0xFFFFFFFF );






2010/07/22

SQLite 3.7.0 Static & Dynamic Library (VC, CB)

SQLite 3.7.0 버전의 정적 및 동적 라이브러리를 만들어 보았다. 사용된 컴파일러 버전은 Visual C++ 2005 와 RAD Studio 2010 이다.




관련 글들...

SQLite 3.7.0 Released!!




모처럼만에 SQLite 가 업데이트 되었다. 이번에 업데이트를 진행하면서 부터인지 웹페이지도 분위기도 로고도 좀 바뀌었다.



SQLite 3.7.0 버전에서 바뀐 사항.


  • Added support for write-ahead logging.

  • Query planner enhancement - automatic transient indices are created when doing so reduces the estimated query time.

  • Query planner enhancement - the ORDER BY becomes a no-op if the query also contains a GROUP BY clause that forces the correct output order.

  • Add the SQLITE_DBSTATUS_CACHE_USED verb for sqlite3_db_status().

  • The logical database size is now stored in the database header so that bytes can be appended to the end of the database file without corrupting it and so that SQLite will work correctly on systems that lack support for ftruncate().





2010/07/09

NSIS 이용한 Install 할 때 32bit 시스템 인지 64bit 시스템 인지 감지하기

32비트 와 64비트 시스템을 위한 통합 설치 패키지 만들일이 있어서 설치할 때 운영체제가 32비트인지 64비트인지 확인 할 수 있는 내용을 찾아 보았다.





아래의 코드로 32비트인지 64비트인지 감지할 수 있다고 한다.






IfFileExists $WINDIR\SYSWOW64\*.* Is64bit Is32bit
Is32bit:
SetRegView 32
GOTO End32Bitvs64BitCheck

Is64bit:
SetRegView 64

End32Bitvs64BitCheck:





2010/07/05

[Android Dev.] Touch 이벤트 사용하기

Android 의 Touch 이벤트를 테스트 해 보았다.

Touch 이벤트는 TouchListener 를 등록하여 onTouch 함수를 오버라이드 하여 구현을 하거나 onTouchEvent 함수를 오버라이드 하여 구현할 수 있다.




두 방법간의 큰 차이는 없고 어떠한 함수를 통해서 Touch 이벤트를 핸들링 하는가만 다른 것 같다. Touch Listener 를 등록하여 구현하는 경우는 Activity 에 전달 되는 Touch 에서 전체적으로 핸들링 할 수 있지만 내부 View 의 onTouchEvent 를 오버라이드하여 구현하는 경우에는 해당 뷰의 Touch 이벤트에 국한 된다는 차이가 있는데 이는  Touch 구현 범위에 따라 선택을 하여야 할 것 같다.










ACTION_DOWN

ACTION_DOWN

ACTION_MOVE

ACTION_MOVE

ACTION_MOVE

ACTION_UP







Touch Listener 를 등록하여 구현하는 방법



import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TouchTest extends Activity implements OnTouchListener
{
/** Called when the activity is first created. */
TextView tvStatus;
Canvas2D canvas;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);

LinearLayout layout = new LinearLayout(this);
layout.setOrientation( LinearLayout.VERTICAL );

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT );
layout.setLayoutParams( param );

tvStatus = new TextView(this);
layout.addView( tvStatus );
tvStatus.setText( "Touch Status" );

canvas = new Canvas2D( this );
ViewGroup.LayoutParams canvasParam = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT );
layout.addView( canvas, canvasParam );

canvas.setOnTouchListener( this );

setContentView( layout );
}

class Canvas2D extends View
{
public Canvas2D(Context context)
{
super(context);
}

@Override
public void onDraw( Canvas canvas )
{
// Canvas 배경 설정
canvas.drawColor( Color.parseColor("#888888") );
}
}

@Override
public boolean onTouch( View v, MotionEvent event )
{
if ( v == canvas )
{
Log.i( "event", "Canvas2D onTouch" );

switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
String strMsg;
strMsg = "ACTION_DOWN X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;

case MotionEvent.ACTION_MOVE:
{
String strMsg;
strMsg = "ACTION_MOVE X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;

case MotionEvent.ACTION_UP:
{
String strMsg;
strMsg = "ACTION_UP X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;
}
}

return true;
}
}







onTouchEvent 함수를 오버라이드 하여 구현하는 방법



import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TouchTest extends Activity
{
/** Called when the activity is first created. */
TextView tvStatus;
Canvas2D canvas;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(R.layout.main);

LinearLayout layout = new LinearLayout(this);
layout.setOrientation( LinearLayout.VERTICAL );

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT );
layout.setLayoutParams( param );

tvStatus = new TextView(this);
layout.addView( tvStatus );
tvStatus.setText( "Touch Status" );

canvas = new Canvas2D( this );
ViewGroup.LayoutParams canvasParam = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT );
layout.addView( canvas, canvasParam );

canvas.setOnTouchListener( this );

setContentView( layout );
}

class Canvas2D extends View
{
public Canvas2D(Context context)
{
super(context);
}

@Override
public void onDraw( Canvas canvas )
{
// Canvas 배경 설정
canvas.drawColor( Color.parseColor("#888888") );
}

@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.i( "event", "Canvas2D onTouch" );

switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
String strMsg;
strMsg = "ACTION_DOWN X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;

case MotionEvent.ACTION_MOVE:
{
String strMsg;
strMsg = "ACTION_MOVE X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;

case MotionEvent.ACTION_UP:
{
String strMsg;
strMsg = "ACTION_UP X: " + event.getX() + " Y:" + event.getY();

tvStatus.setText( strMsg );
}
break;
}

return true;
}
}
}

<

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

VC++ 2005/2008, KB971090 업데이트로 인한 호환성 문제

언제부터인가 작업하고 있는 PC(Windows 7 x64)에서 프로그램을 빌드해서 다른 PC(XP SP2 x64) 에서 실행을 하면 아래와 같은 에러 메시지와 함께 실행이 되지 않는 문제가 발생하였다.





처음에는 이 문제가 Windows 7 에서 빌드할 때 문제가 되는 것이라 생각을 했었는데, 다른 XP 에서 빌드를 해도 동일한 상황이 벌어지는 경우가 종종 발생하였다. 아무리 재배포 패키기를 설치를 하여도 문제가 해결되지 않았는데, 결국에는 KB971090 업데이트로 인한 호환성 문제로 확인이 되었다.






 KB971090 업데이트 후 바뀐 DLL 파일들과의 호환성 문제로 프로그램이 정상 동작하지 않는데 이럴 때 아래 코드를 StdAfx.h 의 #pragma once 바로 아래에 추가를 해 주면 이 문제에서 회필할 수 있다.



#ifndef __midl
#define _SXS_ASSEMBLY_VERSION "8.0.50727.762"
#define _CRT_ASSEMBLY_VERSION _SXS_ASSEMBLY_VERSION
#define _MFC_ASSEMBLY_VERSION _SXS_ASSEMBLY_VERSION
#define _ATL_ASSEMBLY_VERSION _SXS_ASSEMBLY_VERSION

#ifdef __cplusplus
extern "C" {
#endif
__declspec(selectany) int _forceCRTManifest;
__declspec(selectany) int _forceMFCManifest;
__declspec(selectany) int _forceAtlDllManifest;
__declspec(selectany) int _forceCRTManifestRTM;
__declspec(selectany) int _forceMFCManifestRTM;
__declspec(selectany) int _forceAtlDllManifestRTM;
#ifdef __cplusplus
}
#endif
#endif





아니면 최신의 재배포 패키지를 설치하면 호환성 문제가 사라지게 된다. 이 후의 다른 프로그램과의 호환성을 위해서라도 특정 코드를 추가해 해결하는 것 보다 최신의 재배포 패키지를 설치 해 두는 것이 좋을 것 같다.






** 관련 링크 **







2010/07/02

[Android Dev.] Emulator 창 쉽게 갈무리 하기

그 동안 Android 를 학습하면서 블로그를 위해 OpenCapture 라는 멋진 프로그램을 이용하여 갈무리하여 블로그에 글을 작성하였는데 이제 앞으로는 이 멋진 OpenCapture 프로그램을 사용하지 않게 될 것 같다.



Eclipse 의 DDMS Perspective 의 Device 창의 Capture Screen 메뉴를 이용하면 보다 쉽게 갈무리 할 수 있다.




Eclipse 창의 우측에 보면 다양한 Perspective 가 있는데 이중 DDMS 를 선택한다. 만약 DDMS 가 보이지 않을 때에는 왼쪽의 창 아이콘을 클릭하여 Other... 를 선택하여 DDMS 를 선택하면 된다.




이제 Emulator 를 실행한다.




그리고 Eclipse 의 여러 탭 중 Device 탭에 있는 Capture Screen 메뉴 혹은 아이콘을 클릭 한다.




그러면 아래와 같이 Emulator 화면을 갈무리한 창지 나타난다.




필요에 따라 회전도 복사도 가능하다. 저장을 하게 되면 아래와 같은 최종 결과를 얻을 수 있다.