2011년8월25일_winAPI_그림그리기..그래픽(dot, line, rectangle, ellipse), MessageBox








 

참조(Reference)



DSCN4007 DSCN4008 DSCN4009


● 그래픽예제 + 내가 그린거와 선생님 문제

   1: // winAPI정복 page.58 예제: TextOut
   2: // 2011년 8월 23일 작성 
   3:  
   4: /* 윈도우즈 프로그래밍 순서 WinMain()
   5: 
   6:     WndClass정의
   7: 
   8:     클래스를 등록
   9: 
  10:     메모리상에 윈도우 생성
  11: 
  12:     윈도우를 화면에 출력
  13: 
  14:     메시지 루프 (반복)    여기서 텍스트 출력할 것.
  15: */
  16:  
  17: #include <windows.h>        // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
  18:  
  19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    //메시지처리함수
  20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
  21:  
  22: HINSTANCE g_hlnst;    //핸들 인스턴스
  23: LPCTSTR lpszClass = TEXT("GraphOut");        //윈도우 제목으로 사용되는 const char * (문자열)
  24:  
  25: /***************************************************************************************************************************
  26: WinMain은 엔트리 포인트(시작함수)
  27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
  28: 
  29: WinMain의 인자들...
  30: ① hInstance: 프로그램의 인스턴스 핸들
  31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
  32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
  33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
  34: ***************************************************************************************************************************/
  35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
  36: {
  37:     HWND hWnd;
  38:     MSG Message;
  39:     WNDCLASS WndClass;
  40:     g_hlnst = hInstance;
  41:  
  42:     WndClass.cbClsExtra = 0;
  43:     WndClass.cbWndExtra = 0;
  44:     WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  45:     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  46:     WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  47:     WndClass.hInstance = hInstance;
  48:     WndClass.lpfnWndProc = WndProc;
  49:     WndClass.lpszClassName = lpszClass;
  50:     WndClass.lpszMenuName = NULL;
  51:     WndClass.style = CS_HREDRAW | CS_VREDRAW;
  52:     RegisterClass(&WndClass);
  53:  
  54:     /*
  55:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  56:         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  57:         NULL, (HMENU)NULL, hInstance, NULL);
  58:     */
  59:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  60:         100, 100, 800, 800,
  61:         NULL, (HMENU)NULL, hInstance, NULL);
  62:     
  63:     ShowWindow(hWnd, nCmdShow);
  64:  
  65:     while(GetMessage(&Message, NULL, 0, 0)) {
  66:         TranslateMessage(&Message);
  67:         DispatchMessage(&Message);
  68:     }
  69:  
  70:     return (int)Message.wParam;
  71: }
  72:  
  73: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
  74: {
  75:     HDC hdc;
  76:     PAINTSTRUCT ps;
  77:     TCHAR *str, str1[120];
  78:     int Score;
  79:     int x, y;
  80:  
  81:     switch(iMessage) {
  82:     case WM_DESTROY:
  83:         PostQuitMessage(0);
  84:         return 0;
  85:     
  86:     case WM_PAINT:                //윈도우에 변화가 일어나면 (모든)
  87:         hdc = BeginPaint(hWnd, &ps);    //DC를 얻음.
  88:         /* 책과 내꺼
  89:         SetPixel(hdc, 10, 10, RGB(255, 0, 0));
  90:         
  91:         MoveToEx(hdc, 50, 50, NULL);
  92:         LineTo(hdc, 300, 90);
  93: 
  94:         Rectangle(hdc, 50, 100, 200, 180);
  95: 
  96:         Ellipse(hdc, 220, 100, 400, 200);
  97: 
  98:         // (-_-)
  99:         Ellipse(hdc, 500, 500, 750, 650);
 100:         MoveToEx(hdc, 550, 550, NULL);
 101:         LineTo(hdc, 600, 550);
 102:         MoveToEx(hdc, 600, 600, NULL);
 103:         LineTo(hdc, 650, 600);
 104:         MoveToEx(hdc, 650, 550, NULL);
 105:         LineTo(hdc, 700, 550);
 106:         */
 107:  
 108:         //선생님 문제...집그리기
 109:         MoveToEx(hdc, 50, 150, NULL);
 110:         LineTo(hdc, 150, 50);
 111:         LineTo(hdc, 250, 150);
 112:         LineTo(hdc, 250, 350);
 113:         LineTo(hdc, 50, 350);
 114:         LineTo(hdc, 50, 150);
 115:         LineTo(hdc, 250, 150);    //여기까지 지붕.
 116:  
 117:         Rectangle(hdc, 100, 200, 150, 250);        //창문.
 118:         for(x = 0, y = 0 ; x < 25 ; x++ , y++)
 119:         {
 120:             Rectangle(hdc, 100 + x, 200 + y, 150 - x, 250 - y);        //창문색칠
 121:         }
 122:  
 123:         Rectangle(hdc, 500, 50, 600, 150);
 124:         Ellipse(hdc, 500, 50, 600, 150);
 125:  
 126:         //내꺼...나무
 127:         Rectangle(hdc, 550 - 200, 350, 560 - 200, 300);
 128:         Ellipse(hdc, 530 - 200, 200, 580 - 200, 300);
 129:         
 130:         for(x = 0, y = 0 ; x < 50 ; x++, y++)
 131:         {
 132:             Ellipse(hdc, 530 - 200 + x, 200 + y, 580 - 200 - x, 300 - y);
 133:         }        
 134:  
 135:         EndPaint(hWnd, &ps);    //DC해제
 136:         return 0;
 137:         
 138:  
 139:     }
 140:  
 141:     return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 142: }
 143:  
 144: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
 145: {
 146:     TextOut(hdc, x, y, Text, strlen(Text));
 147: }

