近來想做一個日歷控件,于是用了BCG(www.ttdown.com 可以下載)的CBCGPCalendarBar。不過想做成鼠標停留在日期上的時候,提示信息是農歷。
不過很奇怪,BCG的日期控件竟然不支持日期提示。究其原因,原來:
BOOL CBCGPCalendarButton::OnToolHitTest(const CWnd* /*pWnd*/, TOOLINFO* /*pTI*/)
{
?return FALSE;
}
其實想改也很容易,改BCG的源代碼就行了。但是想到一旦BCG更新換代,又要重新編譯了,實在是麻煩。于是想通過OO的繼承,擴展這個類。
class CLunarCalendarButton : public? CBCGPCalendarButton
{
?DECLARE_SERIAL(CLunarCalendarButton)
public:
?CLunarCalendarButton() : CBCGPCalendarButton() {}
?CLunarCalendarButton(const COleDateTime& date, BOOL bHighlight = FALSE) : CBCGPCalendarButton(date, bHighlight) {}
protected:
?virtual BOOL OnToolHitTest(const CWnd* /*pWnd*/, TOOLINFO* pTI);
};
IMPLEMENT_SERIAL(CLunarCalendarButton, CBCGPCalendarButton, 1)
BOOL CLunarCalendarButton::OnToolHitTest(const CWnd* /*pWnd*/, TOOLINFO* pTI)
{
?if (pTI == NULL)
??return FALSE;
?CString str;
?
?str = _T("農歷:");
?CLunarCalendarBar::FormatLunarDate(m_Calendar, str);
?pTI->lpszText = (LPTSTR) ::calloc ((str.GetLength () + 1), sizeof (TCHAR));
?_tcscpy (pTI->lpszText, str);
?return TRUE;
}
但是問題是怎么樣子把這個Button替換原來控件上的CBCGPCalendarButton呢?CBCGPCalendarBar沒有接口讓用戶建立自己的Button。
最后還是要比較“茅”的方法,通過覆蓋虛函數:
class CLunarCalendarBar : public CBCGPCalendarBar
{
......
protected:
?virtual void Rebuild ();
?virtual CBCGPToolbarButton * createDateButton(void);?
};
CBCGPToolbarButton * CLunarCalendarBar::createDateButton(void)
{
??? return new CLunarCalendarButton();
}
void CLunarCalendarBar::Rebuild ()
{
?CBCGPCalendarBar::Rebuild();
?int i = 0;
?for (i = 0; !m_Buttons.IsEmpty() && i < 42; ++i)
?{
??CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.RemoveTail();
??ASSERT_VALID (pButton);
??if (pButton != NULL)
??{
???pButton->OnCancelMode ();
???delete pButton;
??}
?}
?for (i = 0; i < 42; i ++)
??InsertButton ( createDateButton() );
?SetDate (m_dateSelected);
}
把原來的CBCGPCalendarBar建立的那42個按鈕全部去掉,換上自己的按鈕。
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|