안드로이드 프로그래밍을 할때 꼭 필요한 것은 바로 디버그 메세지 확인이다.

물론 스마트폰의 디바이스 드라이버는 설치가 되어 있고, SDK가 설치 되어 있어야 한다.


1. ADB LOGCAT


cmd를 통해 아래의 adb를 실행하면 된다.

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat 태그명:D *:S

C:\Users\Administrator\AppData\Local\Android\sdk\platform-tools\adb.exe logcat | find "찾을내용"


리눅스에서는 find 대신 grep을 이용하면 된다.


하지만 adb logcat을 이용하려면 CUI방식이기 때문에 불편함을 많이 느끼는데 이때 사용하면 좋은 것이 바로

DDMS!!! => Monitor로 업그레이드되었다.


2. Monitor (DDMS)


아래의 SDK 위치로 이동하여 monitor.bat를 실행한다.

C:\Users\Administrator\AppData\Local\Android\sdk\tools\monitor.bat



연결된 스마트폰의 로그도 볼 수 있고, 디바이스 위쪽 아이콘 중에서 스마트폰 3개가 겹쳐진 모양을 누르면 화면 캡쳐도 가능하다.


굳굳!

by 개발자가 되자! 2015. 7. 21. 23:08

의문점:

SubClassing으로 Button Window를 연결했을때

Click Message를 받을려면 어떻게 해야하는가?


해답으로 이동!


BN_CLICKEDButton에서 "Click"시 발생한 메세지를 부모에게 메세지로 보내준것이다


아래의 코드를 보면

//WndProc

case WM_COMMAND:
	wmId    = LOWORD(wParam); 
	wmEvent = HIWORD(wParam); 
	switch (wmId)
	{
		case ID_BUTTON3:
		switch(wmEvent)
		{
			case BN_CLICKED:
				MySend();
				EditAddLast(hEdit,"BN_CLICKED");
				break;
			case BM_CLICK:
				MySend();
				EditAddLast(hEdit,"BM_CLICK");
				break;
		}
		break;
	}
	break;


결과를 출력하게 되어있다. (EditAddLast는 개인적인출력함수)


결과를 보면

부모Procedure에서는  BN_CLICKED가 발생됨을 확인할 수 있다.


asdasd가 씌어진 부분은 Edit Window 이다.

EditWindow에서 VK_RETURN ( 엔터키 )에 Button이 눌린것처럼 Message를 보냈다.

1
2
3
4
5
6
7
case WM_KEYDOWN:
	if (wParam == VK_RETURN)
	{
		SendMessage(GetDlgItem(g_hWnd,ID_BUTTON3), BM_CLICK, 0, 0);//SendMessage버튼이 클릭되게 메세지 보냄
		SetFocus(GetDlgItem(g_hWnd,ID_EDIT2));
	}
	return false;

VK_RETURN ( 엔터키 ) 가 눌린경우 역시 BN_CLICKED 메세지가 발생된다.




SubClassing을 한 상태이다

LRESULT CALLBACK	BtnSubProc1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId    = LOWORD(wParam); 
	int wmEvent = HIWORD(lParam);
	
	if(message == BM_CLICK)
		EditAddLast(hEdit,"mBM_CLICK");
	if(message == BN_CLICKED)
		EditAddLast(hEdit,"mBN_CLICKED");
	if(wmEvent == BM_CLICK){
		EditAddLast(hEdit,"EVBM_CLICK");
		EditAddLast(hEdit,"%x",message);
	}
	if(wmEvent == BN_CLICKED){
		EditAddLast(hEdit,"EVBN_CLICKED");
		EditAddLast(hEdit,"%x",message);
	}
    return CallWindowProc(OldBtnProc1,hDlg,message,wParam,lParam);
}


message값을 알아보기위해 여러가지 상황별로 셋팅해두었다.

->복잡하니 실제 발생된 결과값을 보자



두번 클릭했을경우의 값이다


<WINUSER.h> 를 보면

위의 데이터를 해석해보면

f3 : STATE를 변경한다 (눌렀다가)

f3 : STATE를 변경한다 (뗐다가)

215 : CAPTURECHANGED  [ MSDN ] When it receives this message, a window should redraw itself

윈도우 자신을 다시그리고있을때(클릭하면 모양 바뀌자너?)



BM_SETSTATE  살펴보면

wParam

