의문점:

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