Понадобилась прокрутка текста внутри 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 элемента. Если они совпадают, то начинаем смотреть в какую сторону это самое колесико крутилось. От себя — прокручиваем вверх, к себе — прокручиваем вниз.