#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();