source: trunk/src/WTLx/EditHilight.hpp @ 493

Revision 493, 2.5 KB checked in by Eoin, 12 years ago (diff)

Freedom from automatic ATL and/or WTL namespaces.

Line 
1
2//         Copyright Eoin O'Callaghan 2006 - 2008.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#define WM_USER_WTLx_EDITHILIGHTCHANGED WM_USER + 100
10
11#include "stdAfx.hpp"
12#include <boost/logic/tribool.hpp>
13
14namespace WTLx
15{
16
17template <class T, class TBase = WTL::CEdit, class TWinTraits = ATL::CControlWinTraits>
18class ATL_NO_VTABLE EditHilightImpl : public ATL::CWindowImpl<T, TBase, TWinTraits>
19{
20protected:
21        typedef EditHilightImpl< T, TBase, TWinTraits> thisClass;
22        typedef ATL::CWindowImpl<T, TBase, TWinTraits> baseClass;
23
24public:
25        DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())
26
27        explicit EditHilightImpl() :
28                unapplied_(false)
29        {}
30
31    BEGIN_MSG_MAP_EX(thisClass)
32                MSG_OCM_CTLCOLOREDIT(OnReflectedCtlColorEdit)
33                REFLECTED_COMMAND_CODE_HANDLER_EX(EN_CHANGE, OnChange)
34               
35        DEFAULT_REFLECTION_HANDLER()
36    END_MSG_MAP()
37
38        void SubclassWindow(HWND hWndNew)
39        {
40                ATLASSERT(::IsWindow(hWndNew));
41        baseClass::SubclassWindow(hWndNew);
42        }
43       
44        LRESULT OnChange(UINT uNotifyCode, int nID, ATL::CWindow wndCtl)
45        {       
46                if (unapplied_)
47                {
48                }
49                else if (!unapplied_)
50                {
51                        unapplied_ = true;
52                        InvalidateRect(0, true);
53                }
54                else
55                {
56                        unapplied_ = false;
57                }
58               
59                return 0;
60        }
61
62        HBRUSH OnReflectedCtlColorEdit(WTL::CDCHandle dc, WTL::CEdit edit)
63        {
64                if (unapplied_)
65                {
66                        SetTextColor(dc, RGB(0,0,255));
67                        return GetSysColorBrush(COLOR_3DHILIGHT);
68                }
69                else
70                {
71                        return false;
72                }
73        }       
74       
75        operator std::wstring () 
76        { 
77                size_t maxLen = GetWindowTextLength()+1;
78
79                std::vector<wchar_t> buffer(maxLen);
80                size_t len = GetWindowText(&buffer[0], maxLen);
81
82                unapplied_ = false;             
83                InvalidateRect(0, true);
84
85                return std::wstring(buffer.begin(), buffer.begin()+len);
86        }
87
88        std::wstring& operator=(std::wstring& val) 
89        {       
90                SetWindowText(val.c_str());
91
92                unapplied_ = false;
93                InvalidateRect(0, true);
94
95                return val;
96        }
97       
98private:       
99        boost::logic::tribool unapplied_;
100};
101
102class EditHilight : public EditHilightImpl<EditHilight>
103{
104public:
105        DECLARE_WND_SUPERCLASS(_T("WTLx_EditHilight"), GetWndClassName())
106
107        EditHilight() : 
108                EditHilightImpl<EditHilight>()
109        {}
110
111        operator std::wstring () 
112        { 
113                return *static_cast<EditHilightImpl<EditHilight>* >(this);
114        }
115
116        std::wstring& operator=(std::wstring& val) 
117        {
118                return EditHilightImpl<EditHilight>::operator =(val);
119        }
120};
121
122};
Note: See TracBrowser for help on using the repository browser.