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

一步一步實現自己的模擬控件(6)——控件樹及控件區域

 

控件樹

一步一步實現自己的模擬控件(1)中的圖上我們可以看到,我們的控件體系其實就是一個控件樹。每一個窗口關聯一個根控件,所有控件都在這個根控件之下,父控件包容并管理子控件,那么我們的Widget就應該是一個樹結點。一個樹結點至少有對Parent和Chilren的設置和訪問接口:

void SetParent(Widget* const pNewParent);
Widget
* GetParent() const;

bool InsertChild(Widget* const pChild);
bool RemoveChild(Widget* const pChild);

 

在父控件銷毀的時候它要負責銷毀其下所有的子控件(類似窗口銷毀也會銷毀其子窗口):

Widget::~Widget()
{
// 銷毀所有子控件
WidgetSet temp(std::move(pImpl_->children_));
std::for_each(temp.begin(), temp.end(), std::mem_fn(
&Widget::Destroy));

if (IsRoot())
{
// 作為根控件,同時銷毀驅動
delete pImpl_->pDriver_;
}
else
{
// 不是根控件,則脫離父控件
SetParent(0);
}

delete pImpl_;
}

 

實現中我們使用std::set來保存子控件,這樣便于防止子控件重復設置,也便于移除子控件,缺點就是不能對子控件進行排序。如果以后我們提供控件的z-order概念,那么我們就會使用能夠進行排序的容器來容納子控件。

控件區域:

windows下,我們使用RECT結構來保存控件自身相對于窗口客戶區的區域,那么窗口客戶區尺寸改變時也就是我們控件進行布局的時機,那我們就要在消息過濾中處理WM_SIZE消息了。

case WM_SIZE: // 讓根控件適應真個客戶區
{
RECT clientRect;
::GetClientRect(param.hWnd,
&clientRect);
pRootWidget
->SetAbsoluteRect(clientRect, false);
}
break;

 

我們將控件的布局交由父控件管理,也就是說我們只需要更新根控件區域便可。根控件負責對其子控件進行布局,如此遞歸。

控件更新:

當控件區域改變了,那么相應的其顯示也應相應的進行更新,所以我們的SetAbsoluteRect接口有一個update參數用于控制是否讓窗口產生無效區域激活繪制。

// 此處的update作用是控制是否立即更新顯示。
// 因為模擬控件只是窗口客戶區的一個區域,當區域改變時應該產生原區域和新區域or運算后區域的臟矩形
// 以使得窗口去重繪這部分區域。
// 可能有些批量性質的操作會在操作多個控件后進行整體更新,所以在對單個控件設置新區域的時候可能不會想要更新。
// 所以才加上這個是否立即更新的開關。
void SetAbsoluteRect(const RECT& rect, bool update = true);

 

既然提到了繪制,那么我們也應該讓我們的控件展示在窗口上了。

控件繪制:

通常我們的窗口程序都是在WM_PAINT消息中進行繪制,我們的控件系統當然也需要處理此消息。

case WM_PAINT:
{
// 使用內存DC來緩沖繪制
// 目前沒有計算臟矩形區域
wnd_msg_assistant::OnPaint opAssistant(param.hWnd);
pRootWidget
->Draw(opAssistant.GetMemDC());
}
return S_OK;

 

這里引入了一個輔助對象幫助我們產生內存DC,優化我們的繪制效率。我們直接return了這個消息,也就是說我們將這個消息過濾掉了。前面WM_SIZE和WM_DESTROY我們都沒有過濾,只是在這個時機對控件進行了通知或者操作。之所以要過濾WM_PAINT消息是因為外部的繪制和控件的繪制難以協調,那么我們干脆就接管了窗口客戶區的繪制了。

當然,控件也需要負責繪制其子控件,那么Draw接口中便會調用子控件的Draw,如此遞歸使得每個控件都能夠得以繪制。

首次直觀的看到我們的控件:

我們在調試版本中,為每個控件生成了一個隨機的顏色,根據控件的區域繪制了其邊框,這樣我們就第一次直觀的在窗口中看到了我們的控件。

?

迫不及待,具有了區域的控件,我們已經急切的想要對其布局進行控制,繪制進行定制了。布局控制和繪制定制當然屬于擴展部分,那么下面就將要引入我們的擴展體系了,盡請期待。

下載測試工程源碼

作者: Evil.Ghost 發表于 2011-04-09 19:05 原文鏈接

評論: 0 查看評論 發表評論


最新新聞:
· 蘋果iPad 2通過3C認證 最晚5月國內上市(2011-04-10 09:18)
· 盲目依賴iPhone等工具導航 英國驢友迷路多(2011-04-10 09:14)
· 趣談:想擔任CEO的話,最好是去蘋果工作,其次是微軟,再才是Google(2011-04-10 08:26)
· 騰訊將建立新數據中心,規模為蘋果的兩倍(2011-04-10 08:25)
· 輕量化的微型博客Tumblr(2011-04-10 08:03)

編輯推薦:非戰之罪,從永中Office談起

網站導航:博客園首頁  我的園子  新聞  閃存  小組  博問  知識庫

posted on 2011-04-09 19:05 EvilGhost 閱讀(1362) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

常用鏈接

留言簿

隨筆檔案(12)

文章檔案(1)

