C++에서 TextOut()을 사용하여 텍스트 업데이트

Syed Hassan Sabeeh Kazmi 2023년10월12일
C++에서 TextOut()을 사용하여 텍스트 업데이트

C++의 TextOut() 함수는 선택한 글꼴, 배경색 및 텍스트 색상을 사용하여 지정된 위치에 문자열을 씁니다. #include <wingdi.h>에 속합니다.

이 튜토리얼에서는 C++에서 TextOut() 함수를 사용하여 텍스트를 업데이트하는 방법을 배웁니다.

C++ 프로그램이 지정된 장치에 대해 TextOut() 함수를 호출할 때마다 현재 위치를 사용하고 업데이트하는 흥미로운 아이디어는 TA_UPDATECP로 설정된 fMode 매개변수를 사용하여 SetTextAlign 함수를 사용하는 것입니다(이는 시스템을 허용할 수 있습니다). wingdi.h 헤더 파일은 TextOut() 기능을 이 기능의 적합한 버전을 선택하기 위해 OS 또는 프로세서의 ANSI 또는 유니코드 버전을 자동으로 감지하는 별칭으로 정의합니다.

텍스트 문자열의 소스를 사용하여 C++에서 TextOut() 함수를 사용하여 텍스트 업데이트

TextOut() 함수는 장치 컨텍스트를 처리하는 [in] hdc, x 좌표를 나타내는 [in] x, y 좌표를 나타내는 [in] y 등 5개의 매개변수를 가질 수 있습니다. [in] IpString은 문자열에 대한 포인터이고 [in] c는 문자열의 길이를 정의합니다. 이 함수가 완벽하게 실행되면 0이 아닌 값을 반환합니다. 그렇지 않으면 null 또는 0이 생성됩니다.

또한 참조점의 해석은 정비례하며 C++ 프로그램의 최신(현재) 텍스트 정렬 모드에 따라 달라집니다. 그러나 GetTextAlign 기능을 호출하여 현재 텍스트 정렬 모드를 검색할 수 있습니다.

// displaying text
#include <windows.h>

// define `#include <wingdi.h>` separately or the `windows.h` is an alternative

DWORD text_repaintcount = 0;  // to handle the color_code of the primary text

// a call back to the pre-defined function defined in the `windows.h` header
// file
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,
                         LPARAM);  // initialize the handle, `typedef UNIT`,
                                   // `typedef UNIT_PTR`, and `typeof LONG_PTR`

int WINAPI WinMain(HINSTANCE obj_instance_hi, HINSTANCE hInstance_prevent,
                   LPSTR lp_cmd_imp, int show_cmd_new) {
  WNDCLASSEX obj_windclass;
  MSG obj_showmessage;
  obj_windclass.cbSize = sizeof(WNDCLASSEX);
  obj_windclass.style = 0;
  obj_windclass.lpfnWndProc = WndProc;
  obj_windclass.cbClsExtra = 0;
  obj_windclass.cbWndExtra = 0;
  obj_windclass.hInstance = obj_instance_hi;
  obj_windclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  obj_windclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  obj_windclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  obj_windclass.lpszMenuName = NULL;
  obj_windclass.lpszClassName = TEXT("New Window!");
  obj_windclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

  RegisterClassEx(&obj_windclass);
  CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("New Window!"), TEXT("Text Output"),
                 WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
                 850, 350, NULL, NULL, obj_instance_hi, NULL);

  while (GetMessage(&obj_showmessage, NULL, 0, 0) > 0) {
    TranslateMessage(&obj_showmessage);
    DispatchMessage(&obj_showmessage);
  }

  return obj_showmessage.wParam;
}

