Прозрачный EditControl для ввода текста поверх картинки.
От: C0x  
Дата: 12.01.17 14:18
Оценка:
Задача: добавить возможность вводить текст на картинках. Т.е. пользователь тыкает мышкой в любой участок картинки (нарисована в CDialog) и
в этом месте должен появиться курсор для ввода текста. Курсор должен быть на фоне картинки текст должен вводиться многострочный.

Мое решение: логично возникала мысль реализовать с помощью EditControl. В момент клика, добавляю в нужную область диалога EditControl и
после того как пользователь закончит ввод вырезаю область с текстом и вставляю в исходную картинку.

Проблема 1: текст вводится нормально, но при этом он почему-то не удаляется. Если я выделяю текст,то выделение так же не убирается.
Т.е. по сути все что в нем нарисовано не удаляется. Как это можно решить?

Проблема 2: Почему-то не работает Multiline режим,который выставлен для IDC_EDIT1. Т.е. если я нажимаю Enter ничего не происходит. Если же я меняю
мой CEditTrans на просто CEdit то все ок, кроме прозрачности.


Пока выглядит это так:

#include "stdafx.h"
#include "EditTrans.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEditTrans

CEditTrans::CEditTrans()
{
    m_TextColor = RGB(255, 255, 255);
    m_BackColor = TRANS_BACK;
}

CEditTrans::~CEditTrans()
{
}


BEGIN_MESSAGE_MAP(CEditTrans, CEdit)
    //{{AFX_MSG_MAP(CEditTrans)
    ON_WM_CTLCOLOR_REFLECT()
    //ON_WM_CTLCOLOR()
    //ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
    ON_WM_LBUTTONDOWN()
    //ON_CONTROL_REFLECT(EN_KILLFOCUS, OnKillfocus)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEditTrans message handlers

HBRUSH CEditTrans::CtlColor(CDC* pDC, UINT nCtlColor) 
{
    m_Brush.DeleteObject();

        m_Brush.CreateStockObject(HOLLOW_BRUSH);
        //Делаем прозрачным бэкграунд
        pDC->SetBkMode(TRANSPARENT);

    pDC->SetTextColor(m_TextColor);

    return (HBRUSH)m_Brush;
}


void CEditTrans::OnKillfocus() 
{
    UpdateCtrl();
}


void CEditTrans::OnUpdate() 
{
    UpdateCtrl();
}


void CEditTrans::OnLButtonDown(UINT nFlags, CPoint point) 
{
    UpdateCtrl();
    
    CEdit::OnLButtonDown(nFlags, point);
}


void CEditTrans::UpdateCtrl()
{
    CWnd* pParent = GetParent();
    CRect rect;
    
    GetWindowRect(rect);
    pParent->ScreenToClient(rect);
    rect.DeflateRect(2, 2);
    
    pParent->InvalidateRect(rect, FALSE);    
}


В самом диалоге

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CMyDlg)
    DDX_Control(pDX, IDC_EDIT1, m_textEdit);
    //}}AFX_DATA_MAP
}
...
Re: Прозрачный EditControl для ввода текста поверх картинки.
От: Evgeniy Skvortsov Россия  
Дата: 12.01.17 14:57
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Мое решение: логично возникала мысль реализовать с помощью EditControl. В момент клика, добавляю в нужную область диалога EditControl и

C0x>после того как пользователь закончит ввод вырезаю область с текстом и вставляю в исходную картинку.

Тут есть решение, всё в пару строк делается.

[Добавлено]
А, ты видимо его и использовал.
Отредактировано 12.01.2017 15:01 Evgeniy Skvortsov . Предыдущая версия .
Re[2]: Прозрачный EditControl для ввода текста поверх картинки.
От: C0x  
Дата: 12.01.17 15:37
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, C0x, Вы писали:


C0x>>Мое решение: логично возникала мысль реализовать с помощью EditControl. В момент клика, добавляю в нужную область диалога EditControl и

C0x>>после того как пользователь закончит ввод вырезаю область с текстом и вставляю в исходную картинку.

ES>Тут есть решение, всё в пару строк делается.


ES>[Добавлено]

ES>А, ты видимо его и использовал.

Ага и оно не работает как надо.
Re[3]: Прозрачный EditControl для ввода текста поверх картинки.
От: Evgeniy Skvortsov Россия  
Дата: 12.01.17 16:49
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Ага и оно не работает как надо.


Кажется проблема в том, что при установке режима pDC->SetBkMode(TRANSPARENT) не происходит затирания фона.
В связи с этим нужно обрабатывать WM_ERASEBKGND, при создании контрола захватить кусок изображения которое находится под EDIT и восстанавливать его.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.