/code/legacy/controls/monthcalctrlcalendar . zip
閱讀MSDN2003,我們可以看到MFC提供了18種通用控件。我不會詳細列出它們,但妳可以在MSDN \ Visual Studio中看到它們。MSDN2003的。每個控件都對應於壹個MFC類。這些類的詳細描述可以在MSDN \ Visual Studio中找到。MSDN2003的。
在MFC中添加控件有兩種方法。
第壹種方法是直接將控件從“控件”工具欄拖到表單中。這種方法很直觀,但它僅限於基於對話框的MFC應用程序。為此,我將重點介紹第二種方法。
第二種方法是使用MFC類動態添加控件,我將以月歷控件為例介紹這種方法。與月歷控件對應的MFC類是CMonthCalCtrl。
第壹步是向表單添加壹個成員指針:CMonthCalCtrl * m _ pCtrlMonth。
第二步是在初始化窗體時初始化控件。這裏說的表單初始化不是form類的初始化函數,而是OnInitialUpdate()或OnInitDialog()的函數。
m _ pCtrlMonth = new CMonthCalCtrl
m _ pCtrlMonth-& gt;create(WS _ VISIBLE | WS _ CHILD | WS _ BORDER | MCS _ NOTODAY,rect,this,IDC _ MCC);
m _ pCtrlMonth-& gt;ShowWindow(SW _ SHOW);
Create()函數有四個參數:
第壹個參數是壹些宏定義的組合,它們指定控件的樣式。例如,WS_VISIBLE表示控件在初始化時可見,WS_CHILD表示控件是子窗體,WS_BORDER表示控件有邊框,MCS_NOTODAY表示控件不會在底部提示今天的日期。關於控件的樣式,您可以參考MSDN。msdn \ Visual Studio中描述了各種表單樣式。NET \ Visual c++ \ Visual c++引用\ MFC使用的結構、樣式、回調和消息映射\樣式\。當MSDN描述控件的相應類的創建功能時,特定控件的獨特風格被賦予。
第二個參數是對RECT結構的引用,該結構表示窗體中控件的位置坐標。
第三個參數是指向控件父窗體的指針。
第四個參數是控件的資源ID。您可以定義# defineid _ control * * * * *。
現在該控件已基本初始化成功,其他控件也已初始化成功。區別在於控件的樣式和控件對應的MFC類。接下來,您可以設置控件的屬性並添加控制消息。在這裏,我只介紹月歷控件的兩個常用消息。
MCN選擇消息:選擇完成日期時觸發此消息的消息處理程序。
NM_RELEASEDCAPTURE消息:月歷控件中有壹個Scoll,點擊Scoll將觸發該消息的消息處理功能。默認情況下,單擊壹次Scoll將切換壹個月的控件,您可以通過SetMonthDelta函數設置切換月份。m _ pCtrlMonth-& gt;SetMonthDelta(3)表示三個月的轉換。
如果將MCS_DAYSTATE樣式添加到控件中,則可以顯示日期的狀態。該狀態強調當前顯示月份的某些日期,狀態信息表示為32位數據類型MONTHDAYSTATE。MONTHDAYSTATE位域(1到31)中的每壹位代表壹月中某壹天的狀態。如果某壹位開啟,相應的日期將以粗體顯示;否則,將不會強調顯示日期。有兩種方法可以設置MonthCalendar控件的日期狀態:顯式調用cmontcalctrl::SetDayState或處理MCN_GETDAYSTATE通知消息。
MCN_GETDAYSTATE消息:此方法在MSDN \ Visual Studio中有詳細的中文描述。NET \ Visual C++\添加函數\ MFC \用戶界面\ Control \使用CMonthCalCtrl \設置MonthCalendar控件的日狀態\。
壹種方法是調用SetDayState函數,例如在NM_RELEASEDCAPTURE消息處理函數中,初始化本月哪些天需要突出顯示:
SYSTEMTIME timeFrom
SYSTEMTIME截止時間;
int nCount = m _ pCtrlMonth-& gt;GetMonthRange(& amp;時間從& amptimeUntil,GMR _ day state);
LPMONTHDAYSTATE pDayState
pDayState = new month daystate【nCount】;
memset(pDayState,0,sizeof(MONTHDAYSTATE)* nCount);
int nIndex =(time from . wday = = 1)?0 : 1;
pDayState【nIndex】| = 1 & lt;& lt3;//第四天
pDayState【nIndex】| = 1 & lt;& lt18;// 65438+第09天
pDayState【nIndex】| = 1 & lt;& lt24;//第25天
驗證(m _ pCtrlMonth-& gt;SetDayState(nCount,pDayState));
刪除【】pDayState
在MSDN引入SetDayState函數時給出了此代碼。其實原理很簡單。控件中有壹個屬性表示這些日期的狀態。您自己定義此屬性的副本,然後設置副本中日期的狀態,最後調用SetDayState函數將此副本的信息傳輸到控件的屬性。