Programming Language/Windows API

TextOut(), DrawText()

D4tai1 2018. 8. 26.

1. 로또번호 출력 

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.

   HWND hWnd = CreateWindowW(szWindowClass, _T("최소화, 최대화가 없는 창입니다."), WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

#include<time.h>

int data[6];

void mypaint() {
	srand(time(NULL));
	for (int i = 0; i < sizeof(data) / 4; i += 1) {
		int imsi = rand() % 6 + 1;
		data[i] = imsi;

		for (int j = 0; j < i; j++) {
			if (data[j] == imsi) {
				i--;
				break;
			}
		}
	}
}

void my_textout(HDC hdc) {
	TCHAR tmp[80];

	for (int i = 0; i < sizeof(data) / 4; i++) {
		_stprintf_s(tmp, _T("%d"), data[i]);
		TextOut(hdc, 150 + i * 20, 100, tmp, _tcslen(tmp));
	}
}

void myrect(HDC hdc, RECT *rect) {
	rect->left = 30;
	rect->top = 100;
	rect->right = 200;
	rect->bottom = 120;
}

void my_drawtext(HDC hdc, RECT *rect) {
	TCHAR tmp[40];

	_stprintf_s(tmp, _T("LOTTO Number : "));
	DrawText(hdc, tmp, _tcslen(tmp), rect, DT_SINGLELINE | DT_LEFT);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 메뉴 선택을 구문 분석합니다.
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
			RECT rect;
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다.
			mypaint();
			myrect(hdc, &rect);
			my_textout(hdc);
			my_drawtext(hdc, &rect);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

[실행화면]

 

 

사용한 함수 및 구조체에 대한 설명

 

1. _stprintf_s(입력할 메모리공간, 입력할 데이터);

 - 입력할 데이터를 메모리공간에 넣는다.

 - String printf Secure 의 약자이다.

 

2. TextOut(그릴 영역, x좌표, y좌표, 그릴데이터, 그릴데이터의 길이);

 - 영역 내의 (x,y) 좌표에 데이터를 원하는 사이즈만큼 그린다.

 

3. _tcslen(데이터);

 - 데이터를 넣으면 데이터의 길이를 반환해주는 함수이다.

 - TCHAR String Length의 약자이다.

 

4. RECT *rect

 - RECT 구조체타입의 인스턴스의 주소를 가져온다.

 - RECT 구조체는 top, bottom, left, right로 구성되어 있다.

 

5. DrawText(그릴 영역, 그릴데이터, 그릴데이터의 길이, 영역 내의 사각형좌표, 그릴 방식);

 - 영역 내에 가상의 사각형을 만들고 그 안에 데이터를 원하는 사이즈만큼

  방식(왼쪽정렬, 중앙정렬, 줄바꿈금지)에 따라 그린다.

 - TextOut()함수와 비슷하지만 영역의 좌표를 전달하는 매개변수가 있고, 영역 내 출력 방식(플래그) 가 추가로 있다.

 

6. PAINTSTRUCT ps;

 - 출력영역(Device Context)에 대한 상세정보가 저장되어 있다.

 

7. HDC hdc = BeginPaint(hWnd, &ps);

 - 특정 창에 출력영역에 대한 정보로 출력영역(Device Context)의 핸들을 반환받아 hdc에 저장한다.

 

8. EndPaint(hWnd, &ps);

 - BeginPaint(hWnd, &ps); 함수로 Device Context를 얻어와 출력을 마친 후

  EndPaint(hWnd, &ps); 함수를 호출하여 출력의 끝을 지정(인자는 BeginPaint()와 같아야 한다.)

'Programming Language > Windows API' 카테고리의 다른 글

keyboard[1]  (0) 2018.08.27
키보드 메세지 처리  (0) 2018.08.26
기본구조 상세설명  (0) 2018.08.25
출력  (0) 2018.08.25
용어  (0) 2018.07.14

댓글