image


● 메시지박스 예제

   1: // winAPI정복 page.58 예제: TextOut
   2: // 2011년 8월 23일 작성 
   3:  
   4: /* 윈도우즈 프로그래밍 순서 WinMain()
   5: 
   6:     WndClass정의
   7: 
   8:     클래스를 등록
   9: 
  10:     메모리상에 윈도우 생성
  11: 
  12:     윈도우를 화면에 출력
  13: 
  14:     메시지 루프 (반복)    여기서 텍스트 출력할 것.
  15: */
  16:  
  17: #include <windows.h>        // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
  18:  
  19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    //메시지처리함수
  20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
  21:  
  22: HINSTANCE g_hlnst;    //핸들 인스턴스
  23: LPCTSTR lpszClass = TEXT("First");        //윈도우 제목으로 사용되는 const char * (문자열)
  24:  
  25: /***************************************************************************************************************************
  26: WinMain은 엔트리 포인트(시작함수)
  27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
  28: 
  29: WinMain의 인자들...
  30: ① hInstance: 프로그램의 인스턴스 핸들
  31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
  32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
  33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
  34: ***************************************************************************************************************************/
  35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
  36: {
  37:     HWND hWnd;
  38:     MSG Message;
  39:     WNDCLASS WndClass;
  40:     g_hlnst = hInstance;
  41:  
  42:     WndClass.cbClsExtra = 0;
  43:     WndClass.cbWndExtra = 0;
  44:     WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  45:     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  46:     WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  47:     WndClass.hInstance = hInstance;
  48:     WndClass.lpfnWndProc = WndProc;
  49:     WndClass.lpszClassName = lpszClass;
  50:     WndClass.lpszMenuName = NULL;
  51:     WndClass.style = CS_HREDRAW | CS_VREDRAW;
  52:     RegisterClass(&WndClass);
  53:  
  54:     /*
  55:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  56:         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  57:         NULL, (HMENU)NULL, hInstance, NULL);
  58:     */
  59:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  60:         100, 100, 500, 500,
  61:         NULL, (HMENU)NULL, hInstance, NULL);
  62:     
  63:     ShowWindow(hWnd, nCmdShow);
  64:  
  65:     while(GetMessage(&Message, NULL, 0, 0)) {
  66:         TranslateMessage(&Message);
  67:         DispatchMessage(&Message);
  68:     }
  69:  
  70:     return (int)Message.wParam;
  71: }
  72:  
  73: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
  74: {
  75:     HDC hdc;
  76:     PAINTSTRUCT ps;
  77:     TCHAR *str, str1[120];
  78:     int iRet;
  79:     static int value = 0;
  80:  
  81:     switch(iMessage) {
  82:     case WM_DESTROY:
  83:         PostQuitMessage(0);
  84:         return 0;
  85:     
  86:     case WM_LBUTTONDOWN:        //왼쪽 클릭시
  87:         iRet = MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다."),
  88:             TEXT("메시지박스"), MB_OKCANCEL | MB_ICONWARNING);
  89:  
  90:         if(IDOK == iRet)
  91:         {
  92:             ++value;
  93:             wsprintf(str1, TEXT("value = %d"), value);
  94:             SetWindowText(hWnd, str1);
  95:         }
  96:  
  97:         return 0;
  98:  
  99:     case WM_RBUTTONDOWN:        //오른쪽 클릭시
 100:         MessageBox(hWnd, TEXT("마우스 오른쪽 버튼을 눌렀습니다."),
 101:             TEXT("메시지박스"), MB_OK | MB_ICONQUESTION);
 102:         return 0;
 103:         
 104:     }
 105:  
 106:     return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 107: }
 108:  
 109: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
 110: {
 111:     TextOut(hdc, x, y, Text, strlen(Text));
 112: }


