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

代碼如下:
#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;
}
這里展示的主要是監聽事件的方法。在使用control->GetEventReceiver()->event的時候,可以使用Attach、AttachMethod、AttachFunction和AttachLambda。AttachLambda傳入一個functor,在C++11里面可以直接使用lambda表達式。在這里使用AttachMethod給一個事件綁定類成員函數。C++運行類成員函數的時候,不僅需要參數,還需要一個this對象,所以AttachMethod有兩個參數,使用方法在Demo里面已經展現出來了。
在這里還引入了GetCurrentController函數。GetCurrentController返回的INativeController對象抽象了所有需要的操作系統的功能,其中獲得一個光標的對象就封裝在了ResourceService里面。INativeController還包含了很多其他的Service,這個留在以后的Demo展示。
posted on 2012-04-24 02:37
陳梓瀚(vczh) 閱讀(2117)
評論(8) 編輯 收藏 引用 所屬分類:
GacUI