今天我給
GacUI添加了一個(gè)新Demo。我發(fā)現(xiàn)寫Demo也是一個(gè)測(cè)試的過程,可以用來檢驗(yàn)類庫提供的API是否夠完整。前面這兩個(gè)Demo都促使我往類庫里面加入了新的函數(shù)。這次的Demo是用Label控件來模仿超鏈接。下載最新代碼之后,可以在“Libraries\GacUI\GacUIDemo\GacUIDemo.sln”下面找到最新的Demo代碼。
為了模仿超鏈接,我們要做兩件事情。第一件事情就是鼠標(biāo)懸浮在Label上的時(shí)候需要顯示出手的光標(biāo)圖,第二件事情就是在鼠標(biāo)進(jìn)入Label的時(shí)候顯示下劃線,離開的時(shí)候去掉下劃線。因此我們需要監(jiān)聽三個(gè)事件,分別是MouseEnter,MouseLeave和LeftButtonDown。下面是Demo的圖:
上圖:鼠標(biāo)在Label外。下圖:鼠標(biāo)在Label內(nèi)。單擊Label的時(shí)候會(huì)打開瀏覽器。

代碼如下:
#include "..\..\Public\Source\GacUIIncludes.h"
#include <Windows.h>
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
return SetupWindowsDirect2DRenderer();
}
class HyperlinkWindow : public GuiWindow
{
private:
GuiLabel* labelHyperlink;
void labelHyperlink_OnMouseEnter(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
{
FontProperties font=labelHyperlink->GetFont();
font.underline=true;
labelHyperlink->SetFont(font);
}
void labelHyperlink_OnMouseLeave(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
{
FontProperties font=labelHyperlink->GetFont();
font.underline=false;
labelHyperlink->SetFont(font);
}
void labelHyperlink_OnLeftButtonDown(GuiGraphicsComposition* sender, GuiMouseEventArgs& arguments)
{
ShellExecute(NULL, L"OPEN", L"http://www.shnenglu.com/vczh", NULL, NULL, SW_SHOWNORMAL);
}
public:
HyperlinkWindow()
:GuiWindow(GetCurrentTheme()->CreateWindowStyle())
{
SetText(L"Controls.Label.Hyperlink");
SetClientSize(Size(300, 200));
MoveToScreenCenter();
labelHyperlink=g::NewLabel();
labelHyperlink->SetText(L"http://www.shnenglu.com/vczh");
labelHyperlink->SetTextColor(Color(0, 0, 255));
{
FontProperties font;
font.fontFamily=L"Segoe UI";
font.size=18;
font.antialias=true;
labelHyperlink->SetFont(font);
}
{
INativeCursor* hand=GetCurrentController()->ResourceService()->GetSystemCursor(INativeCursor::Hand);
labelHyperlink->GetBoundsComposition()->SetAssociatedCursor(hand);
}
labelHyperlink->GetEventReceiver()->mouseEnter.AttachMethod(this, &HyperlinkWindow::labelHyperlink_OnMouseEnter);
labelHyperlink->GetEventReceiver()->mouseLeave.AttachMethod(this, &HyperlinkWindow::labelHyperlink_OnMouseLeave);
labelHyperlink->GetEventReceiver()->leftButtonDown.AttachMethod(this, &HyperlinkWindow::labelHyperlink_OnLeftButtonDown);
AddChild(labelHyperlink);
}
~HyperlinkWindow()
{
}
};
void GuiMain()
{
GuiWindow* window=new HyperlinkWindow();
GetApplication()->Run(window);
delete window;
}
這里展示的主要是監(jiān)聽事件的方法。在使用control->GetEventReceiver()->event的時(shí)候,可以使用Attach、AttachMethod、AttachFunction和AttachLambda。AttachLambda傳入一個(gè)functor,在C++11里面可以直接使用lambda表達(dá)式。在這里使用AttachMethod給一個(gè)事件綁定類成員函數(shù)。C++運(yùn)行類成員函數(shù)的時(shí)候,不僅需要參數(shù),還需要一個(gè)this對(duì)象,所以AttachMethod有兩個(gè)參數(shù),使用方法在Demo里面已經(jīng)展現(xiàn)出來了。
在這里還引入了GetCurrentController函數(shù)。GetCurrentController返回的INativeController對(duì)象抽象了所有需要的操作系統(tǒng)的功能,其中獲得一個(gè)光標(biāo)的對(duì)象就封裝在了ResourceService里面。INativeController還包含了很多其他的Service,這個(gè)留在以后的Demo展示。
posted on 2012-04-24 02:37
陳梓瀚(vczh) 閱讀(2117)
評(píng)論(8) 編輯 收藏 引用 所屬分類:
GacUI