|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionWhen writing a custom today item, we always spend a lot of time on writing code that is repeatable and even less "user-friendly". I've tried to wrap standard today custom item into a class which could be reused and is more comfortable for developers. BackgroundThe purpose of doing this was to write a class which would be similar to MFC AbstractClass class CTodayWindow { public: // Member Variables HWND m_hWnd; // Methods CTodayWindow(); CTodayWindow(HINSTANCE hInstance, LPCTSTR lpszClassName, LPCTSTR lpszWindowName); virtual ~CTodayWindow(); // Main Create method BOOL Create(HWND hWndParent, DWORD dwStyle = WS_VISIBLE | WS_CHILD); // Update Window void RefreshWindow(BOOL bShow = FALSE); // Set Methods BOOL SetIcon(UINT uID, int xDrawAt = 2, int yDrawAt = 0); void SetItemHeight(int nHeight); void SetClassInfo(LPCTSTR lpszClassName, LPCTSTR lpszWindowName); void SetInstance(HINSTANCE hInstance); // Get Methods HWND GetParent() {return m_hParentHwnd;}; int GetItemHeight() {return m_nHeight;}; HINSTANCE GetInstance() {return m_hInstance;}; HICON GetIcon() {return m_hIcon;}; LPCTSTR GetClassName() {return m_lpszClassName;}; LPCTSTR GetWindowName() {return m_lpszWindowName;}; // Register/Unregister TodayWindow void RegisterTodayClass(WNDPROC wndProc); void UnregisterTodayClass(); // TodayWndProc - main message loop virtual LRESULT CALLBACK TodayWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam); protected: BOOL m_bInitialRefresh; int m_nHeight; POINT m_pointIconPos; HWND m_hParentHwnd; HICON m_hIcon; HINSTANCE m_hInstance; LPCTSTR m_lpszClassName; LPCTSTR m_lpszWindowName; COLORREF m_crTodayText; HFONT m_hNormalTodayFont; HFONT m_hBoldTodayFont; virtual void DrawTodayIcon(HDC hDC, int xPos, int yPos); virtual void GetTodayDefaults(); // Message handlers virtual int OnCreate(LPCREATESTRUCT lpCreateStruct); virtual void OnDestroy(); virtual void OnPaint(HDC hDC); virtual void OnEraseBkgnd(HDC hDC); virtual void OnTodayCustomQueryRefreshCache (TODAYLISTITEM *pTodayListItem, BOOL *pResult); virtual BOOL OnTodayCustomClearCache(TODAYLISTITEM *pTodayListItem); virtual void OnLButtonUp(UINT nFlags, POINT point); virtual void OnLButtonDown(UINT nFlags, POINT point); virtual void OnSettingChange(UINT nFlags, LPCTSTR lpszSection); virtual LRESULT OnNotify(UINT nID, NMHDR* pNMHDR); virtual LRESULT OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); }; Basic class informationAs you can see I've pre-defined recently used messages into message handlers which are easy-to-use in derived classes. You don't need write anymore huge code in LRESULT CALLBACK TodayWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam); This method handles some basic messages and I've defined some virtual methods you can override. From my point of view the most used message are:
These messages have their own message handlers. Special behavior has following handlers:
Creation of today custom item window is handled in: BOOL Create(HWND hWndParent, DWORD dwStyle = WS_VISIBLE | WS_CHILD) method. This method creates a window with following attributes:
This class provides today custom item window class (un)registration as well.
Using the codeUsage of this class is very simple. Just derive your own class from // Your derived class static CMyToday* myToday; BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH : myToday = new CMyToday((HINSTANCE)hModule, _T("MyTodayClass"), _T("MyTodayWnd")); myToday->SetItemHeight(40); myToday->SetIcon(IDI_APP_ICON); break; case DLL_PROCESS_DETACH : myToday->UnregisterTodayClass(); delete myToday; break; } return TRUE; } HWND InitializeCustomItem(TODAYLISTITEM *ptli, HWND hWndParent) { myToday->RegisterTodayClass((WNDPROC)WndProc); myToday->Create(hWndParent, WS_VISIBLE | WS_CHILD); myToday->RefreshWindow(TRUE); return myToday->m_hWnd; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return myToday->TodayWndProc(uMsg, wParam, lParam); }
|
||||||||||||||||||||||