Если, когда курсор находится в позиции 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.
Как-то так:
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);
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости