成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Visual Studio 2010響應Ribbon控件消息

開發 后端
利用XML文件定義和描述Ribbon界面,從分工的意義上講,其實那是UI設計師的活兒。作為程序員,更加專注的是如何令Visual Studio 2010響應Ribbon控件,完成相應的業務邏輯。

Visual Studio 2010與Windows 7的完美配合,在本文中體現在Visual Studio 2010響應Ribbon控件消息上。UI美工們已經幫我們完成了設計工作,下面現在,該輪到程序員上場了!51CTO編輯推薦《Visual Studio 2010應用與開發詳解

在Ribbon界面編輯完成的基礎上,我們來看看如何利用Windows Scenic Ribbon API處理各種控件消息,讓Ribbon界面真正地投入使用。

如何利用XML文件創建Ribbon控件,對控件進行排布和設置控件的縮放策略等等,可以說,這些工作都是UI設計師的任務。對程序員來說,更重要的是對控件的消息進行處理實現其業務邏輯。

添加消息處理功能

我們可以創建了一個派生自IUIApplication的Ribbon界面宿主對象類CApplication,并利用這個類完成了Ribbon界面的創建,初始化以及與Windows應用程序的集成。要對Ribbon控件的消息進行處理,我們還是要借助這個宿主對象類。為了使得CApplication類具有控件消息處理的能力,我們需要修改它的定義,讓它同時也從IUICommandHandler派生。而IUICommandHandler類,則是Scenic Ribbon API提供給我們的控件消息處理類,只要CApplication從這個類派生,就具有了相應的控件消息的處理能力。

為了對Visual Studio 2010響應Ribbon控件消息進行處理,我們修改CApplication類的定義如下:

  1. // 引入Scenic Ribbon API的頭文件  
  2. #include <uiribbon.h> 
  3. // 引入編譯生成的資源頭文件  
  4. #include "ribbonres.h"  
  5. // 調用Windows API獲得系統時間  
  6. #include "windows.h"  
  7. #include "stdio.h"  
  8.  
  9. IUIFramework* g_pFramework = NULL;  
  10. // Ribbon界面宿主程序  
  11. class CApplication  
  12.     : public CComObjectRootEx<CComMultiThreadModel> 
  13.         , public IUIApplication  // 處理Ribbon界面的創建和初始化  
  14.         , public IUICommandHandler // 處理Ribbon控件的消息 

然后,我們需要利用COM_INTERFACE_ENTRY宏定義COM_MAP,在CApplication類的定義中,添加:

  1. public:  
  2.     BEGIN_COM_MAP(CApplication)  
  3.           COM_INTERFACE_ENTRY(IUIApplication)  
  4.                   COM_INTERFACE_ENTRY(IUICommandHandler)  
  5.     END_COM_MAP() 

這樣,Visual Studio 2010響應Ribbon控件的消息就會發送到CApplication類,由CApplication類進行處理。在整個Scenic Ribbon API中,Ribbon控件消息的處理流程如下圖所示。除了之前我們介紹的跟Ribbon界面創建和初始化相關的過程之外,為了完成控件消息,我們首先需要為感興趣的控件進行注冊,這些工作都會在OnCreateCommand函數中完成。完成控件的注冊后,當我們需要進行消息處理的控件有消息發生時,IUIFramework就會將這些消息發送給CApplication,而我們就可以在CApplication類中對具體的消息進行處理。Ribbon控件的消息主要分成兩種:一種是來自控件的動作消息,比如按鈕控件被點擊,ComboBox的選擇發生了變化等。這類消息都在Execute函數中進行處理;另外一種是則對控件屬性進行更新的消息,這類消息在UpdateProperty函數中進行處理。

UpdateProperty函數

注冊感興趣的控件

按照Ribbon界面控件消息的處理流程,我們首先需要在OnCreateCommand函數中為我們感興趣的控件進行注冊,這樣當控件有動作發生的時候,CApplication類才會收到相應的控件消息,進而可以對其進行處理。在CApplication類的OnCreateCommand函數中,我們完成相應控件的注冊:

  1. STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler)   
  2.     {   
  3.         // 對相應控件的消息進行注冊  
  4.         if (nCmdID == cmdMyButton   
  5.             || nCmdID == cmdDeleteTable  
  6.             || nCmdID == cmdAddTable  
  7.             || nCmdID == cmdPrintRelationships)  
  8.         {  
  9.             return QueryInterface(IID_PPV_ARGS(ppCommandHandler));  
  10.         }  
  11.         return E_NOTIMPL;   
  12.     } 

在這段代碼中,我們根據控件的Symbol選取了幾個需要進行消息處理的控件,當這幾個控件有動作發生時,比如比鼠標點擊,或者是進行了選擇,IUIFramework會發送相應的消息給宿主對象CApplication,從而讓我們可以有機會對這些消息進行處理。

