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

隨筆-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>
            亚洲黑丝在线| 久久综合久久综合九色| 国产精品久久97| 亚洲电影免费观看高清| 久久精品99无色码中文字幕| 99视频精品免费观看| 欧美激情一区二区| 亚洲二区免费| 农村妇女精品| 久久久久国产精品一区| 国内自拍亚洲| 久久久五月婷婷| 欧美在线综合| 尤物yw午夜国产精品视频| 久久国产精品99国产精| 亚洲欧美综合另类中字| 国产欧美综合一区二区三区| 亚洲男人的天堂在线aⅴ视频| 亚洲精品日韩欧美| 欧美日韩国产页| 亚洲在线日韩| 亚洲欧美日韩中文视频| 国产中文一区二区三区| 久久一综合视频| 噜噜爱69成人精品| 99re6这里只有精品视频在线观看| 欧美激情中文不卡| 欧美国产亚洲另类动漫| 中日韩美女免费视频网站在线观看 | 国产精品久久久久久久9999| 亚洲一二三区在线| 亚洲视频在线观看一区| 国产九九视频一区二区三区| 久久精品在线观看| 久久久久久久综合狠狠综合| 亚洲日本激情| 日韩视频欧美视频| 国产视频精品xxxx| 麻豆亚洲精品| 欧美激情视频一区二区三区免费| 亚洲午夜小视频| 亚洲综合首页| 91久久久在线| 亚洲在线观看| 亚洲缚视频在线观看| 日韩午夜激情av| 国产亚洲欧洲997久久综合| 欧美大片国产精品| 欧美日韩免费视频| 久久男人资源视频| 欧美日本精品在线| 久久精品亚洲精品| 欧美日韩视频在线一区二区观看视频 | 欧美99久久| 亚洲综合视频一区| 噜噜噜久久亚洲精品国产品小说| 亚洲一区亚洲二区| 另类天堂视频在线观看| 欧美黄色免费网站| 国产精品乱码一区二三区小蝌蚪| 久久久无码精品亚洲日韩按摩| 欧美国产在线电影| 久久人人九九| 国产精品人人做人人爽| 亚洲日本黄色| 曰本成人黄色| 先锋资源久久| 亚洲一区在线播放| 欧美精品在线网站| 欧美激情一区二区三区| 国产欧美日韩在线| 亚洲视频一区在线| 亚洲特级毛片| 欧美精品一区二| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品久久久久一区| 91久久国产自产拍夜夜嗨| 国产一区二区无遮挡| 亚洲欧美日韩第一区| 亚洲影院色无极综合| 欧美日韩的一区二区| 亚洲福利国产精品| 亚洲国产一区二区视频| 久久久另类综合| 久久久精彩视频| 国产欧美一区二区三区另类精品| 亚洲手机在线| 一本久道久久综合中文字幕| 欧美大片免费观看| 亚洲成人资源| 99精品热视频只有精品10| 久久不见久久见免费视频1| 亚洲在线国产日韩欧美| 欧美日韩中文字幕日韩欧美| 亚洲精选成人| 亚洲图片欧美午夜| 国产精品久久久久久久久久三级 | 久久看片网站| 激情综合五月天| 久久久久久久综合日本| 另类亚洲自拍| 亚洲人成网站在线观看播放| 欧美高清影院| 亚洲视频一区二区在线观看 | 欧美国产日韩一区二区| 亚洲国产精品va在看黑人| 蜜桃av综合| 日韩视频在线一区二区| 午夜一区二区三区不卡视频| 国产一区二区三区自拍| 久久偷窥视频| 亚洲精品国产系列| 亚洲欧美日韩综合国产aⅴ| 国产专区精品视频| 欧美激情第9页| 中文网丁香综合网| 久久综合久久88| 一本色道久久综合亚洲精品婷婷 | 午夜视频一区| 一区二区三区在线免费视频| 久久精品72免费观看| 伊人久久大香线蕉综合热线 | 亚洲女人天堂成人av在线| 欧美一区二区私人影院日本| 国内一区二区三区在线视频| 欧美国产一区二区在线观看| 一区二区三区四区国产精品| 久久一区免费| 在线视频欧美日韩| 国产欧美精品日韩精品| 欧美www在线| 新67194成人永久网站| 亚洲国产精品美女| 欧美一区二区三区视频免费播放| 亚洲国产成人午夜在线一区| 欧美视频二区| 久久精品中文字幕一区二区三区| 亚洲国产精品成人| 久久久久久久高潮| 一本大道久久a久久综合婷婷 | 香蕉乱码成人久久天堂爱免费| 国模精品一区二区三区| 欧美日韩爆操| 久久夜色精品国产亚洲aⅴ| 亚洲精品欧美一区二区三区| 久久亚裔精品欧美| 亚洲午夜精品在线| 亚洲精品国产品国语在线app| 国产精品美女www爽爽爽| 狂野欧美一区| 久久精品一区二区三区不卡| 亚洲午夜精品久久久久久app| 欧美二区视频| 久久琪琪电影院| 亚洲在线视频观看| 99精品久久| 亚洲精品国产日韩| 1024精品一区二区三区| 国产一区二区电影在线观看| 国产精品理论片| 欧美日本二区| 欧美激情欧美激情在线五月| 久久色在线播放| 久久久www成人免费无遮挡大片| 亚洲午夜伦理| 在线亚洲欧美专区二区| 99在线精品观看| 99国内精品| 国产欧美一区二区三区久久| 国产精品人人做人人爽| 国产精品免费一区二区三区在线观看 | 欧美刺激性大交免费视频 | 亚洲视频免费在线| 亚洲激情中文1区| 亚洲黄色影院| 亚洲人成在线观看一区二区| 亚洲国产日韩精品| 亚洲欧洲日本一区二区三区| 在线视频成人| 亚洲国产精品美女| 亚洲人精品午夜| 亚洲另类在线一区| 一本久道久久综合狠狠爱| 夜夜嗨av色一区二区不卡| 一区二区三区 在线观看视频| 亚洲美女色禁图| 亚洲视频在线视频| 香蕉av福利精品导航| 久久九九国产精品怡红院| 在线观看av不卡| 久久久久欧美精品| 久久久久久久久久久一区| 久久久亚洲高清| 欧美大学生性色视频| 欧美精品v日韩精品v国产精品 | 国产一区二区三区四区五区美女| 国产主播精品| 亚洲日本欧美天堂| 亚洲综合欧美| 久久香蕉国产线看观看av|