LRESULT CALLBACK WndProc(HWND obj_hwnd_pri, UINT obj_message_show,
                         WPARAM obj_wparma_sec, LPARAM obj_iparma_sec) {
  PAINTSTRUCT obj_paint_structure;
  HDC obj_HDC_pri;
  SIZE text_updated_size;
  TCHAR obj_string[100] = TEXT("\0");
  HFONT text_update_font;
  HBRUSH text_update_hbrush;
  TEXTMETRIC text_metric;

  int temp_y = 0;
  int temp_x = 0;
  int text_update_length;

  switch (obj_message_show) {
    case WM_PAINT:  // it traps the paint message

      // the following outputs the text using the default font and other
      // settings
      obj_HDC_pri = BeginPaint(obj_hwnd_pri, &obj_paint_structure);
      int obj_hDC_last;
      obj_hDC_last =
          SaveDC(obj_HDC_pri);  // save the current operating device context
      text_update_length = wsprintf(obj_string, TEXT("Stock font"));
      TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);

      // updating text using the `ANSI_FIXED_PONT` and outputting the text
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y =
          temp_y +
          text_metric
              .tmHeight;  // calculate new vertical coordinate using text metric

      text_update_hbrush = (HBRUSH)GetStockObject(ANSI_FIXED_FONT);

      SelectObject(obj_HDC_pri, text_update_hbrush);
      text_update_length = wsprintf(obj_string, TEXT("ANSI_FIXED_FONT"));
      TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);

      // changing the primary color of the text and producing it as an output
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y + text_metric.tmHeight;

      COLORREF textcolor_new;
      textcolor_new = COLORREF RGB(255, 0, 0);

      SetTextColor(obj_HDC_pri, textcolor_new);
      text_update_length =
          wsprintf(obj_string, TEXT("ANSI_FIXED_FONT, color red"));
      TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);

      // changing the background color of the text to blue and producing it as
      // an output
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y + text_metric.tmHeight;

      COLORREF text_update_backgroundcolor;
      text_update_backgroundcolor = COLORREF RGB(0, 0, 255);

      SetBkColor(obj_HDC_pri, text_update_backgroundcolor);
      text_update_length = wsprintf(
          obj_string, TEXT("ANSI_FIXED_FONT, color red with blue background"));
      TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);

      // set the background of the text transparent and produce it as an output
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y + text_metric.tmHeight;
      SetBkMode(obj_HDC_pri, TRANSPARENT);

      SelectObject(obj_HDC_pri, text_update_hbrush);
      text_update_length = wsprintf(
          obj_string, TEXT("ANSI_FIXED_FONT,color red transparent background"));
      TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);

      // changing the font of the text to `Arial` and changing its size to
      // output
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y + text_metric.tmHeight;
      text_update_font =
          CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Ariel"));

      SelectObject(obj_HDC_pri, text_update_font);
      text_update_length = wsprintf(
          obj_string,
          TEXT("ANSI_FIXED_FONT, color red, transparent background,arial 20"));
      TextOut(obj_HDC_pri, 0, temp_y, obj_string, text_update_length);

      // use the saved value to restore the original font size, style, and other
      // settings
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y + text_metric.tmHeight;

      RestoreDC(obj_HDC_pri, obj_hDC_last);
      text_update_length = wsprintf(
          obj_string, TEXT("stock font restored using SaveDC/RestoreDC"));
      TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
      GetTextMetrics(obj_HDC_pri, &text_metric);
      temp_y = temp_y +
               text_metric.tmHeight;  // calculating the vertical co-ordinates
                                      // using the `text_metric`

      // changing font to `new roman` and size to `30` and producing an output
      int obj_text_baseline;  // calculate the baseline of the font
      text_update_font = CreateFont(30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                    TEXT("Times New Roman"));

      SelectObject(obj_HDC_pri, text_update_font);
      GetTextMetrics(obj_HDC_pri, &text_metric);
      obj_text_baseline = text_metric.tmAscent;
      text_update_length =
          wsprintf(obj_string, TEXT("times new roman 30 statement 1"));
      TextOut(obj_HDC_pri, temp_x, temp_y, obj_string, text_update_length);
      GetTextExtentPoint32(obj_HDC_pri, obj_string, text_update_length,
                           &text_updated_size);
      temp_x = temp_x + text_updated_size.cx;

      // change the font into `courier new` and the size to `20` and output the
      // updated text
      int text_changefont_baselinecourier;
      text_update_font = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                    TEXT("Courier New"));

      SelectObject(obj_HDC_pri, text_update_font);
      GetTextMetrics(obj_HDC_pri, &text_metric);
      text_changefont_baselinecourier =
          obj_text_baseline - text_metric.tmAscent;
      text_update_length = wsprintf(obj_string, TEXT("Courier statement "));
      TextOut(obj_HDC_pri, temp_x, temp_y + text_changefont_baselinecourier,
              obj_string, text_update_length);
      GetTextExtentPoint32(obj_HDC_pri, obj_string, lstrlen(obj_string),
                           &text_updated_size);
      temp_x = temp_x + text_updated_size.cx;

      // changing the font to `ariel` and size to `20` and output the updated
      // text
      int text_fontchange_baselinearial;
      text_update_font =
          CreateFont(10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Ariel"));

      SelectObject(obj_HDC_pri, text_update_font);
      GetTextMetrics(obj_HDC_pri, &text_metric);
      text_fontchange_baselinearial = obj_text_baseline - text_metric.tmAscent;
      text_update_length = wsprintf(obj_string, TEXT("ariel 10 statement 3 "));
      TextOut(obj_HDC_pri, temp_x, temp_y + text_fontchange_baselinearial,
              obj_string, text_update_length);

      EndPaint(obj_hwnd_pri, &obj_paint_structure);
      DeleteDC(obj_HDC_pri);
      DeleteObject(text_update_font);
      DeleteObject(text_update_hbrush);
      break;

    case WM_CLOSE:
      DestroyWindow(obj_hwnd_pri);
      break;

    case WM_DESTROY:
      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(obj_hwnd_pri, obj_message_show, obj_wparma_sec,
                           obj_iparma_sec);
  }

  return 0;
}

출력:

https://drive.google.com/file/d/1YUs55n-gw1rYgOrBce0RAuuET5UPdTLa/view?usp=sharing

Windows C++ 애플리케이션에서 WM_PAINT를 처리할 때 TextOut() 함수를 사용하여 업데이트된 텍스트를 표시할 텍스트 문자열의 소스를 선언합니다. 이 자습서의 C++ 코드는 자체적으로 작동하지 않지만 적절한 Windows에서 Visual Studio 또는 .dsp, .dsw, .ncb.opt 파일을 사용하여 사용자 인터페이스를 결합하여 Windows에서 적절한 대화 상자.

Windows API는 새 버전의 Windows와 함께 변경되었으며 현재 버전에는 L"wchar_ttext와 같은 L 한정자가 필요합니다. 이 C++ 코드는 Windows 10에서 Visual Studio 2019를 사용하여 테스트되었습니다.

또한 wWinMain(), myRegisterClass(), InitInstance()WndProc()를 사용하여 Windows 데스크톱 GUI 애플리케이션용 스켈레톤을 생성하고 글꼴을 HDC에 사용하여 텍스트를 그립니다. TextOut() 함수를 사용하여 업데이트된 새 글꼴로 텍스트를 그립니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub