一步一步實現自己的模擬控制項(9) 訊息處理

2022-07-13 01:15:10 字數 2509 閱讀 7195

這次我們將要給widget增加一些狀態,並使其能夠接受出訊息處理擴充套件,測試工程中實現了乙個按鈕的訊息處理擴充套件。

widget狀態:

之前的控制項只是繪製了乙個邊框,並且總是會在視窗中顯示。實際上我們往往會希望能夠讓某個控制項顯示或者隱藏、可用或者不可用等等,那麼控制項應該具有能夠標識這些狀態的屬性,於是我們給widget增加了狀態概念。

//狀態相關

void

addstates(size_t states);

void

substates(size_t states);

bool

checkstate(widget::statebitfield s);

上面是狀態相關的幾個介面,包括了增加狀態組,減少狀態組,檢測狀態。這裡有個狀態組的概念,是因為我將狀態用位域來實現,那麼他們就可以通過or運算來得到多個狀態的集合,我就這個集合稱為狀態組。

enum

statebitfield;

目前我給widget定義了3個狀態:可見、可用、透明。預設建立的widget是不可見、不可用、不透明的,需要在建立成功後手動設定,例如:

//建立根控制項

auto prootwidget

=ghost::widget::create();

prootwidget

->

addstates(

ghost::widget::state_visible

|ghost::widget::state_enable

|ghost::widget::state_transparent);

訊息處理擴充套件:

通常對於控制項來說,沒有訊息處理就等於沒有生命意義,那麼為widget新增訊息處理擴充套件就意味著使widget活起來,這次我們就來完成這個任務,期待widget活起來的那激動人心的一刻。和以往新增擴充套件支援一樣,為擴充套件編寫乙個抽象基類,在widget的關聯物件管理中新增這個擴充套件的關聯處理,然後在widget的sendmessage處理邏輯裡增加對訊息處理擴充套件的支援。那麼我們的sendmessage實現就變成了這樣:

intwidget::sendmessage(widget::message message,

void

*param1

/*= 0

*/,

void

*param2

/*= 0*/)

}if(checkstate(widget::state_transparent))

}auto prelatedobject

=getrelatedobject();

if(prelatedobject)}}

switch

(message)

break

;#endif

//_debug

case

widget::msg_hit_test:

if(::ptinrect(

&pimpl_

->

absoluterect_, *(

const

point

*)param1))

break;}

return

widget::msg_result_none;

}我多次提到了tooltip,但是我們這次並沒有為widget增加其支援,它將在後面被加入到widget中來。可以看到這裡處理有對訊息處理擴充套件的支援,還有狀態對於訊息的影響。這裡出現了乙個msg_hit_test,這是乙個新增的訊息。這次為widget新增了很多的訊息,包括了滑鼠、鍵盤等,要將滑鼠訊息準確的傳送給正確的控制項,那麼點選測試是必不可少的,這個msg_hit_test訊息則是用於控制項處理點選測試的。

點選測試:

當容器產生了滑鼠事件的時候,我們能夠得到滑鼠熱點在容器中的座標。前面我也多次提到,模擬控制項是容器中的某個區域,那麼當滑鼠熱點位於某個控制項所處的區域的時候,那麼這個滑鼠事件我們就應當交由這個控制項進行處理(這是通常情況,也有可能某個控制項作為透明控制項,不接受任何點選測試)。於是我們便通過點選測試(hittest)這個訪問介面來找到應該處理滑鼠事件的控制項。在找到控制項之後,我們還將座標對映到了控制項的相對座標系,這樣控制項就可以以自身的相對位置來處理滑鼠事件了。

當然,這次的內容非常多,包括座標對映、區域對映,捕獲滑鼠的控制項、活動控制項、焦點控制項等概念都未提到,但在**中還是能夠看到這些概念的。如果一一介紹,那文章就會非常冗長,也會使widget實現進展緩慢,因此我通常都會省略一些內容,這些內容也就只能通過**閱讀來得到了。

按鈕:

為了測試我們這次實現的內容,我們編寫了乙個按鈕的訊息處理擴充套件。簡單起見,我們使其不產生命令、不繪製文字,僅僅只是展示對滑鼠訊息的處理和狀態的變化而已。

我們將原先測試**中的中間那個控制項關聯了按鈕的訊息處理,那麼它就稱為了乙個按鈕控制項了。我們可以將滑鼠移到它上面點選看看會發生什麼。

因為我一直都在使用vc10來編寫widget,也用到了一些新的特性,所以子啊這次的測試工程我生成了乙份release下的程式,沒有vc10的人至少能夠看到其執行效果。

一步一步實現FormsAuthentic驗證登入

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012 net mvc 4.0。原理看這篇文章 看完這個文章絕對受益匪淺。說下登入的整個流程 使用者輸入賬號密碼 點選提交 資料提交到後台控制器 去資料庫取得使用者資料 如果登入成功...

一步一步完成自己的夢想

在這裡記錄我的環球旅遊夢想!我要周遊整個世界,去我從來沒有去過的地方,體驗這個我生活過的地球,讓全世界都留下我的腳印,用單反記錄下我的所有旅程。之後不斷的完善這篇文章,記錄我的旅遊軌跡。18歲讀大學,問你理想是什麼,你說環遊世界 22歲讀完大學,你說找了工作以後再去 26歲工作穩定,你說買了房以後再...

一步一步 Sql Azure

一步一步 sql azure 1.使用 windowsazure 平台賬號登陸 2.新建sqlazure server 3.新建資料庫 4.為sql azure server 新增防火牆規則,只有將本機新增到規則裡才能從本機連線到該sqlazure server 5.連線到sql azure ser...