EN_UPDATE
문자열이 변경된 후, 화면에 출력하기 전에 보내주는 메세지

EN_CHANGE
문자열이 화면에 출력된 후, 보내지는 메세지

EN_CHANGE와 EN_UPDATE가 비슷하게 보이지만 위와 같은 차이를 가지며,
메세지 발생 순서는 "문자열 수정 - EN_UPDATE 발생 - 화면 출력 - EN_CHANGE 발생" 이므로..
입력된 문자열의 길이에 따라 에디트 컨트롤 사이즈를 조정하는 작업은 EN_UPDATE에서 하는 것이 논리적이다.

상황에 따라 사용하되 대개의 경우 EN_CHANGE를 많이 사용한다.



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

WINAPI] GetOpenFileName  (0) 2013.03.18
BN_CLICKED, BM_CLICK  (0) 2013.03.07
IExplore Tab관련, 최상위창 만들기  (0) 2013.02.23
ListBox Message, LB_메세지 종류  (0) 2013.02.23
by 개발자가 되자! 2013. 4. 13. 23:40

http://Soenlab.com (구 : winapi.co.kr) 레퍼런스 확인중


http://soenlab.com/lecture/win32api/reference/Function/GetOpenFileName.htm

을 보면서 따라하던중


헤더파일을 못읽는건지..


도무지 GetOpenFileName 함수가 컴파일되지 않는것이었다


해결방법은



WIN32_LEAN_AND_MEAN을 주석처리하면된다.



GetOpenFileName 사용시-> //#define WIN32_LEAN_AND_MEAN



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

CEdit의 EN_CHANGE 와 EN_UPDATE 의 차이점  (0) 2013.04.13
BN_CLICKED, BM_CLICK  (0) 2013.03.07
IExplore Tab관련, 최상위창 만들기  (0) 2013.02.23
ListBox Message, LB_메세지 종류  (0) 2013.02.23
by 개발자가 되자! 2013. 3. 18. 20:14

의문점:

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

먼저 네이버 홈페이지를 켜둔 상태로

"네이버"핸들을 검색해보면 2가지가 나온다



SPY++을 찾아보니

두가지 내용중,


하나는 IEFrame이라고 표기되어있고

다른하나는 TabThumbnailWindow 라고 표기되어있다.


둘의 차이는 뭔가 하고

창을 최상위로 당겨본결과, (BringWindowToTop 함수사용)


TabThumbnailWindow는 창이 제대로 최상위로 변경되는 반면

IEFrame은, 작업표시줄에서만 반짝일뿐!

또한, 탭이 여러개인경우에도 BringWindowToTop을 하게되면 다른탭보다 밑에있더라도 최상위로 올라오게된다


TabThumbnailWindow 실제로 작동하는 핸들이다, IEFrame은 작업표시줄 윈도우일뿐이다.

라고 답이 나온다.


(최소화된경우 BringWindowToTop 또는 SetForegroundWindow를 통해 변경되지 않는다 

이때 http://debugjung.tistory.com/421 << 여기를 통해 강제로 최상위창을 만든다)

 


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

CEdit의 EN_CHANGE 와 EN_UPDATE 의 차이점  (0) 2013.04.13
WINAPI] GetOpenFileName  (0) 2013.03.18
BN_CLICKED, BM_CLICK  (0) 2013.03.07
ListBox Message, LB_메세지 종류  (0) 2013.02.23
by 개발자가 되자! 2013. 2. 23. 16:32

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 |