BOOL that specifies whether the button is highlighted. A value of TRUE highlights the button. A value of FALSE removes any highlighting.

lParam

Not used.

TRUE = 버튼이 눌린상태 highlights
FALSE = 버튼을 뗀상태

해답!
message == BM_SETSTATE 일때
wParam==TRUE 이면 버튼이 눌린거구
wParam==FALSE 이면 버튼이 떼어지는거구

요걸 조지면 되겠네요

'프로그래밍 > API' 카테고리의 다른 글

CEdit의 EN_CHANGE 와 EN_UPDATE 의 차이점  (0) 2013.04.13
WINAPI] GetOpenFileName  (0) 2013.03.18
IExplore Tab관련, 최상위창 만들기  (0) 2013.02.23
ListBox Message, LB_메세지 종류  (0) 2013.02.23
by 개발자가 되자! 2013. 3. 7. 02:09

1.ListBox 생성


HWND hList; //전역변수


hList=CreateWindow("listbox",NULL,WS_CHILD | 

WS_VISIBLE | WS_BORDER |

LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | 

WS_VSCROLL,

10,100,900,200,hWnd,(HMENU)

ID_LISTBOX,hInst,NULL);

SendMessage(hList, LB_RESETCONTENT,0,0);


2.Message종류


포인터 = 끝이 NULL값인 배열의 주소

포인터의 길이 = 배열의 크기(최대 크기)

아이템 인덱스 = 0을 기준으로 아이템의 인덱스

low = low-word 하위워드

high = high-word 상위워드

설정할 값 = 각 메세지마다 설정할 값

 

 

메세지

설명

wParam

lParam

LB_ADDFILE

DlgDirList 함수에 의해 채워진 리스트 박스에 파일을 추가한다.

사용 안함

포인터

LB_ADDSTRING

문자열 항목을 추가하여 그 인덱스를 리턴한다.

사용 안함

포인터

LB_DELETESTRING

문자열 항목을 삭제하며 남아있는 항목의 개수를 리턴한다.

아이템 인덱스

사용 안함

LB_DIR

파일 목록을 리스트 박스에 추가한다.

플래그

포인터

LB_FINDSTRING

주어진 검색식에 맞는 첫 번째 항목의 인덱스를 조사한다.

찾을 위치 0이면 처음부터

포인터

LB_FINDSTRINGEXACT

주어진 검색식과 정확하게 일치하는 항목의 인덱스를 조사한다.

찾을 위치 0이면 처음부터

포인터

LB_GETANCHORINDEX

마우스에 의해 마지막으로 선택된 항목의 인덱스를 조사한다.

사용 안함

사용 안함

LB_GETCARETINDEX

포커스 사각형을 가진 항목의 인덱스를 조사한다.

사용 안함

사용 안함

LB_GETCOUNT

총 항목 개수를 조사한다.

사용 안함

사용 안함

LB_GETCURSEL

현재 선택되어 있는 항목의 인덱스를 조사한다.

사용 안함

사용 안함

LB_GETHORIZONTALEXTENT

스크롤 가능한 폭을 픽셀 단위로 리턴한다.

사용 안함

사용 안함

LB_GETITEMDATA

주어진 항목의 데이터를 조사한다.

아이템 인덱스

사용 안함

LB_GETLOCALE

Locale 정보를 조사한다. 상위워드에는 국가코드, 하위워드에는 언어 ID가 전달된다.

사용 안함

사용 안함

LB_GETSEL

항목의 선택 상태를 조사한다.

아이템 인덱스

사용 안함

LB_GETSELCOUNT

다중 선택 리스트 박스에서 선택된 항목의 개수를 조사한다.

사용 안함

사용 안함

LB_GETSELITEMS

다중 선택 리스트 박스에서 선택된 항목의 인덱스를 조사한다.

포인터의 길이

포인터

LB_GETTEXT

주어진 항목의 문자열을 조사한다.

아이템 인덱스

포인터

LB_GETTEXTLEN

주어진 항목의 문자열 길이를 조사한다.

아이템 인덱스

사용 안함

LB_GETTOPINDEX

화면에 보이는 최상위 항목의 인덱스를 조사한다.

사용 안함

사용 안함

LB_INISTORAGE

대량의 데이터를 추가할 때 메모리를 미리 준비하도록 한다. 이 메세지를 미리 보내놓으면 필요한 만큼 메모리를 확보하므로 삽입 속도가 빨라진다.

