15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

 

Календарь


Автор: Norm Almond.

Скачать исходник с примером - 44Kb

Описание

Позволяет задавать описание к любому дню месяца, ведёт лог. Для программистов здесь будут интересены некоторые реализации элементов управления. Также устранены недостатки многих календарей присутствующих на рынке программного обеспечения.

Интерфейс

COleDateTime GetDate() Получаем выделенную дату
void ShowSpinner(BOOL bShow); Показывает или скрывает полосу прокрутки
BOOL SetDate(COleDateTime tm); Устанавливает текущую дату
BOOL AddNote(COleDateTime& date, CString strNote, BOOL bReplace); Присоединяет к дате описание
void DeleteNote(COleDateTime& date); Удаляет описание даты
void ClearAllNotes(); Стирает все описания

Использование

Файлы:

  • CalWnd.h & CalWnd.cpp (Тело календаря)
  • CalBtn.h & CalBtn.cpp (объекты-кнопки на календаре)
  • Popup.h & Popup.cpp (Всплывающее контекстное меню)
  • NoEdit.h & NoEdit.cpp (Запрещает edit box)

В заголовочный файл необходимо включить "calwnd.h"

// Добавление календаря и зависимых файлов
#include "CalWnd.h"

Теперь создаём объект CCalWnd как член вашего Вашего класса окна

class CMyWnd
{
public:
... другие объявления
protected:
    CCalWnd	m_wndCalendar;  

Теперь создаём окно календаря.

int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{	
	// Сперва вызываем OnCreate базового класса
	if (CWnd ::OnCreate(lpCreateStruct) == -1)
		return -1;
	

	// Теперь создаём наш календарь
	// при создании окна задаются координаты лева и верха.
	// размер календаря устанавливается автоматически ...
	if (m_wndCalendar.Create(NULL,"Calendar",
               WS_VISIBLE|WS_CHILD,CRect(20,20,0,0),this,0x0101) == -1)
		return -1;
	... другой код

Так же Вам необходимо включить обработчик сообщения об изменении даты. (Когда пользователь кликает по дате). Он вставляется в .cpp файл Вашего главного окна. Поместить его надо за пределами комментария AFX_MSG_MAP.

BEGIN_MESSAGE_MAP(CChildView,CWnd )
	//{{AFX_MSG_MAP(CChildView)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_DATE_NOTIFY,OnDateNotify) // <--- СЮДА
END_MESSAGE_MAP()

И, соответственно, в .h файл. Естевственно за пределами AFX_MSG_MAP комментария.

//{{AFX_MSG(CChildView)
	afx_msg void OnPaint();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	//}}AFX_MSG
	void OnDateNotify(UINT nId); // <--- СЮДА
	DECLARE_MESSAGE_MAP()

И в заключении сам обработчик.

LRESULT CChildView::OnDateNotify(WPARAM wParam, LPARAM nControlId)
{
	COleDateTime tm = m_wndCalendar.GetDate();

	TRACE("Date Selected %s for Control ID %d\n",
                                      tm.Format("%c"), nControlId);
	return 0;
}

Ну а более подробно о принципе работы календаря можно посмотреть в исходнике :)