반응형
#include<windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) { //1. 위도우 클래스 만들기 (10가지를 다 정확히 입력하지 않으면 화면이 뜨지 않는다.) WNDCLASS wc; //미리정의된 10개 항목을 채우는 클래스 (WNDCLASSEX 12개 항목 10개 항목에 작은 아이콘, 구조체 크기를 포함한다.) MSG Message; 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= "First"; wc.lpszMenuName = 0; wc.style = 0; //2. 윈도우 클래스 등록하기. RegisterClass( & wc ); // 등록을 하는 함수도 2가지가 있다. RegisterClass와 RegisterClassEx가 있다. //WNDCLASS로 만들었으면 RegisterClass로 등록하고 WNDCLASSEX로 만들었으면 RegisterClassEx로 등록 //3. 등록된 클래스를 사용해서 윈도우 만들기. // typedef long HWND; // 윈도우의 번호를 담을때 사용 HWND hwnd = CreateWindowEx(WS_EX_RIGHT , // 확장 윈도우 스타일 "First", // 윈도우 클래스 이름 "안녕", // 창이름 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; } LRESULT CALLBACK WndProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { RECT rc ; GetClientRect(hwnd,&rc); static POINTS buf[1000]; static int count; switch(iMessage){ case WM_DESTROY: PostQuitMessage(0); return 0 ; //화며이 지워질때 나오는 메시지 - 이 메시지가 Defxxx로 가면 배경이 지워진다. //많은 상업용 프로그램을 - 떨림을 막기 위해 이 메시지를 막는다. //효율적으로 그리기 // 1. 꼭 필요한 것만 그리자. // 2. 배경을 꼭 지워야 하는가? // 3. 좌표를 보관하지 말고 비트맵을 사용하자. case WM_ERASEBKGND: return 0; case WM_LBUTTONDOWN: { POINTS pt = MAKEPOINTS(lParam); HDC hdc = GetDC(hwnd); //DC속성을 변경한다. SetTextColor( hdc,RGB(255,0,0)); SetBkColor( hdc,RGB(255,255,0)); TextOut(hdc,0,0,"Hello",5); Ellipse(hdc,pt.x, pt.y,pt.x+50,pt.y+50); ReleaseDC(hwnd,hdc); buf[count++] = pt; } return 0; case WM_RBUTTONDOWN: { // 강제로 특정 영역을 무요화 한다. RECT rc = { 100, 100, 200, 200 }; InvalidateRect(hwnd, &rc, TRUE); } return 0; case WM_PAINT: { //HDC hdc = GetDC(hwnd); //ValidateRect(hwnd,0); //무효화 영역을 유효화 영역으로 //위의 2줄의 코드를 대신하는게 아래이 코드이다 PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); for(int i = 0; i < count ; ++i) { Ellipse(hdc,buf[i].x,buf[i].y,buf[i].x+50,buf[i].y+50); } ReleaseDC(hwnd,hdc); } return 0; } //꺼내온 메시지를 처리하지 않은경우 -> 바드시 아래 함수를 처리한다. return(DefWindowProc(hwnd,iMessage,wParam,lParam)); } //
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."