處理控件消息

對于普通的控件點擊消息或者是選擇消息等動作消息,我們需要重寫CApplication類的消息處理函數Execute函數,在其中對消息進行處理:

  1. // 消息處理函數  
  2. STDMETHODIMP Execute(UINT nCmdID,  
  3.         UI_EXECUTIONVERB verb,   
  4.         __in_opt const PROPERTYKEY* key,  
  5.         __in_opt const PROPVARIANT* ppropvarValue,  
  6.         __in_opt IUISimplePropertySet* pCommandExecutionProperties)  
  7.     {  
  8.         HRESULT hr = S_OK;  
  9.  
  10.         switch (verb)  
  11.         {  
  12.                         // 只處理感興趣的消息類型  
  13.         case UI_EXECUTIONVERB_EXECUTE:  
  14.                                     // 判斷消息來源  
  15.             if (nCmdID == cmdMyButton)  
  16.             {  
  17.                                                // 執行具體的業務邏輯  
  18.                                                // 這里我們獲得系統時間并進行輸出  
  19.                 SYSTEMTIME sys;  
  20.                 GetLocalTime( &sys );  
  21.                 wchar_t strInfo[256] = L"";  
  22.                 wsprintf( strInfo, L"當前系統時間:  
  23. %4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",  
  24.                     sys.wYear,sys.wMonth,sys.wDay,  
  25.                     sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,  
  26.                     sys.wDayOfWeek);  
  27.                  // 顯示消息框  
  28.                                                  MessageBox(NULL, strInfo,  
  29.                     L"當前系統時間”,  
  30.                     MB_OK);  
  31.             }  
  32.             break;  
  33.         }      
  34.         return hr;  
  35.     } 

現在編譯運行這個解決方案,當我們點擊cmdMyButton 所對應的“MyButton”這個按鈕時,就可以得到一個消息框報告當前的系統時間。當然,我們這里只是對按鈕控件的動作進行處理,對于其他類型控件的消息處理,都是按照相同的流程進行。

按鈕控件的點擊事件
圖2  按鈕控件的點擊事件

在運行時對控件屬性進行修改

在某些情況下,我們需要在運行時對控件的屬性進行修改。例如,在應用程序運行的某種狀態下,我們可能需要禁用某些控件,或者是修改控件的標簽文本,圖標等等。對控件屬性的修改,可以通過直接修改控件屬性達到,也可以通過調用InvalidateUICommand函數刷新控件的屬性,然后在UpdateProperty函數中進行控件屬性更改消息處理,實現具體的屬性修改。下面我們分別來看看這兩種方式是如何進行的。

在這個例子中,我們處理兩個按鈕控件的點擊消息,讓他們分別禁用另外的按鈕控件和修改按鈕的標簽文本。在Execute函數中,處理相應的按鈕消息,實現控件屬性的改變:

  1. STDMETHODIMP Execute(UINT nCmdID,  
  2.         UI_EXECUTIONVERB verb,   
  3.         __in_opt const PROPERTYKEY* key,  
  4.         __in_opt const PROPVARIANT* ppropvarValue,  
  5.         __in_opt IUISimplePropertySet* pCommandExecutionProperties)  
  6.     {  
  7.         HRESULT hr = S_OK;  
  8.  
  9.         switch (verb)  
  10.         {  
  11.         case UI_EXECUTIONVERB_EXECUTE:  
  12.             if (nCmdID == cmdMyButton)  
  13.             {  
  14.                 //  
  15.                 PROPVARIANT varNew;  
  16.  
  17.                 BOOL _fEnabled = FALSE;  
  18.                                                 // 初始化屬性值  
  19.                 hr = UIInitPropertyFromBoolean(UI_PKEY_Enabled,  
  20.                                                          _fEnabled, &varNew);  
  21.                 if (FAILED(hr))  
  22.                 {  
  23.                     return hr;  
  24.                 }  
  25.                                                 // 為控件cmdDeleteTable設置新的屬性值  
  26.                 hr = g_pFramework->SetUICommandProperty(cmdDeleteTable,   
  27.                                                         UI_PKEY_Enabled, varNew);  
  28.                 if (FAILED(hr))  
  29.                 {  
  30.                     return hr;  
  31.                 }  
  32.             }  
  33.             else if (nCmdID == cmdAddTable)  
  34.             {  
  35.                 // 發送屬性更新消息對控件屬性UI_PKEY_Label進行更新  
  36.                 hr = g_pFramework->InvalidateUICommand(  
  37.                                                              cmdPrintRelationships,  
  38.                                                              UI_INVALIDATIONS_PROPERTY, &UI_PKEY_Label);  
  39.                 if (FAILED(hr))  
  40.                 {  
  41.                               return hr;  
  42.                 }  
  43.             }  
  44.             break;  
  45.         }      
  46.         return hr;  
  47.     } 