最新隨筆

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久另类ts人妖一区二区| 夜久久久久久| 久久手机免费观看| 欧美一区网站| 亚洲大片精品永久免费| 免费成人美女女| 男人的天堂亚洲| 99国产精品久久久| 一区二区欧美国产| 国产日韩欧美成人| 欧美成人一二三| 欧美女人交a| 午夜久久久久久| 久久激情五月激情| 亚洲日本va在线观看| 最新亚洲一区| 国产精品免费视频xxxx| 久久综合伊人| 欧美日韩国产免费| 久久久噜噜噜久久狠狠50岁| 久久婷婷国产综合国色天香| 日韩一区二区福利| 香蕉久久夜色精品国产使用方法 | 亚洲国产高清一区| 欧美区在线观看| 欧美在线不卡| 欧美国产日韩免费| 欧美一区二区三区视频在线| 久久久久综合网| 亚洲免费一区二区| 麻豆国产精品777777在线| 亚洲欧美激情视频| 欧美不卡在线视频| 久久久久99| 国产精品v欧美精品∨日韩| 老司机aⅴ在线精品导航| 欧美色123| 亚洲激情影视| 影音先锋国产精品| 亚洲综合日本| 亚洲一区二区三区在线播放| 久久久九九九九| 欧美一级在线视频| 欧美日韩一区二区免费视频| 久久躁日日躁aaaaxxxx| 国产精品狼人久久影院观看方式| 亚洲福利精品| 黄色成人片子| 午夜精品久久| 亚洲欧美国产不卡| 欧美日本一区| 亚洲电影观看| 亚洲丁香婷深爱综合| 亚洲午夜伦理| 亚洲欧美国产视频| 欧美日韩国产精品一区| 亚洲国产精品一区二区第四页av| 国内精品免费在线观看| 欧美一级播放| 欧美在线日韩| 国产伦精品一区二区三区视频黑人 | 国语自产精品视频在线看抢先版结局 | 亚洲国产高清一区| 午夜一区二区三视频在线观看| 亚洲视频香蕉人妖| 欧美日韩一区在线| 日韩一区二区精品视频| 99热在线精品观看| 欧美日韩美女在线| 一区二区国产在线观看| 亚洲免费在线视频| 国产精品日本一区二区| 亚洲欧美日韩一区在线| 亚洲欧美激情在线视频| 国产精品亚洲а∨天堂免在线| 亚洲午夜女主播在线直播| 亚洲综合另类| 国产日产欧美一区| 久久黄金**| 欧美激情网友自拍| 99精品热视频| 国产精品日日摸夜夜添夜夜av| 亚洲伊人色欲综合网| 久久久久99精品国产片| 加勒比av一区二区| 免费观看30秒视频久久| 亚洲国产欧美在线人成| 亚洲一区二区免费视频| 国产亚洲aⅴaaaaaa毛片| 久久电影一区| 亚洲国产日韩一区二区| 亚洲欧美日韩中文在线制服| 国产精品自在线| 久久人人爽人人爽爽久久| 亚洲国产一区二区三区青草影视| 中文欧美字幕免费| 黄色资源网久久资源365| 欧美a级理论片| 亚洲一区三区在线观看| 美女图片一区二区| 亚洲伊人网站| 在线观看不卡av| 欧美午夜精品久久久久久人妖| 欧美一级久久久| 亚洲国产精品久久久久秋霞不卡| 中文精品一区二区三区| 精品动漫一区| 欧美日韩中文另类| 老司机久久99久久精品播放免费 | 亚洲日本激情| 久久久免费精品| 一区二区免费看| 黄色精品网站| 国产精品乱人伦中文| 你懂的亚洲视频| 欧美亚洲专区| 亚洲视频在线观看视频| 欧美夫妇交换俱乐部在线观看| 亚洲欧美在线视频观看| 亚洲乱码精品一二三四区日韩在线| 国产日韩精品久久久| 欧美午夜片欧美片在线观看| 久热成人在线视频| 久久gogo国模裸体人体| 亚洲天堂网站在线观看视频| 亚洲黑丝在线| 欧美大色视频| 麻豆成人精品| 久久激情五月婷婷| 午夜国产精品视频免费体验区| 亚洲老司机av| 亚洲欧洲视频在线| 尤物九九久久国产精品的特点| 国产精品女人久久久久久| 欧美经典一区二区三区| 美女精品网站| 快射av在线播放一区| 久久久久久夜| 久久精品视频99| 欧美在线一区二区| 欧美一区二区三区在线免费观看| 亚洲欧美日韩国产另类专区| 一区二区三区高清在线观看| 日韩午夜视频在线观看| 亚洲日韩视频| 亚洲免费av片| 在线视频一区二区| 亚洲永久免费av| 午夜精品免费| 欧美在线free| 久久亚洲影音av资源网| 另类酷文…触手系列精品集v1小说| 久久精品中文字幕一区| 久久综合网hezyo| 牛夜精品久久久久久久99黑人| 牛牛国产精品| 欧美日韩国语| 国产精品毛片| 激情文学一区| 亚洲精品一区二区在线观看| 亚洲日本成人女熟在线观看| 日韩一级片网址| 午夜精品久久久久久99热软件| 亚洲欧洲av一区二区| 久久精品99国产精品| 久久在线视频在线| 亚洲激情综合| 亚洲女同精品视频| 久久精品国产亚洲a| 蜜桃视频一区| 国产精品免费福利| 亚洲国产成人av在线| 亚洲精品久久久久久久久久久久| 亚洲视频 欧洲视频| 久久久国产精品一区| 欧美激情视频在线免费观看 欧美视频免费一| 欧美肥婆bbw| 亚洲一区二区精品| 免费亚洲电影在线观看| 国产精品久久77777| 在线日韩精品视频| 亚洲桃色在线一区| 另类天堂视频在线观看| 99re在线精品| 久久超碰97人人做人人爱| 欧美日韩精品二区| 国产主播一区二区| 亚洲手机视频| 欧美国产日韩一区二区| 亚洲影视在线| 欧美日韩国产限制| 狠狠色丁香久久综合频道| 亚洲先锋成人| 欧美成人资源| 久久成人18免费观看| 欧美日韩国产限制| 亚洲欧洲日产国产综合网| 久久精品官网| 亚洲——在线| 欧美日韩国产在线看|