Прозрачный 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
}
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.