Перерисовать холст в C ++ Tizen

Я пытаюсь понять пример для мультитач в Tizen.
У меня проблема со следующей частью (этот метод вызывается каждый раз, когда я перемещаю палец по холсту на один пиксель или более):

result
MainForm::OnDraw(void)
{
__pCanvas->Show();
__pCanvas->
Canvas* pCanvas = GetCanvasN();

if (pCanvas)
{
pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
*__pCanvas, GetClientAreaBounds());
delete pCanvas;
}
// Do not call Show(); it is called automatically after OnDraw() callback

return E_SUCCESS;
}

Вот пример сенсорного метода:

void
MainForm::OnTouchMoved(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo)
{
__pointCount++;
__strokes[__strokeCount].push_back(currentPosition);
DrawLine(__prevPosition, currentPosition, Color::GetColor(COLOR_ID_BLACK));
Tizen::Base::String string;
string.Append("...");
string.Append((int)__pointCount);
__pCanvas->DrawText(Point(50, 300), string);
__prevPosition = currentPosition;
Invalidate(false);
AppLog("OnTouchMoved");
}

И мой метод drawLine ():

void
MainForm::DrawLine(const Tizen::Graphics::Point& prevPoint, const Tizen::Graphics::Point& point, const Tizen::Graphics::Color& color)
{
if (__pCanvas)
{
__pCanvas->DrawLine(prevPoint, point);
}
}

Я не понимаю, почему здесь создается новый холст (почему старый копируется в новый). Почему старый холст не обновляется после вызова drawLine ()?
Разве мы не можем просто обновить старый холст?

ОБНОВИТЬ:

После некоторого редактирования мне удалось создать два холста.
Я хочу иметь возможность рисовать только в границах __pCanvas, но теперь они «синие», и у меня есть проблемы с установкой их «красного».

введите описание изображения здесь

Вот мой код:

result
MainForm::OnInitializing(void)
{
(...)
AddTouchEventListener(*this);
SetMultipointTouchEnabled(false);
//SetMultipointTouchEnabled(true);

__pCanvas = new (std::nothrow) Canvas();
Rectangle rect = Rectangle(GetBounds().x, GetBounds().y, GetBounds().width, GetBounds().height);
result r = __pCanvas->Construct(rect);

__pInformationCanvas = new (std::nothrow) Canvas();
r = __pInformationCanvas->Construct(Rectangle(0, 0, GetBounds().width, verticalDivider));
if (r == E_SUCCESS)
{
__pCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
__pCanvas->Clear();

__pInformationCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK));
__pInformationCanvas->Clear();

Font font;
font.Construct(FONT_STYLE_PLAIN, FONT_SIZE);
__pCanvas->SetFont(font);

Invalidate(false);
}

return E_SUCCESS;
}

И метод onDraw:

result
MainForm::OnDraw(void)
{
Canvas* pCanvas = GetCanvasN();
if (pCanvas != null)
{
pCanvas->Clear();
pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
*__pCanvas,
GetClientAreaBounds());

// Copy the second Canvas to the center of the Form's Canvas
pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),
*__pInformationCanvas,
__pInformationCanvas->GetBounds());

delete pCanvas;
}

// Do not call Show(). It will be called automatically after OnDraw() callback.
return E_SUCCESS;
}

0

Решение

Вы можете рисовать прямо на холсте формы, если хотите. Попробуйте удалить все в OnDraw кроме return заявление, удалив Invalidate звонки из OnTouchPressed а также OnTouchMovedи замена MainForm::DrawCircle с этим:

void
MainForm::DrawCircle(const Tizen::Graphics::Point& point, const Tizen::Graphics::Color& color)
{
Canvas* pCanvas = GetCanvasN();
if (pCanvas)
{
Rectangle rcCircle(Point(point.x - ELLIPSE_RADIUS, point.y - ELLIPSE_RADIUS), Dimension(ELLIPSE_RADIUS * 2, ELLIPSE_RADIUS * 2));
pCanvas->FillEllipse(color, rcCircle);

delete pCanvas;
}
}

Метод, который они предлагают в примере приложения, должен иметь отдельный Canvas что они втягивают, а затем скопировать Canvas в форму Canvas в OnDraw, Я бы догадался, что GetCanvasN просто создает новый Canvas объект, описывающий ту же подстилающую поверхность, но я могу ошибаться. Не стесняйтесь исследовать исходный код Tizen.

Что касается того, почему они предлагают этот метод; Там может быть несколько причин. Например, если ваш Form когда вас лишают законной силы, вы теряете все, что нарисовали в форме Canvas, Восстановление материала, нарисованного вами с помощью одной команды копирования, очевидно, гораздо проще, чем повторять каждую команду рисования, которую вы выполняли до этого.
Могут также быть причины производительности, т. Е. Выполнение одной команды копирования в OnDraw в некоторой степени более эффективен при работе с экранными поверхностями.
Или это могут быть личные предпочтения людей, которые написали пример приложения.


Редактировать: Вот пример использования двух полотен:

Создать другой Canvas в MainForm::OnInitializing:

__pCanvas = new (std::nothrow) Canvas();
result r = __pCanvas->Construct(GetBounds());
__pAnotherCanvas = new (std::nothrow) Canvas();
r = __pAnotherCanvas->Construct(Rectangle(0, 0, 100, 64));
if (r == E_SUCCESS)
{
__pCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
__pCanvas->Clear();
__pAnotherCanvas->SetBackgroundColor(Color::GetColor(COLOR_ID_WHITE));
__pAnotherCanvas->Clear();
Invalidate(false);
}

изменять OnDraw скопировать оба полотна в форму Canvas:

result
MainForm::OnDraw(void)
{
Canvas* pCanvas = GetCanvasN();
if (pCanvas != null)
{
pCanvas->Clear();
pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),*__pCanvas, GetClientAreaBounds());

// Copy the second Canvas to the center of the Form's Canvas
int cx = GetClientAreaBounds().x + GetClientAreaBounds().width / 2;
int cy = GetClientAreaBounds().y + GetClientAreaBounds().height / 2;
pCanvas->Copy(Point(cx - __pAnotherCanvas->GetBounds().width / 2, cy - __pAnotherCanvas->GetBounds().height / 2),
*__pAnotherCanvas,
__pAnotherCanvas->GetBounds());delete pCanvas;
}
// Do not call Show(). It will be called automatically after OnDraw() callback.
return E_SUCCESS;
}

Рисуй ко второму Canvas где-то, например, в OnTouchDoublePressed:

void MainForm:: OnTouchDoublePressed(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo)
{
Point point(0, 0);
String str; str.Format(10, L"x = %d", currentPosition.x);
__pAnotherCanvas->Clear();
__pAnotherCanvas->DrawText(point, str, str.GetLength());
Invalidate(false);
}

Каждый раз, когда вы дважды щелкаете где-нибудь в области клиента формы, это будет печатать координату X, где вы щелкнули в центре формы, используя второй Canvas это показано на верхней части ваших рисунков.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]