1. 程式人生 > >InitCommonControlsEx Function|MFC通用控制元件初始化

InitCommonControlsEx Function|MFC通用控制元件初始化

MFC工程中,在InitInstance()函式(一般在工程名.cpp檔案中)中有這樣一段程式碼:
*************************************************************************************
 // 如果一個執行在 Windows XP 上的應用程式清單指定要
 // 使用 ComCtl32.dll 版本 6 或更高版本來啟用視覺化方式,
 //則需要 InitCommonControlsEx()。否則,將無法建立視窗。
  INITCOMMONCONTROLSEX InitCtrls;
 InitCtrls.dwSize = sizeof(InitCtrls);
  // 將它設定為包括所有要在應用程式中使用的
 // 公共控制元件類。
  InitCtrls.dwICC = ICC_WIN95_CLASSES;
  InitCommonControlsEx(&InitCtrls);
**************************************************************************************
這些程式碼的作用,註釋裡已經說的很清楚了,我們先來看下這寫程式碼是什麼意思。
我們從InitCommonControlsEx函式下手,其函式原型為:

BOOL InitCommonControlsEx(      
    LPINITCOMMONCONTROLSEX lpInitCtrls


);

其有一個引數lpInitCtrls,是一個指向結構體INITCOMMONCONTROLSEX的長指標,上面的程式碼先建立一個INITCOMMONCONTROLSEX結構體物件 InitCtrls,然後將其地址作為InitCommonControlsEx函式的引數。INITCOMMONCONTROLSEX結構體的定義在commctrl.h檔案中,下面的程式碼節選自commctrl.h檔案,其中包括InitCommonControls和InitCommonControlsEx函式的宣告以及tagINITCOMMONCONTROLSEX 結構體的定義。
  INITCOMMONCONTROLSEX結構體包含兩個引數dwSize和dwICC,引數說明請看註釋。_WIN32_IE和_WIN32_WINNT的定義請看stdafx.h檔案。
  InitCommonControlsEx函式的呼叫效果是累加的,例如你先以ICC_TAB_CLASSES標誌呼叫InitCommonControlsEx,然後以ICC_BAR_CLASSES 標誌呼叫,那麼tab和bar通用控制元件類都將被註冊並在你的程式中是可用的。InitInstance()函式中採用的ICC_WIN95_CLASSES其實是上面那些標誌的組合。

********************************************commctrl.h**********************************************************

WINCOMMCTRLAPIvoidWINAPI InitCommonControls(void);

#if(_WIN32_IE >= 0x0300)
typedefstructtagINITCOMMONCONTROLSEX {
    DWORD dwSize;         //size of this structure 結構體的大小
    DWORD dwICC;         //標誌位用來決定那些通用控制元件類將從DLL中載入,值可以是下面那些ICC_的組合
} INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;
#defineICC_LISTVIEW_CLASSES   0x00000001//listview, header
#defineICC_TREEVIEW_CLASSES   0x00000002//treeview, tooltips
#defineICC_BAR_CLASSES        0x00000004//toolbar, statusbar, trackbar, tooltips
#defineICC_TAB_CLASSES        0x00000008//tab, tooltips
#defineICC_UPDOWN_CLASS       0x00000010//updown
#defineICC_PROGRESS_CLASS     0x00000020//progress
#defineICC_HOTKEY_CLASS       0x00000040//hotkey
#defineICC_ANIMATE_CLASS      0x00000080//animate
#defineICC_WIN95_CLASSES      0x000000FF
#defineICC_DATE_CLASSES       0x00000100//month picker, date picker, time picker, updown
#defineICC_USEREX_CLASSES     0x00000200//comboex
#defineICC_COOL_CLASSES       0x00000400//rebar (coolbar) control
#if(_WIN32_IE >= 0x0400)
#defineICC_INTERNET_CLASSES   0x00000800
#defineICC_PAGESCROLLER_CLASS 0x00001000  //page scroller
#defineICC_NATIVEFNTCTL_CLASS 0x00002000  //native font control
#endif
#if(_WIN32_WINNT >= 0x501)
#defineICC_STANDARD_CLASSES   0x00004000
#defineICC_LINK_CLASS         0x00008000
#endif

 WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);

#endif     //_WIN32_IE >= 0x0300

************************************************************************************************************************

ICC_BAR_CLASSES——註冊工具欄、狀態列、Trackbar和Tooltip類。
ICC_COOL_CLASSES——註冊Rebar類。
ICC_DATE_CLASSES——註冊Date and Time Picker類。
ICC_HOTKEY_CLASS——註冊Hot Key類。
ICC_INTERNET_CLASSES——註冊IP Address Picker類。
ICC_LISTVIEW_CLASSES——註冊ListView和Header類。
ICC_PAGESCROLLER_CLASS——註冊Pager類。
ICC_PROGRESS_CLASS——註冊Progress Bar類。
ICC_TAB_CLASSES——註冊Tab和Tooltip類。
ICC_TREEVIEW_CLASSES——註冊TreeView和Tooltip類。
ICC_UPDOWN_CLASS——註冊Up-Down類。
ICC_USEREX_CLASSES——註冊ComboBoxEx類。
ICC_WIN95_CLASSES——註冊InitCommonControls函式註冊的所有類。