아이템의 개수

메모리의 크기

LB_INSERTSTRING

주어진 위치에 문자열을 삽입한다.

아이템 인덱스 -1이면 마지막

포인터

LB_ITEMFROMPOINT

lParam으로 주어진 좌표에 가장 가까운 항목의 인덱스를 조사한다. 좌표는 리스트 박스의 작업영역 좌표이다.

사용 안함

low x좌표

high y좌표

LB_RESETCONTENT

모든 항목을 삭제한다.

사용 안함

사용 안함

LB_SELECTSTRING

주어진 검색식에 일치하는 첫 번째 문자열을 선택한다.

찾을 위치 0이면 처음부터

포인터

LB_SELITEMRANGE

주어진 범위의 항목들을 선택한다.

TRUE면 선택

ZERO면 반전

low 시작 값

high 끝 값

LB_SELITEMRANGEEX

주어진 범위의 항목들을 선택하되 시작 항목이 끝 항목보다 뒤쪽에 있으면 선택이 취소된다.

시작 인덱스

끝 인덱스

LB_SETANCHORINDEX

마우스에 의해 최후로 선택된 항목을 설정한다.

새로운 ANCHOR의 인덱스

사용 안함

LB_SETCARETINDEX

포커스 사각형을 주어진 항목으로 옮긴다.

설정할 값

TRUE,FALSE

LB_SETCOLUMNWIDTH

다중 컬럼 리스트 박스에서 컬럼의 폭을 픽셀 단위로 지정한다.

설정할 값

사용 안함

LB_SETCOUNT

총 항목의 개수를 설정한다.

설정할 값

사용 안함

LB_SETCURSEL

주어진 항목을 선택 상태로 만든다.

아이템 인덱스

사용 안함

LB_SETHORIZONTALEXTENT

스크롤이 가능한 폭을 픽셀 단위로 설정한다. 이 폭을 설정하지 않으면 항목의 길이가 아무리 길어도 수평 스크롤 바가 나타나지 않는다.

설정할 값

사용 안함

LB_SETITEMDATA

항목데이터를 대입한다.

아이템 인덱스

설정할 값

LB_SETITEMHEIGHT

개별 항목의 높이를 설정한다.

아이템 인덱스

설정할 값

LB_SETLOCALE

Locale값을 설정한다.

설정할 값

사용 안함

LB_SETSEL

다중 선택 리스트박스에서 한 항목을 선택 상태로 만든다.

TRUE면 선택

ZERO면 반전

아이템 인덱스

LB_SETTABSTOPS

탭 중지점을 설정한다.

설정할 값

찾아보세요

LB_SETTOPINDEX

주어진 항목이 화면의 최상위에 있도록 스크롤 시킨다.

아이템 인덱스

사용 안함

 

반환되는 메시지 :

LB_OKAY 0

LB_ERR (-1)

LB_ERRSPACE (-2)



Message종류 출처 : http://blog.naver.com/nawoo/80103964940



3.Message사용방법

종류 

사용법 

 LB_ADDSTRING

 SendMessage(hList, LB_ADDSTRING,0,(LPARAM)buffer);    //TCHAR buffer[256];

 LB_RESETCONTENT  SendMessage(hList, LB_RESETCONTENT,0,0);
 LB_GETCURSEL

 curNum = SendMessage(hList,LB_GETCURSEL,0,0);

 LB_DELETESTRING

 SendMessage(hList,LB_DELETESTRING,curNum,0);
 LB_ERR

 if(curNum == LB_ERR) "Nothing is Selected"

 LB_GETTEXT

 SendMessage(hList,LB_GETTEXT,curNum,(LPARAM)buffer);    //TCHAR buffer[256];

 LB_FINDSTRING

 curNum = SendMessage(hList, LB_FINDSTRING, -1, (LPARAM)buffer);    //TCHAR buffer[256];



'프로그래밍 > API' 카테고리의 다른 글

CEdit의 EN_CHANGE 와 EN_UPDATE 의 차이점  (0) 2013.04.13
WINAPI] GetOpenFileName  (0) 2013.03.18
BN_CLICKED, BM_CLICK  (0) 2013.03.07
IExplore Tab관련, 최상위창 만들기  (0) 2013.02.23
by 개발자가 되자! 2013. 2. 23. 11:54
| 1 |