青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    GacUI新增了一個Demo。這里模擬了一個簡單到過頭了的編輯程序。界面是一個標簽頁,第一頁里面只有一個按鈕:Add Page。點中了他之后,其它頁包含一個用來關掉自己的按鈕,和一個多行的文本框。

    這個Demo要展示的其中一個問題是,在按下關閉按鈕的時候,由于那個Page會被移除并刪除,會導致按鈕自己也被刪除。但是事件發生過后,實際上還有很多事情要做的。所以這里展示了如何使用GacUI進行“延遲執行”,在事件結束之后再刪除自己。為了方便,這個Demo使用了C++11(但是庫的實現并不依賴與C++11)。先上圖:





    然后我們來看代碼:

#include "..\..\Public\Source\GacUIIncludes.h"
#include 
<Windows.h>

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
    
return SetupWindowsDirect2DRenderer();
}

class TextBoxPage : public GuiTabPage
{
private:
    
static int pageCounter;

    GuiButton
*                closeButton;
    GuiMultilineTextBox
*    textBox;

    
void closeButton_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
    {
        
// deleteing the tab page will also delete the button, because the button is in the page
        
// when an event is processing, the button is not going to be deleted
        
// because there are many works to do after this event
        
// and maybe someone has already added another event handler to this button
        
// so it use GetApplication()->InvokeInMainThread to send a function to the queue
        
// so that this function will be executed after this input message (an input message raises multiple events)
        
// to the user, this page is closed after cliking this button
        GetApplication()->InvokeInMainThread([this]()
        {
            
// remove the page and delete it
            this->GetOwnerTab()->RemovePage(this);
            delete 
this;
        });
    }

    
void OnPageContainerReady(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
    {
        
// create a table to place a button and a text box
        GuiTableComposition* table=new GuiTableComposition;
        table
->SetRowsAndColumns(21);
        table
->SetRowOption(0, GuiCellOption::MinSizeOption());
        table
->SetRowOption(1, GuiCellOption::PercentageOption(1.0));
        table
->SetColumnOption(0, GuiCellOption::PercentageOption(1.0));
        table
->SetAlignmentToParent(Margin(0000));
        table
->SetCellPadding(2);

        {
            GuiCellComposition
* cell=new GuiCellComposition;
            table
->AddChild(cell);
            cell
->SetSite(0011);
            
            closeButton
=g::NewButton();
            closeButton
->SetText(L"Close Me!");
            closeButton
->Clicked.AttachMethod(this&TextBoxPage::closeButton_Clicked);
            cell
->AddChild(closeButton->GetBoundsComposition());
        }
        
        {
            GuiCellComposition
* cell=new GuiCellComposition;
            table
->AddChild(cell);
            cell
->SetSite(1011);
            
            textBox
=g::NewMultilineTextBox();
            textBox
->GetBoundsComposition()->SetAlignmentToParent(Margin(0000));
            textBox
->SetText(L"You can input several lines of text here.\r\nThis is a multiple line text box.");
            cell
->AddChild(textBox->GetBoundsComposition());
        }

        
this->GetContainer()->GetContainerComposition()->AddChild(table);
    }

public:
    TextBoxPage()
        :closeButton(
0)
        ,textBox(
0)
    {
        PageContainerReady.AttachMethod(
this&TextBoxPage::OnPageContainerReady);
        
this->SetText(L"Page "+itow(++pageCounter));
    }

    
~TextBoxPage()
    {
    }
};

int TextBoxPage::pageCounter=0;

class TextBoxPageWindow : public GuiWindow
{
private:
    GuiTab
*                        tabControl;
    GuiTabPage
*                    controlPanelPage;
    GuiButton
*                    buttonAddPage;

    
void buttonAddPage_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
    {
        
// when the button is clicked, it creates a new TextBoxPage and adds it to the tab control
        TextBoxPage* page=new TextBoxPage;
        tabControl
->CreatePage(page);
        tabControl
->SetSelectedPage(page);
    }
public:
    TextBoxPageWindow()
        :GuiWindow(GetCurrentTheme()
->CreateWindowStyle())
    {
        
this->SetText(L"Controls.Tab.TextBoxPage");
        
this->GetBoundsComposition()->SetPreferredMinSize(Size(640480));

        
// create a tab control
        tabControl=g::NewTab();
        tabControl
->GetBoundsComposition()->SetAlignmentToParent(Margin(2222));
        
this->AddChild(tabControl);

        
// the first page is a control panel
        controlPanelPage=tabControl->CreatePage();
        controlPanelPage
->SetText(L"Control Panel");

        
// add a button to the control panel
        buttonAddPage=g::NewButton();
        buttonAddPage
->SetText(L"Add a tab page");
        buttonAddPage
->Clicked.AttachMethod(this&TextBoxPageWindow::buttonAddPage_Clicked);
        controlPanelPage
->GetContainer()->GetContainerComposition()->SetInternalMargin(Margin(2222));
        controlPanelPage
->GetContainer()->AddChild(buttonAddPage);

        
this->ForceCalculateSizeImmediately();
        
this->MoveToScreenCenter();
    }

    
~TextBoxPageWindow()
    {
    }
};

void GuiMain()
{
    GuiWindow
* window=new TextBoxPageWindow();
    GetApplication()
->Run(window);
    delete window;
}

