본문 바로가기
IT창고/API

마우스 이벤트들과 캡쳐

by 창구창고 2007. 1. 22.

📑 목차

    반응형
    #include<windows.h>
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    HINSTANCE g_hinst;
    LPCTSTR lpszClass=TEXT("TextOut");
    
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrev,
    				   LPSTR lpCmdLine,
    				   int nShowCmd)
    {
    	MSG Message;
    	//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
    	WNDCLASS wc;		//미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground	=	(HBRUSH)GetStockObject(	WHITE_BRUSH);
    
    	wc.hCursor		=	LoadCursor	(	0, IDC_CROSS);
    	wc.hIcon		=	LoadIcon	(	0, IDI_WINLOGO	);
    	wc.hInstance	=	hInstance;
    	wc.lpfnWndProc	=	WndProc;	//<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다.	메시지 함수등록
    	wc.lpszClassName=	TEXT("First");
    	wc.lpszMenuName	=	0;
    	//wc.style		=	0;
    
    
    	wc.style		=	CS_DBLCLKS;
    
    	//2. 윈도우 클래스 등록하기.
    	RegisterClass( & wc	);	// 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
    	//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록
    
    	//3. 등록된 클래스를 사용해서 윈도우 만들기.
    	// typedef long HWND;	//	윈도우의 번호를 담을때 사용
    	HWND hwnd	=	CreateWindowEx(0 ,			// 확장 윈도우 스타일
    									TEXT("First"),				// 윈도우 클래스 이름
    									TEXT("안녕"),					// 창이름
    									WS_OVERLAPPEDWINDOW,	// 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
    															// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
    									CW_USEDEFAULT,	0,	CW_USEDEFAULT,	0,	// X,Y,W,H
    									0,						// 부모 윈도우 핸들( 번호 )
    									0,						// 메뉴 핸들( 번호 )
    									hInstance,				// 인스턴스 핸들
    									0);						// 생성인자.( MDI 만들때 사용 )
    	//							   
    
    	//CreateWindowEx는 CreateWindow가 가지는 11개에 확장 윈도우 스타일 1가지 인자를 더 가져서 12가지 인자를 가진다.
    
    	//4. 윈도우 보여주기
    	ShowWindow(hwnd, nShowCmd);
    
    	while(GetMessage(&Message,0,0,0))	//메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
    	{
    		TranslateMessage(&Message);
    		DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
    	}
    	
    	MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
    	return 0;
    }
    /*
    1. 메세지 함수모양
    2. 메세지 루프의 모양
    3. 종료후 조건(WM_QUIT 이 Q에 들오얼때)
    */
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    
    	switch(iMessage){
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0 ;
    	case WM_LBUTTONDOWN:
    		{
    		//모든 마우스 메시지의 lParam에는 마우스 좌표가 있다.
    		int x = lParam &0x0000FFFF;	//하위 16비트 에 x좌표
    		int y = lParam >>16;		//상위 16비트 에 y좌표
    
    		//결국 위 작업을 대신 해주는 매크로가 있다.
    		x = LOWORD(lParam);
    		y = HIWORD(lParam);
    
    		//또는
    		POINTS pt = MAKEPOINTS(lParam);
    		hdc=GetDC(hwnd);
    		TextOut(hdc,100,100,TEXT("Beautiful Korea"),15);
    		ReleaseDC(hwnd,hdc);
    		return 0;
    		}
    	case WM_RBUTTONDOWN:
    		{
    		/*	//wParam조사하는 방법  - &연산 사용
    			if(wParam & MK_SHIFT)
    			{
    				MessageBox(0,TEXT("SHIFT + RBUTTON"),"",MB_OKCANCEL);
    			}*/
    			if(GetKeyState(VK_CAPITAL)	&	0x00FF)//상태키 정보(하위 8비트 조사)
    			{
    				MessageBox(0,TEXT("대문자 상태"),"",MB_OKCANCEL);
    			}
    			else
    				MessageBox(0,TEXT("소문자 상태"),"",MB_OKCANCEL);
    			return 0;
    		}
    	case WM_PAINT:
    		hdc=BeginPaint(hwnd,&ps);
    		TextOut(hdc,100,100,TEXT("Beautiful Korea"),15);
    		EndPaint(hwnd,&ps);
    		return 0;
    	case WM_LBUTTONDBLCLK:
    		MessageBox(0,TEXT("더블클릭"),"성공",MB_OKCANCEL);
    		return 0 ;
    	}
    	//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
    	return(DefWindowProc(hwnd,iMessage,wParam,lParam));
    }
    
    //마우스가 나(윈도우)를 벗어나더라도 마우스의 이벤트를 가져올수 있다.
    //SetCapture()를 사용하면 된다.
    //Release Capture()
    //GetCapture();
     
     
     
     
    //WM_MOUSELEAVE,WM_MOUSEWHEEL을 사용하기 위해 윈도우의 버젼을 정의(windows.h위에 있어야 한다.)
    //--------------------------------------------------
    #define _WIN32_WINNT	0x0501//
    #define WINVER			0x0501//
    //--------------------------------------------------
    
    #include<windows.h>
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    void ModifyStyle(HWND hwnd, UINT remove,UINT add);
    HINSTANCE g_hinst;
    LPCTSTR lpszClass=TEXT("TextOut");
    
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrev,
    				   LPSTR lpCmdLine,
    				   int nShowCmd)
    {
    	MSG Message;
    	//1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.)
    	WNDCLASS wc;		//미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.)
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground	=	(HBRUSH)GetStockObject(	WHITE_BRUSH);
    
    	wc.hCursor		=	LoadCursor	(	0, IDC_CROSS);
    	wc.hIcon		=	LoadIcon	(	0, IDI_WINLOGO	);
    	wc.hInstance	=	hInstance;
    	wc.lpfnWndProc	=	WndProc;	//<~ 이부분을 자신이 만드는 함수로 바꿔줘야 한다.	메시지 함수등록
    	wc.lpszClassName=	TEXT("First");
    	wc.lpszMenuName	=	0;
    	wc.style		=	0;
    
    
    	//wc.style		=	CS_DBLCLKS;
    
    	//2. 윈도우 클래스 등록하기.
    	RegisterClass( & wc	);	// 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다.
    	//WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록
    
    	//3. 등록된 클래스를 사용해서 윈도우 만들기.
    	// typedef long HWND;	//	윈도우의 번호를 담을때 사용
    	HWND hwnd	=	CreateWindowEx(0 ,			// 확장 윈도우 스타일
    									TEXT("First"),				// 윈도우 클래스 이름
    									TEXT("안녕"),					// 창이름
    									WS_OVERLAPPEDWINDOW,	// 기본 Window Styles : & ~ 연산으로 기존스타일 제거하기
    															// WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
    									CW_USEDEFAULT,	0,	CW_USEDEFAULT,	0,	// X,Y,W,H
    									0,						// 부모 윈도우 핸들( 번호 )
    									0,						// 메뉴 핸들( 번호 )
    									hInstance,				// 인스턴스 핸들
    									0);						// 생성인자.( MDI 만들때 사용 )
    	//							   
    
    	//CreateWindowEx는 CreateWindow가 가지는 11개에 확장 윈도우 스타일 1가지 인자를 더 가져서 12가지 인자를 가진다.
    
    	//4. 윈도우 보여주기
    	ShowWindow(hwnd, nShowCmd);
    
    	while(GetMessage(&Message,0,0,0))	//메시지 큐에 가서 메시지를 꺼내오고 가져온 메시지를 윈도우 클래스에 등록된 메세지 처리함수로 전달한다.
    	{
    		TranslateMessage(&Message);
    		DispatchMessage(&Message);//가져온 메시지를 윈도우 클래스에 등록된 메시지 처리함수로 전달한다.
    	}
    	
    	MessageBox(0, "이제 알겠죠?","물음",MB_OKCANCEL);//종료되지 않게 하기 위해
    	return 0;
    }
    /*
    1. 메세지 함수모양
    2. 메세지 루프의 모양
    3. 종료후 조건(WM_QUIT 이 Q에 들오얼때)
    */
    LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
    {
    	static BOOL bOver	=	FALSE;
    
    	switch(iMessage){
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0 ;
    	case WM_MOUSEWHEEL:
    		{
    			short int delta	HIWORD(	wParam	);
    			delta	=	(	delta	/	WHEEL_DELTA	);	//	WHEEL_DELTA : 120
    
    			RECT rc;
    			
    			GetWindowRect(hwnd, &rc);	//	현재 윈도우의 위치 , 크기
    			
    			OffsetRect(&rc, 0, delta *10);	//	rc를 이동
    
    			//윈도우를 이동
    			SetWindowPos(hwnd, 0, rc.left,rc.top,0,0,SWP_NOZORDER | SWP_NOSIZE);
    		}
    		return 0;
    	case WM_MOUSEMOVE:
    		if(bOver	==	FALSE)	//	밖에 있다 처음 들어온 경우
    		{
    			bOver = TRUE;
    			SetWindowText(hwnd,TEXT("마우스가 윈도우 위에 있습니다."));
    			
    			TRACKMOUSEEVENT time;
    			time.cbSize		=	sizeof(time);
    			time.dwFlags	=	TME_LEAVE | TME_HOVER;
    			time.dwHoverTime=	1000;
    			time.hwndTrack	=	hwnd;
    			
    			TrackMouseEvent(&time);
    		}
    		return 0;
    	case WM_MOUSEHOVER:
    		bOver = FALSE;
    		SetWindowText(hwnd,TEXT("마우스가 정지했습니다."));
    		return 0;
    	case WM_MOUSELEAVE:
    		bOver = FALSE;
    		SetWindowText(hwnd,TEXT("마우스가 윈도우를 벗어났습니다."));
    		return 0;
    	case WM_LBUTTONDOWN:
    		SetCapture(hwnd);	//	일반적으로 버튼다운에서 캡쳐
    		return 0 ;
    	case WM_LBUTTONUP:
    		if(GetCapture()	==	hwnd)
    		{
    			ReleaseCapture();
    
    			POINT Pt;
    			GetCursorPos(&Pt);	// 현재 커서의 위치 스크린 좌표
    
    			HWND h	=	WindowFromPoint(Pt);//중요 - 특정 좌표에 있는 윈도우
    
    			ModifyStyle(h , 0 , WS_OVERLAPPEDWINDOW);
    
    	//		ShowWindow(h,SW_HIDE);
    		//	char cname[256];
    		//	GetClassName(h,cname,256);
    
    		//	MessageBox(hwnd,cname,"클래스 이름",MB_OKCANCEL);
    		}
    	case WM_LBUTTONDBLCLK:
    		MessageBox(0,TEXT("더블클릭"),"성공",MB_OKCANCEL);
    		return 0 ;
    	}
    	//꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다.
    	return(DefWindowProc(hwnd,iMessage,wParam,lParam));
    }
    
    void ModifyStyle(HWND hwnd, UINT remove,UINT add)
    {
     //window object 에서 기존 style을 얻는다
     UINT style = GetWindowLong (hwnd , GWL_STYLE);
    
     style = style &~remove; //제거할 스타일
     style = style | add;// 추가
     //변경된 style 을 다시 window Object에 넣는다.
     SetWindowLong (hwnd , GWL_STYLE,style);
     //style 변경한 경우 현재 윈도우 를 다시 그리게 한다
     SetWindowPos(hwnd, 0,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOZORDER |SWP_NOREDRAW);
    
    
    }
    
    //마우스가 나(윈도우)를 벗어나더라도 마우스의 이벤트를 가져올수 있다.
    //SetCapture()를 사용하면 된다.
    //Release Capture()
    //GetCapture();
    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."