strftime печатает тот же формат даты вместо новой даты при использовании с событиями окна верхнего уровня - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь получить формат даты, когда когда-либо пользователь меняет его в системной ОС, но я получаю ту же дату.

У меня есть такой код:

#include <windows.h>
#include <iostream>
#include <tchar.h>
#include <stdio.h>  /* printf */
#include <time.h>   /* time_t, struct tm, time, localtime, strftime */
#include <locale.h> /* struct lconv, setlocale, localeconv */
#include <stdlib.h>
using namespace std;

const TCHAR g_szClassName[] = TEXT("myWindowClass");

int getDate() {
  time_t rawtime;
  struct tm *timeinfo;
  char system_date_buffer[80];
  char iso_date_buffer[80];
  int date_format;

  struct lconv *lc;

  time(&rawtime);
  timeinfo = localtime(&rawtime);

  setlocale(LC_ALL, "");
  strftime(system_date_buffer, 80, "%x", timeinfo);
  printf("System Date format is: %s\n", system_date_buffer);
  strftime(iso_date_buffer, 80, "%Y-%m-%d", timeinfo);
  printf("ISO Date format is: %s\n", iso_date_buffer);
  return puts(iso_date_buffer);
  return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  switch (msg) {
  case WM_SETTINGCHANGE: {
    getDate();
    cout << "event received - lParam: " << (char *)lParam << endl;

  } break;
  case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow) {
  WNDCLASSEX wc;
  HWND hwnd;
  MSG Msg;

  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = 0;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = g_szClassName;
  wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

  if (!RegisterClassEx(&wc)) {
    MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"),
               MB_ICONEXCLAMATION | MB_OK);
    return 0;
  }

  hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName,
                        _T("The title of my window"), WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL,
                        hInstance, NULL);

  if (hwnd == NULL) {
    MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"),
               MB_ICONEXCLAMATION | MB_OK);
    return 0;
  }

  // ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

  while (GetMessage(&Msg, NULL, 0, 0) > 0) {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
  }
  return Msg.wParam;
}

Когда-либо событие запускается и здесь учитывается регистр, я вызываю getDate() метод:

case WM_SETTINGCHANGE: {
     getDate(); // prints same date value
     cout << "event received - lParam: " << (char *)lParam << endl;
}

Но он печатает тот же формат даты. Зачем? Такие переменные, как struct tm *timeinfo;, создаются каждый раз, когда вызывается метод, я думаю, так почему он не печатает новый формат даты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...