    那一大段的注釋,就是在講延遲執行的事情。看過C++11的人都知道,lambda expression實際上就是一個functor。在舊C++里面,調用InvokeInMainThread的時候,要么可以傳一個void(*)(void*)和void*,要么可以傳一個帶operator()()的struct。在新C++里面,直接把lambda expression寫在里面就好了。

    如果不使用延遲執行,在事件發生的時候把自己刪掉,會導致Access Violation的發生,因為接下來要訪問的對象被你刪掉了。如果使用延遲執行,就可以在input message處理完之后,執行刪除的代碼。這樣一切都是好的。

    下一個Demo就是關于文本框的操作,再下一個Demo是關于如何做用來顯示代碼的高亮文本框的事情。敬請期待,啊哈哈哈。
posted on 2012-04-30 23:28 陳梓瀚(vczh) 閱讀(2045) 評論(2)  編輯 收藏 引用 所屬分類: GacUI

評論:
# re: GacUI Demo:標簽頁 2012-05-01 06:31 | CY
AttachMethod如果是只有一個響應或者最后一個響應里面delete自己,應該能僥幸沒事不?  回復  更多評論
  
# re: GacUI Demo:標簽頁 2012-05-01 09:55 | 陳梓瀚(vczh)
@CY
不能  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品成人观看视频免费| 欧美精品亚洲一区二区在线播放| 亚洲免费观看在线观看| 日韩亚洲欧美在线观看| 亚洲免费中文| 欧美色综合网| 国产综合18久久久久久| 亚洲开发第一视频在线播放| 久久一区亚洲| 亚洲小视频在线| 欧美一区二区三区免费观看| 国产精品一区二区三区四区 | 国产午夜精品久久| 亚洲精品欧美| 亚洲第一综合天堂另类专| 99在线精品视频| 亚洲欧美在线观看| 亚洲精品国精品久久99热一| 猫咪成人在线观看| 国产午夜精品视频| 中文日韩在线| 一区二区三区精品| 欧美成人免费在线| 在线成人欧美| 亚洲电影在线看| 久久婷婷综合激情| 欧美日韩亚洲一区二区三区四区 | 亚洲视频电影在线| 国产欧美日本一区视频| 亚洲男女自偷自拍图片另类| 免费欧美视频| 欧美插天视频在线播放| 在线日韩av| 久久国产精品一区二区三区四区| 欧美在线亚洲综合一区| 国产色综合久久| 一本色道久久综合| 亚洲一区三区电影在线观看| 国产精品视频99| 亚洲欧美一区二区三区极速播放 | 噜噜噜躁狠狠躁狠狠精品视频| 欧美福利视频在线| 在线观看国产日韩| 韩国在线一区| 亚洲福利在线观看| 欧美日韩国产91| 欧美一级视频| 久久精品女人的天堂av| 日韩视频在线一区| 久久精品99国产精品日本| 国产亚洲一区二区精品| 久久人人97超碰人人澡爱香蕉| 日韩午夜在线电影| 欧美寡妇偷汉性猛交| 久久激情中文| 欧美在线免费看| 国产情人节一区| 免费成人毛片| 欧美日韩精品免费观看| 免费视频一区| 亚洲免费黄色| 一区二区三区欧美日韩| 国产精品嫩草99a| 久久一本综合频道| 欧美大片在线影院| 午夜欧美大片免费观看| 久久国产精品99久久久久久老狼| 欧美成人精品福利| 亚洲日本精品国产第一区| 日韩视频免费观看| 国产日韩综合| 亚洲第一精品夜夜躁人人躁| 欧美调教vk| 你懂的网址国产 欧美| 欧美日韩精品一区二区| 久久精品论坛| 欧美a级一区| 99一区二区| 久久久久久黄| 亚洲少妇在线| 久久午夜电影| 欧美一区二区在线播放| 欧美高清视频一区二区| 久久精品72免费观看| 欧美精品一区二区在线播放| 久久成人综合视频| 久久免费视频观看| 亚洲欧美日韩国产一区二区| 久久夜色精品亚洲噜噜国产mv| 亚洲一区二区三区欧美| 久久夜色精品国产噜噜av| 亚洲欧美日韩成人| 欧美精品123区| 久久综合色综合88| 国产精品美女久久福利网站| 91久久综合亚洲鲁鲁五月天| 激情亚洲一区二区三区四区| 亚洲午夜在线观看视频在线| 日韩一区二区精品| 久久一日本道色综合久久| 午夜精品久久久久| 欧美日韩久久久久久| 麻豆九一精品爱看视频在线观看免费| 国产精品私拍pans大尺度在线| 亚洲国产小视频在线观看| 精品51国产黑色丝袜高跟鞋| 午夜精品影院| 亚洲伦理在线免费看| 狼狼综合久久久久综合网| 久久精品30| 国产一区二区中文字幕免费看| 亚洲午夜av在线| 亚洲一区制服诱惑| 欧美日韩午夜精品| 99www免费人成精品| 黄网站免费久久| 欧美一区1区三区3区公司| 午夜久久久久| 国产精品羞羞答答| 久久久久99| 国产欧美一区在线| 亚洲影视九九影院在线观看| 亚洲自拍偷拍色片视频| 国产精品hd| 日韩视频中午一区| 亚洲尤物在线| 国产精品视频| 欧美在线视频免费| 久久久久久香蕉网| 国内成人精品一区| 国产专区综合网| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品久久国产精品99gif | 麻豆精品精华液| 亚洲午夜一区| 欧美在线高清视频| 蜜臀av一级做a爰片久久 | 小黄鸭精品密入口导航| 欧美怡红院视频| 欧美色123| 最新中文字幕亚洲| 9l国产精品久久久久麻豆| 欧美大片一区二区三区| 亚洲视频在线看| 亚洲综合色激情五月| 欧美国产另类| 亚洲激情网站| 欧美本精品男人aⅴ天堂| 在线国产欧美| 中文欧美字幕免费| 久久午夜精品一区二区| 久久久久久久一区二区| 亚洲高清不卡av| 国产精品乱子乱xxxx| 美女诱惑一区| 亚洲在线一区二区| 亚洲精品久久久久久久久| 噜噜噜91成人网| 久久国产主播精品| 性欧美精品高清| 一本综合精品| 136国产福利精品导航| 国产精品一区二区三区久久| 欧美激情一二区| 免费在线亚洲欧美| 久久久久久久国产| 久久国产日本精品| 欧美在线日韩在线| 老司机aⅴ在线精品导航| 午夜精品免费在线| 99国产精品久久久久久久| 极品尤物av久久免费看| 国产日韩欧美一区二区三区在线观看| 欧美日韩日韩| 欧美人成在线| 欧美日韩亚洲高清| 欧美日韩成人综合天天影院| 欧美电影免费| 欧美国产亚洲另类动漫| 欧美成人午夜激情| 欧美国产丝袜视频| 欧美日本久久| 欧美啪啪一区| 欧美午夜在线| 国产喷白浆一区二区三区| 国产日韩一区二区| 国产日本欧洲亚洲| 伊人夜夜躁av伊人久久| 在线观看欧美日本| 亚洲日产国产精品| 一区二区三区免费观看| 亚洲欧美高清| 久久精品成人| 美女精品在线| 欧美激情一区二区三区| 亚洲精品欧美精品| 亚洲一级二级| 久久日韩精品| 欧美日本视频在线| 国产日韩欧美中文|