Вспоминаем Си. RichEdit, прокрутка текста колесиком мыши

Понадобилась прокрутка текста внутри RichEdit элемента, даже в том случае, если оно не в фокусе. Долго думать не пришлось, все довольно тривиально:

LRESULT CALLBACK mainDlgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
  switch (msg) {
  ..
  ..
  case WM_MOUSEWHEEL: {
    // catch MOUSE WHEEL message
    POINT  pos;
    GetCursorPos(&pos);
    if (WindowFromPoint(pos) == GetDlgItem(hwnd, IDC_RICHEDIT1)) {
      // process message, if cursor over our richedit control
      // get Delta
      int zDelta = GET_WHEEL_DELTA_WPARAM(wparam);

      if (zDelta > 0)
        // scroll up
        SendDlgItemMessage(hwnd, IDC_RICHEDIT1,WM_VSCROLL,SB_LINEUP,0L);
      else
        // scroll down
        SendDlgItemMessage(hwnd, IDC_RICHEDIT1,WM_VSCROLL,SB_LINEDOWN,0L);
      return 1L;
    }
    break;
  }
  ..
  ..

Грубо говоря, перехватываем сообщение WM_MOUSEWHEEL, каждый раз когда мы крутим колесико мыши, срабатывает вышеприведенный кусок кода. В нем мы определяем позицию курсора мыши в момент получения сообщения, сравниваем хэндл окна под ним с хэндлом нашего целевого RichEdit элемента. Если они совпадают, то начинаем смотреть в какую сторону это самое колесико крутилось. От себя — прокручиваем вверх, к себе — прокручиваем вниз.

Запись опубликована в рубрике Программирование с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий