Как в richedit отключить звук

138
14 августа 2019, 05:20

Если, когда курсор находится в позиции 0,0 нажать влево или вверх (т.е. попытка выйти за пределы редактируемой области) то стандартный richedit даёт звуковой сигнал (bell наверно). Как убрать это пищание?

Использую CreateWindowEx, пример создания richedit http://docs.microsoft.com/en-us/windows/desktop/controls/create-rich-edit-controls где-то так:

 LoadLibrary(TEXT("Msftedit.dll"));
 HWND hwndEdit= CreateWindowEx(0, MSFTEDIT_CLASS, TEXT("Type here"),
    ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 
    x, y, width, height, 
    hwndOwner, NULL, hinst, NULL);

P.S. В винде есть "яркий" пример скудного использования richedit - wordpad. Разработчики не стали заморачиваться - звук оставили (а может так и задумано). Запустить wordpad нажать влево - и будет тот же самый визг.

Если есть пример для делфи, для компонента СRichEdit и т п, который использует компоненту richedit WINAPI - то тоже подходит, я уже найду и докопаю как это сделать в WINAPI.

Answer 1

Как-то так:

typedef LRESULT (CALLBACK * PWNDPROC ) (HWND, UINT, WPARAM, LPARAM); 
PWNDPROC RichEditOldWndProc = NULL; //указатель на стандартную WNDPROC элемента Rich Edit
LRESULT CALLBACK RichEditNewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //переопределенный WNDPROC для Rich Edit
{   
    CHARRANGE cr;
    int line;
    switch (message)
    {
    case WM_KEYDOWN:
        switch (wParam){
        case VK_UP:
            //получаем текущую позицию курсора 
            ZeroMemory(&cr,sizeof(cr));
            SendMessage(hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
            //находим, на какой строке находится курсор
            line = SendMessage(hWnd, EM_EXLINEFROMCHAR, 0, cr.cpMin);
            //если курсор на первой строке, не передаем управление стандартной WNDPROC
            if(line == 0) return 0;
            break;                      
        }
        break;  
        //аналогично для случаев вниз/вправо/влево...
    }
    //передаем управление стандартной WNDPROC...
    return RichEditOldWndProc(hWnd,message,wParam,lParam);
}

void InitRichEdit()
{  
   LoadLibrary(TEXT("Msftedit.dll"));
   HWND hwndEdit= CreateWindowEx(0, MSFTEDIT_CLASS, TEXT(""),
    ES_MULTILINE | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 
    x, y, width, height, 
    hWnd, NULL, hInst, NULL);
   //сохраняем указатель на стандартную WNDPROC
   RichEditOldWndProc = (PWNDPROC) GetWindowLongPtr(hwndEdit, GWLP_WNDPROC);
   //переопределяем WNDPROC
   SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)RichEditNewWndProc);
}
READ ALSO
Помогите исправить код( нужно чтобы код содержал две функции по мимо main())

Помогите исправить код( нужно чтобы код содержал две функции по мимо main())

Нужно сделать функцию, которая будет принимать от пользователя его вариант, а также другую функцию, которая будет определять, соответствует...

91
Как работает метод insert в в классе Vector в с++?

Как работает метод insert в в классе Vector в с++?

В методе insert класса Vector нужно передать итератор указывающий на позицию в которую ты хочешь поместить элемент, я правильно понимаю что для...

159
Работа с указателями в С++

Работа с указателями в С++

Извините за глупый вопрос, но я только начал осваивать С++Нашел в интернете код, где написана строка, но так и не смог понять, что она означает

95
Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты? [закрыт]

Как лучше всего организовать структуру C++ проекта, использующего CMake и юнит-тесты?

134