C++ Windows API return 1L; в WM_ERASEBKGND

174
27 марта 2019, 16:30
case WM_ERASEBKGND: {
  RECT rc;
  hdc = (HDC)wParam;
  GetClientRect(hwnd, &rc);
  SetMapMode(hdc, MM_ANISOTROPIC);
  SetWindowExtEx(hdc, 100, 100, NULL);
  SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
  FillRect(hdc, &rc, CreateSolidBrush(this->background));
  return 1L;
}

Что происходит когда return 1L?

Мой метод который обновляет background не работает если заменить return 1L; на break;

bool Window::SetBackground(COLORREF background) {
  this->background = background;
  InvalidateRect(this->hwnd, NULL, TRUE);
  return true;
}

Что такое 1L? в чем разница между return 1L; и break;?

Answer 1

Разница между 1L и break действительно существует, но в вашем случае важнее что происходит после break. Поскольку обработчик WM_ERASEBKGND может возвращать либо FALSE, либо TRUE (что в случае С/С++ означает либо 0, либо ненулевое значение), то очевидно, что после break у вас стоит return 0.

Конкретно return 1L сообщает системе, что ваш обработчик это сообщение обработал (стер фон) и система стирать ничего не должна. Если вы ставите break (то есть выполняете return 0), то вы говорите системе, что ваш обработчик не стал обрабатывать это сообщение, и его должна обработать система (другими словами, стереть все сама - при этом, вероятно, удалив результат вашего обработчика).

READ ALSO
Использование BufferedReader в Java

Использование BufferedReader в Java

Изучаю JavaВ литературе и на многих ресурсах пишется, что использование буферезированного ввода данных является наиболее эффективным, с точки...

191
Падает приложение [закрыт]

Падает приложение [закрыт]

Ребята, не могу понять, почему падает приложение, помогите разобраться В задумке: оно должно выполнять два разных сценария в зависимости...

153
Не вызывается контекстное меню

Не вызывается контекстное меню

Элемент Listview не реагирует на длительное нажатие и не вызывается контекстное меню

138