在cmdMyButton按鈕的消息處理中,我們使用SetUICommandProperty就可以直接修改控件的屬性了。在這里,我們通過設置cmdDeleteTable按鈕控件的UI_PKEY_Enabled屬性為FALSE,達到了禁用這個控件的目的。而在cmdAddTable按鈕的消息處理中,我們只是調用了IUIFramework的InvalidateUICommand函數,這表示它會自動調用CApplication類的UpdateProperty來實現控件屬性的更新,所以對于第二種方式,我們還需要實現這個函數,在其中完成屬性的更新:

  1. STDMETHODIMP UpdateProperty(UINT nCmdID,  
  2.         __in REFPROPERTYKEY key,  
  3.         __in_opt const PROPVARIANT* ppropvarCurrentValue,  
  4.         __out PROPVARIANT* ppropvarNewValue)  
  5.     {  
  6.         UNREFERENCED_PARAMETER(ppropvarCurrentValue);  
  7.  
  8.         HRESULT hr = E_FAIL;  
  9.  
  10.         if (key == UI_PKEY_Label)  
  11.         {  
  12.             // 更新控件cmdPrintRelationships的標簽文本  
  13.             if (nCmdID == cmdPrintRelationships)  
  14.             {  
  15.                 hr = UIInitPropertyFromString(UI_PKEY_Label,   
  16.                         L"New Label", ppropvarNewValue);  
  17.             }  
  18.         }  
  19.         return hr;  
  20.     } 

現在,我們就可以編譯運行整個解決方案,點擊相應的按鈕控件,就可以看到對控件屬性修改的效果了:

修改控件屬性
圖3  修改控件屬性

到這里,我們完成了整個Ribbon歷程:從創建XML文件到添加宿主對象,從創建到初始化,從控件消息處理到控件屬性更新。現在,Ribbon界面對我們來說,已經不再僅僅是微軟的一種界面技術,她切切實實地來到了我們身邊,可以為我們所用,提高應用程序的用戶體驗。

擁抱Ribbon,擁抱Windows 7,擁抱Visual Studio 2010!

【編輯推薦】

  1. 微軟稱C++將得到Visual Studio 2010更多支持
  2. Visual Studio 2010新特性:動態語言功能
  3. 微軟對Visual Studio 2010的Bug熟視無睹?
  4. Visual Studio 2010 Beta1試用手記
  5. Visual Studio 2010重要新功能一覽
責任編輯:彭凡 來源: ITPUB
相關推薦

2010-04-16 14:08:46

Visual Stud

2009-11-12 12:42:35

Visual Stud

2009-12-02 09:43:38

Visual Stud

2010-02-23 09:02:00

Visual Stud

2009-11-13 09:05:05

Visual Stud

2009-11-10 13:43:37

Visual Stud

2010-02-22 16:43:33

Visual Stud

2009-11-11 09:48:06

Visual Stud

2009-11-13 10:12:37

Visual Stud

2011-02-13 17:10:28

Visual Stud

2009-11-13 14:59:12

Visual Stud

2009-12-11 13:14:45

Visual Stud

2010-04-06 17:32:02

Visual Stud

2010-04-12 08:43:45

Visual Stud

2009-11-11 14:26:13

Visual Stud

2009-11-10 15:27:42

Visual Stud

2009-12-21 09:55:53

Visual Stud

2010-02-05 09:06:17

Visual Stud

2010-02-26 09:18:24

Visual Stud

2010-03-16 14:32:16

Visual Stud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人欧美一区二区三区黑人孕妇 | 亚洲成人观看 | 999久久久久久久久6666 | 国产色网站 | 中文字幕日韩一区 | 午夜激情在线视频 | 一区二区精品 | 国产精品国产三级国产aⅴ无密码 | 狠狠亚洲| 日日拍夜夜 | 97av视频| 久久久亚洲 | 中文字幕在线网 | 国产女人精品视频 | 欧美日韩久久久久 | 毛片黄片| 99精品国产一区二区青青牛奶 | 亚洲综合二区 | 国内精品久久久久久 | 日韩在线播放一区 | www.操.com| 毛片软件| 免费色网址| 日本精品在线一区 | 国产精品久久久久9999鸭 | 国产一区二区免费 | 亚洲黄色在线免费观看 | 波多野吉衣在线播放 | 亚洲国产精品区 | 日韩国产免费观看 | 国产精品成人国产乱一区 | 日韩欧美专区 | 日韩视频a | 亚洲成人av在线播放 | 国产日韩一区二区三免费 | 欧美在线一区二区三区 | 国产小视频在线看 | 麻豆久久久久 | 一区欧美 | 国产精品视频网 | 久热久热 |