● 메시지 박스 과제

   1: // winAPI정복 page.58 예제: TextOut
   2: // 2011년 8월 23일 작성 
   3:  
   4: /* 윈도우즈 프로그래밍 순서 WinMain()
   5: 
   6:     WndClass정의
   7: 
   8:     클래스를 등록
   9: 
  10:     메모리상에 윈도우 생성
  11: 
  12:     윈도우를 화면에 출력
  13: 
  14:     메시지 루프 (반복)    여기서 텍스트 출력할 것.
  15: */
  16:  
  17: #include <windows.h>        // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
  18:  
  19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    //메시지처리함수
  20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
  21:  
  22: HINSTANCE g_hlnst;    //핸들 인스턴스
  23: LPCTSTR lpszClass = TEXT("메시지 박스 연습");        //윈도우 제목으로 사용되는 const char * (문자열)
  24:  
  25: /***************************************************************************************************************************
  26: WinMain은 엔트리 포인트(시작함수)
  27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
  28: 
  29: WinMain의 인자들...
  30: ① hInstance: 프로그램의 인스턴스 핸들
  31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
  32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
  33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
  34: ***************************************************************************************************************************/
  35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
  36: {
  37:     HWND hWnd;
  38:     MSG Message;
  39:     WNDCLASS WndClass;
  40:     g_hlnst = hInstance;
  41:  
  42:     WndClass.cbClsExtra = 0;
  43:     WndClass.cbWndExtra = 0;
  44:     WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  45:     WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  46:     WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  47:     WndClass.hInstance = hInstance;
  48:     WndClass.lpfnWndProc = WndProc;
  49:     WndClass.lpszClassName = lpszClass;
  50:     WndClass.lpszMenuName = NULL;
  51:     WndClass.style = CS_HREDRAW | CS_VREDRAW;
  52:     RegisterClass(&WndClass);
  53:  
  54:     
  55:     hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
  56:         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  57:         NULL, (HMENU)NULL, hInstance, NULL);
  58:     
  59:     ShowWindow(hWnd, nCmdShow);
  60:  
  61:     while(GetMessage(&Message, NULL, 0, 0)) {
  62:         TranslateMessage(&Message);
  63:         DispatchMessage(&Message);
  64:     }
  65:  
  66:     return (int)Message.wParam;
  67: }
  68:  
  69: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
  70: {
  71:     TCHAR str1[120];
  72:     int iRet;
  73:     static int value = 0;
  74:  
  75:     switch(iMessage) {
  76:     case WM_DESTROY:
  77:         PostQuitMessage(0);
  78:         return 0;
  79:     
  80:     case WM_LBUTTONDOWN:        //왼쪽 클릭시
  81:         iRet = MessageBox(hWnd, TEXT("왼쪽 버튼을 눌렀습니다."),
  82:             TEXT("마우스 확인"), MB_OK | MB_ICONINFORMATION);
  83:  
  84:         if(IDOK == iRet)
  85:         {
  86:             ++value;
  87:             wsprintf(str1, TEXT("value = %d"), value);
  88:             SetWindowText(hWnd, str1);
  89:         }
  90:  
  91:         return 0;
  92:  
  93:     case WM_RBUTTONDOWN:        //오른쪽 클릭시
  94:         iRet = MessageBox(hWnd, TEXT("왼쪽 버튼을 눌렀습니까?"),
  95:             TEXT("마우스 확인"), MB_YESNO | MB_ICONQUESTION);
  96:  
  97:         if(IDNO == iRet)
  98:         {
  99:             ++value;
 100:             wsprintf(str1, TEXT("value = %d"), value);
 101:             SetWindowText(hWnd, str1);
 102:         }
 103:  
 104:         return 0;
 105:         
 106:     }
 107:  
 108:  
 109:     return(DefWindowProc(hWnd, iMessage, wParam, lParam));
 110: }
 111:  
 112: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
 113: {
 114:     TextOut(hdc, x, y, Text, strlen(Text));
 115: }