2013-06-27 49 views
0

我試圖理解的例子在Tizen多點觸控。 我(每次調用此方法將我的手指在畫布上的一個像素或更多),其問題與以下部分:重繪帆布在C++ 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()後不會更新? 我們不能只是刷新舊的畫布?

UPDATE:

一些編輯後,我設法創建兩個畫布。 我想只能在__pCanvas範圍內繪製,但現在它們是「藍色」,我有問題將它們設置爲「紅色」。

enter image description here

這裏是我的代碼:

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

所以你不要改變原來的畫布。 – 2013-06-27 00:33:55

+0

但我想改變原來的...我不知道我怎麼可能...還有觸摸方法我改變原來的畫布,所以我真的不明白爲什麼我在onDraw方法中創建副本。我更新了代碼。 – Marek

回答

1

,如果你願意,你可以直接繪製到窗體的畫布。嘗試除了return聲明去除OnDraw一切,從OnTouchPressedOnTouchMoved去除Invalidate通話,以及與此更換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複製到表格的CanvasOnDraw中。我猜想GetCanvasN只是創建一個新的描述相同底層表面的對象,但我可能是錯的。隨時檢查the Tizen source code

至於爲什麼他們認爲這種方法;可能有幾個原因。例如,如果您的Form曾經失效,您將失去您在表單的Canvas上繪製的任何內容。使用單個複製命令恢復您繪製的內容顯然比重複您之前執行的每個繪製命令要容易得多。
也有可能存在性能方面的原因 - 即在OnDraw執行單一複製命令與屏幕上的表面處理時,在某種程度上是更有效的。
或者它可能只是寫示例應用程序的人的個人偏好。


編輯:下面是使用兩個畫布的例子:

MainForm::OnInitializing創建另一個Canvas

__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

+0

我想你知道你在說什麼。你能告訴我怎樣才能實現這個例子的兩個畫布:一個用於繪製,一個用於顯示一些數據,每次我將手指移動到畫布上時都會顯示一些數據。我可以將onTouchListener添加到繪圖畫布而不是整個畫布嗎?任何代碼示例都會很棒。總而言之,我想修改實例並使用兩個畫布:一個用手指書寫,另一個用於顯示信息 – Marek

+0

您應該展示一個您希望最終結果看起來像什麼的模型,因爲它不完全清楚你真的需要兩個單獨的畫布。無論如何,我已經用一個如何使用兩個畫布的例子更新了我的答案。 – Michael

+0

您提供的信息非常有幫助。但是,還有一件事。我想只能在繪圖區繪製。現在,當我開始繪製時,我按住按鈕 - 我可以輸入__pInformationCanvas區域並在其下面繪製(因爲繪圖畫布大小是整個(藍色)區域。我想使繪圖畫布具有第二個紅色區域的大小。換句話說 - 當我進入繪圖區以外的其他區域時,繪圖應該停止(onTouchMoved不應該開啓),請參閱附圖。 – Marek