<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 19.3 實現Undo/Redo的策略 你的應用程序的Undo/Redo機制的實現方法通常和你文檔的數據類型以及用戶操作數據的方式有關.在我們的例子中,我們每次只操作一整塊的數據,操作也是很簡單的.然而在很多應用程序中,用戶可以對多種類型的數據進行操作.在這種情況下,我們可能需要使用另外一種命令表示方法,可以稱之為 CommandState(狀態命令),其中包含了文檔中特定對象的信息.你的命令類應該維護一個狀態列表,并且也可以在其構造函數中接受這樣的狀態列表參數.Do和Undo操作將根據列表中的狀態并將當前的命令應用到對應的狀態. 實現Redo/Undo操作的關鍵,不外乎以每次一步的方式向前或者向后遍歷每個歷史命令.因此,你的Undo/Redo實現可以任意對文檔狀態進行快照操作,以用于將來的恢復操作.通過這種方法無論用戶進行多少次向前或者向后的歷史命令都沒有問題,你的代碼所需要作的只是怎樣確定"完成"和"未完成"狀態. 一個常用的方法是,在每個命令狀態中保存文檔中每個對象的一個拷貝,以及一個指向實際對象的指針.而Do和Undo操作只是簡單的交換當前狀態和歷史狀態.舉例來說,比如對象是一個圖形,用戶將它的顏色從紅色改為藍色.應用程序于是創建了一個新的標識符用來指示當前紅色的對象,但是它將其內部的顏色屬性由紅色設置為藍色.當這個命令第一次執行的時候,Do函數制作一個當前的紅色對象的拷貝,并且對其應用這個新的命令(包括那個藍顏色), 并將其置為可視狀態,然后重繪這個對象,Undo作的也是同樣的事情,它制作一個當前藍色對象的拷貝,然后對齊應用原來的狀態(紅色),然后重繪這個對象.因此Do和Undo函數其實是完全一樣的.不光如此,這個函數還可以用于除更改顏色以外的其它操作,因為整個對象包括其屬性在內都被制作了一份拷貝, 你可以通過給你的應用程序所能編輯的對象單獨實現各自實現賦值和拷貝操作的構造函數的方法,使得這整個過程更直觀. 讓我們舉個例子,以便說的更明白些.假如說,我們的文檔包含多種形體,用戶可以更改當前選中的所有形體的顏色.我們可以在相應的更改顏色菜單命令處理函數(比如ShapeView::OnChangeColor)中,在這個命令應用于整個文檔之前,為當前選種的各個對象創建一個新的狀態拷貝,如下所示: ``` // 更改當前選中的形體的顏色 void ShapeView::OnChangeColor(wxCommandEvent& event) { wxColour col = GetSelectedColor(); ShapeCommand* cmd = new ShapeCommand(wxT("Change color")); ShapeArray arrShape; for (size_t i = 0; i &lt; GetSelectedShapes().GetCount(); i++) { Shape* oldShape = GetSelectedShapes()[i]; Shape* newShape = new Shape(*oldShape); newShape->SetColor(col); ShapeState* state = new ShapeState(SHAPE_COLOR, newShape, oldShape); cmd->AddState(state); } GetDocument()->GetCommandProcessor()->SubmitCommand(cmd); } ``` 因為對于我們的ShapeState對象來說,Do和Undo的操作都是一樣的,因此我們可以使用一個共用的DoAndUndo函數,用來進行狀態交換的動作: ``` // 不完整的DoAndUndo實現 // 對于某些命令來說,Do和Undo共用同樣的代碼 void ShapeState::DoAndUndo(bool undo) { switch (m_cmd) { case SHAPE_COLOR: case SHAPE_TEXT: case SHAPE_SIZE: { Shape* tmp = new Shape(m_actualShape); (* m_actualShape) = (* m_storedShape); (* m_storedShape) = (* tmp); delete tmp; // 進行重繪動作 ... break; } } } ``` 上面的代碼中我們沒有列出ShapeCommand::Do和ShapeCommand:Undo函數,這兩個函數所做的事情就是遍歷其成員列表中的所有狀態的相應函數. (譯者注:這一小節翻譯的似曾相識,云里霧里)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看