Значок поиска в элементе управления редактированием перекрывается областью вводаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Значок поиска в элементе управления редактированием перекрывается областью ввода

Сообщение Anonymous »

Я пытаюсь создать элемент управления редактированием поиска в MFC, значок которого постоянно отображается в окне управления (независимо от состояния и текста элемента управления). Я написал что-то подобное много лет назад и работало очень хорошо, но код больше не работает в Windows 7 и новее (может быть, даже в Vista, но я не пробовал). Происходит следующее: изображение, показанное в элементе управления, перекрывается с областью ввода (см. рисунок ниже).

Идея кода:
  • иметь класс, производный от CEdit (который обрабатывает рисование в OnPaint)
  • значок отображается на вправо, а область редактирования уменьшается в зависимости от размера значка.
  • изменение размера выполняется по-разному для однострочного и многострочного редактирования. Для однострочного редактирования я вызываю SetMargins, а для многострочного редактирования я вызываю SetRect.
  • это изменение размера редактирования применяется в PreSubclassWindow(), OnSize() и OnSetFont()
Вот как применяется размер ввода для редактирования:

Код: Выделить всё

void CSymbolEdit::RecalcLayout()
{
int width = GetSystemMetrics( SM_CXSMICON );

if(m_hSymbolIcon)
{
if (GetStyle() & ES_MULTILINE)
{
CRect editRect;
GetRect(&editRect);

editRect.right -= (width + 6);

SetRect(&editRect);
}
else
{
DWORD dwMargins = GetMargins();
SetMargins(LOWORD(dwMargins), width + 6);
}
}
}
На следующем изображении показана проблема с редактированием одной строки (изображения были увеличены для лучшего просмотра). Желтый фон предназначен только для выделения. В реальном коде я использую системный цвет COLOR_WINDOW. Вы можете видеть, что когда однострочное редактирование содержит текст и ввод, левое изображение закрашивается. Этого не происходит при многострочном редактировании, когда SetRect правильно устанавливает прямоугольник форматирования.

[img]https: //i.sstatic.net/kBTu4.png[/img]


Я попробовал использовать ExcludeClipRect, чтобы удалить область редактирования, в которой отображается изображение.

Код: Выделить всё

CRect rc;
GetClientRect(rc);

CPaintDC dc(this);
ExcludeClipRect(dc.m_hDC, rc.right - width - 6, rc.top, rc.right, rc.bottom);

DWORD dwMargins = GetMargins();
SetMargins(LOWORD(dwMargins), width + 6);
Похоже, это не влияет на результат.

Для справки: это метод рисования. , написанный много лет назад и хорошо работавший в Windows XP, но уже не корректный.

Код: Выделить всё

void CSymbolEdit::OnPaint()
{
CPaintDC dc(this);

CRect rect;
GetClientRect( &rect );

// Clearing the background
dc.FillSolidRect( rect, GetSysColor(COLOR_WINDOW) );

DWORD dwMargins = GetMargins();

if( m_hSymbolIcon )
{
// Drawing the icon
int width = GetSystemMetrics( SM_CXSMICON );
int height = GetSystemMetrics( SM_CYSMICON );

::DrawIconEx(
dc.m_hDC,
rect.right - width - 1,
1,
m_hSymbolIcon,
width,
height,
0,
NULL,
DI_NORMAL);

rect.left += LOWORD(dwMargins) + 1;
rect.right -= (width + 7);
}
else
{
rect.left += (LOWORD(dwMargins) + 1);
rect.right -= (HIWORD(dwMargins) + 1);
}

CString text;
GetWindowText(text);
CFont* oldFont = NULL;

rect.top += 1;

if(text.GetLength() == 0)
{
if(this != GetFocus() && m_strPromptText.GetLength() > 0)
{
oldFont = dc.SelectObject(&m_fontPrompt);
COLORREF color = dc.GetTextColor();
dc.SetTextColor(m_colorPromptText);
dc.DrawText(m_strPromptText, rect, DT_LEFT|DT_SINGLELINE|DT_EDITCONTROL);
dc.SetTextColor(color);
dc.SelectObject(oldFont);
}
}
else
{
if(GetStyle() & ES_MULTILINE)
CEdit::OnPaint();
else
{
oldFont = dc.SelectObject(GetFont());
dc.DrawText(text, rect, DT_SINGLELINE | DT_INTERNAL | DT_EDITCONTROL);
dc.SelectObject(oldFont);
}
}
}
Я просмотрел другие реализации подобных элементов управления редактированием, и теперь все они имеют один и тот же недостаток.

Очевидно, вопрос в том, как исключить область изображения из области ввода элемента управления?

Подробнее здесь: https://stackoverflow.com/questions/388 ... input-area
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»