source: trunk/Utilities/GpsLocationConverter/MainDialog.h @ 31

Last change on this file since 31 was 31, checked in by roman, 11 years ago

support for fractional seconds

  • Property svn:keywords set to Id
File size: 17.3 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2011
3// Created by Roman Ryltsov roman@alax.info
4//
5// $Id: MainDialog.h 31 2011-10-18 09:26:26Z roman $
6
7#pragma once
8
9#include "AboutDialog.h"
10
11////////////////////////////////////////////////////////////
12// CMainDialog
13
14class CMainDialog : 
15        public CAxDialogImpl<CMainDialog>
16{
17public:
18        enum { IDD = IDD_MAIN };
19
20BEGIN_MSG_MAP_EX(CMainDialog)
21        CHAIN_MSG_MAP(CAxDialogImpl<CMainDialog>)
22        MSG_WM_INITDIALOG(OnInitDialog)
23        MSG_WM_DESTROY(OnDestroy)
24        MSG_WM_CHANGECBCHAIN(OnChangeCbChain)
25        MSG_WM_DRAWCLIPBOARD(OnDrawClipboard)
26        MSG_WM_SYSCOMMAND(OnSysCommand)
27        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCommand)
28        NOTIFY_RANGE_CODE_HANDLER_EX(IDC_MAIN_DEGREES_LATITUDE, IDC_MAIN_DEGREESMINUTESSECONDS_LONGITUDELATITUDE, CRoHyperStatic::NC_ANCHORCLICKED, OnStaticAnchorClicked)
29        MSG_WM_HOTKEY(OnHotKey)
30        REFLECT_NOTIFICATIONS()
31END_MSG_MAP()
32
33private:
34        CRoIconStatic m_IntroductionStatic;
35        CRoHyperStatic m_pStatics[12];
36        CRoHyperStatic m_GoogleMapsStatic;
37        CRoHyperStatic m_YandexMapsStatic;
38        BOOL m_bSetClipboardTextActive;
39        CWindow m_NextClipboardViewerWindow;
40
41public:
42// CMainDialog
43        CMainDialog()
44        {
45        }
46        VOID SetLocation(DOUBLE fLatitude, DOUBLE fLongitude)
47        {
48                CString psTexts[12];
49                CString sGoogleMapsLocation, sYandexMapsLocation;
50                #pragma region Degrees
51                {
52                        const CString sLatitude = _StringHelper::FormatNumber(fLatitude, 6, FALSE);
53                        const CString sLongitude = _StringHelper::FormatNumber(fLongitude, 6, FALSE);
54                        psTexts[0] = sLatitude;
55                        psTexts[1] = sLongitude;
56                        psTexts[2] = AtlFormatString(_T("%s, %s"), sLatitude, sLongitude);
57                        psTexts[3] = AtlFormatString(_T("%s, %s"), sLongitude, sLatitude);
58                        sGoogleMapsLocation = AtlFormatString(_T("http://maps.google.com/maps/?ll=%s,%s"), sLatitude, sLongitude);
59                        sYandexMapsLocation = AtlFormatString(_T("http://maps.yandex.ru/?ll=%s,%s"), sLongitude, sLatitude);
60                }
61                #pragma endregion
62                #pragma region Degrees, Minutes
63                {
64                        CString sLatitude, sLongitude;
65                        #pragma region Latitude
66                        sLatitude.Append((fLatitude >= 0) ? _T("N ") : _T("S "));
67                        DOUBLE fPartialLatitude = abs(fLatitude);
68                        const INT nPartialLatitude = (INT) fPartialLatitude;
69                        sLatitude.AppendFormat(_T("%02d "), nPartialLatitude);
70                        const DOUBLE fPartialLatitudeMinute = (fPartialLatitude - nPartialLatitude) * 60;
71                        const INT nPartialLatitudeMinute = (INT) fPartialLatitudeMinute;
72                        sLatitude.AppendFormat(_T("%02d"), nPartialLatitudeMinute);
73                        sLatitude.AppendFormat(_T(".%03d "), (INT) ((fPartialLatitudeMinute - nPartialLatitudeMinute) * 1000 + 0.5 - 1E-6));
74                        #pragma endregion
75                        #pragma region Latitude
76                        sLongitude.Append((fLongitude >= 0) ? _T("E ") : _T("W "));
77                        DOUBLE fPartialLongitude = abs(fLongitude);
78                        const INT nPartialLongitude = (INT) fPartialLongitude;
79                        sLongitude.AppendFormat(_T("%03d "), nPartialLongitude);
80                        const DOUBLE fPartialLongitudeMinute = (fPartialLongitude - nPartialLongitude) * 60;
81                        const INT nPartialLongitudeMinute = (INT) fPartialLongitudeMinute;
82                        sLongitude.AppendFormat(_T("%02d"), nPartialLongitudeMinute);
83                        sLongitude.AppendFormat(_T(".%03d "), (INT) ((fPartialLongitudeMinute - nPartialLongitudeMinute) * 1000 + 0.5 - 1E-6));
84                        #pragma endregion
85                        psTexts[4] = sLatitude;
86                        psTexts[5] = sLongitude;
87                        psTexts[6] = AtlFormatString(_T("%s, %s"), sLatitude, sLongitude);
88                        psTexts[7] = AtlFormatString(_T("%s, %s"), sLongitude, sLatitude);
89                }
90                #pragma endregion
91                #pragma region Degrees, Minutes, Seconds
92                {
93                        CString sLatitude, sLongitude;
94                        #pragma region Latitude
95                        sLatitude.Append((fLatitude >= 0) ? _T("N ") : _T("S "));
96                        DOUBLE fPartialLatitude = abs(fLatitude);
97                        const INT nPartialLatitude = (INT) fPartialLatitude;
98                        sLatitude.AppendFormat(_T("%02d "), nPartialLatitude);
99                        const DOUBLE fPartialLatitudeMinute = (fPartialLatitude - nPartialLatitude) * 60;
100                        const INT nPartialLatitudeMinute = (INT) fPartialLatitudeMinute;
101                        sLatitude.AppendFormat(_T("%02d "), nPartialLatitudeMinute);
102                        const DOUBLE fPartialLatitudeSecond = (fPartialLatitudeMinute - nPartialLatitudeMinute) * 60;
103                        const INT nPartialLatitudeSecond = (INT) fPartialLatitudeSecond;
104                        sLatitude.AppendFormat(_T("%02d"), nPartialLatitudeSecond);
105                        sLatitude.AppendFormat(_T(".%02d"), (INT) ((fPartialLatitudeSecond - nPartialLatitudeSecond) * 100 + 0.5 - 1E-6));
106                        #pragma endregion
107                        #pragma region Latitude
108                        sLongitude.Append((fLongitude >= 0) ? _T("E ") : _T("W "));
109                        DOUBLE fPartialLongitude = abs(fLongitude);
110                        INT nPartialLongitude = (INT) fPartialLongitude;
111                        sLongitude.AppendFormat(_T("%03d "), nPartialLongitude);
112                        DOUBLE fPartialLongitudeMinute = (fPartialLongitude - nPartialLongitude) * 60;
113                        INT nPartialLongitudeMinute = (INT) fPartialLongitudeMinute;
114                        sLongitude.AppendFormat(_T("%02d "), nPartialLongitudeMinute);
115                        const DOUBLE fPartialLongitudeSecond = (fPartialLongitudeMinute - nPartialLongitudeMinute) * 60;
116                        const INT nPartialLongitudeSecond = (INT) fPartialLongitudeSecond;
117                        sLongitude.AppendFormat(_T("%02d"), nPartialLongitudeSecond);
118                        sLongitude.AppendFormat(_T(".%02d"), (INT) ((fPartialLongitudeSecond - nPartialLongitudeSecond) * 100 + 0.5 - 1E-6));
119                        #pragma endregion
120                        psTexts[ 8] = sLatitude;
121                        psTexts[ 9] = sLongitude;
122                        psTexts[10] = AtlFormatString(_T("%s, %s"), sLatitude, sLongitude);
123                        psTexts[11] = AtlFormatString(_T("%s, %s"), sLongitude, sLatitude);
124                }
125                #pragma endregion
126                for(SIZE_T nIndex = 0; nIndex < 12; nIndex++)
127                        m_pStatics[nIndex].SetWindowText(AtlFormatString(_T("<A HREF=\"%s\">%s</A> (F%d)"), psTexts[nIndex], psTexts[nIndex], nIndex + 1));
128                m_GoogleMapsStatic.SetWindowText(AtlFormatString(_T("<A TITLE=\"Open in Google Maps\" HREF=\"%s\">%s</A>"), sGoogleMapsLocation, sGoogleMapsLocation));
129                m_YandexMapsStatic.SetWindowText(AtlFormatString(_T("<A TITLE=\"Open in Yandex Maps\" HREF=\"%s\">%s</A>"), sYandexMapsLocation, sYandexMapsLocation));
130        }
131        BOOL SetText(const CString& sText)
132        {
133                if(sText.GetLength() >= 4096)
134                        return FALSE;
135                CRoReMatchContext MatchContext;
136                #pragma region Google Maps
137                static CAtlStaticRegExp<> g_ExpressionA(_T("^ *(http://)?[^/]*maps.google[^/]*/.+?") _T("ll={[\\.0-9]+},{[\\.0-9]+}"), FALSE);
138                if(g_ExpressionA.Match(sText, &MatchContext))
139                {
140                        DOUBLE fLatitude, fLongitude;
141                        if(!AtlStringToDouble(MatchContext.GetMatchString(0), fLatitude) || !AtlStringToDouble(MatchContext.GetMatchString(1), fLongitude))
142                                return FALSE;
143                        SetLocation(fLatitude, fLongitude);
144                        return TRUE;
145                }
146                #pragma endregion
147                #pragma region Yandex Maps
148                static CAtlStaticRegExp<> g_ExpressionB(_T("^ *(http://)?[^/]*maps.yandex[^/]*/.+?") _T("ll={[\\.0-9]+}(,|(\\%2C)){[\\.0-9]+}"), FALSE);
149                if(g_ExpressionB.Match(sText, &MatchContext))
150                {
151                        DOUBLE fLatitude, fLongitude;
152                        if(!AtlStringToDouble(MatchContext.GetMatchString(0), fLongitude) || !AtlStringToDouble(MatchContext.GetMatchString(1), fLatitude))
153                                return FALSE;
154                        SetLocation(fLatitude, fLongitude);
155                        return TRUE;
156                }
157                #pragma endregion
158                #pragma region Degrees and Minutes
159                static CAtlStaticRegExp<> g_ExpressionD0(_T("^[\t ]*") 
160                        _T("{[NSCÞ]}") _T("[\t ]*") _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") 
161                        _T("[^0-9\\.]+?") 
162                        _T("{[EWÂÇ]}") _T("[\t ]*") _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}")
163                        _T(""), FALSE);
164                static CAtlStaticRegExp<> g_ExpressionD1(_T("^[\t ]*") 
165                        _T("{[EWÂÇ]}") _T("[\t ]*") _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}")
166                        _T("[^0-9\\.]+?") 
167                        _T("{[NSCÞ]}") _T("[\t ]*") _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") 
168                        _T(""), FALSE);
169                static CAtlStaticRegExp<> g_ExpressionD2(_T("^[\t ]*") 
170                        _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") _T("[\t ]*") _T("{[NSCÞ]}")
171                        _T("[^0-9\\.]+?") 
172                        _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") _T("[\t ]*") _T("{[EWÂÇ]}")
173                        _T(""), FALSE);
174                static CAtlStaticRegExp<> g_ExpressionD3(_T("^[\t ]*") 
175                        _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") _T("[\t ]*") _T("{[EWÂÇ]}")
176                        _T("[^0-9\\.]+?") 
177                        _T("{[0-9]+}[^0-9]+?{[0-9]+\\.[0-9]+}") _T("[\t ]*") _T("{[NSCÞ]}")
178                        _T(""), FALSE);
179                INT nLayoutD = -1;
180                if(g_ExpressionD0.Match(sText, &MatchContext))
181                        nLayoutD = 0;
182                else if(g_ExpressionD1.Match(sText, &MatchContext))
183                        nLayoutD = 1;
184                else if(g_ExpressionD2.Match(sText, &MatchContext))
185                        nLayoutD = 2;
186                else if(g_ExpressionD3.Match(sText, &MatchContext))
187                        nLayoutD = 3;
188                if(nLayoutD >= 0)
189                {
190                        static const SIZE_T g_pnMap[4][6] = 
191                        {
192                                { 0, 1, 2, 3, 4, 5, },
193                                { 3, 4, 5, 0, 1, 2, },
194                                { 2, 0, 1, 5, 3, 4, },
195                                { 5, 3, 4, 2, 0, 1, },
196                        };
197                        const INT nLatitudeSign = (MatchContext.GetMatchString(g_pnMap[nLayoutD][0]).FindOneOf(_T("SsÞþ")) >= 0) ? -1 : 1;
198                        const INT nLongitudeSign = (MatchContext.GetMatchString(g_pnMap[nLayoutD][3]).FindOneOf(_T("WwÇç")) >= 0) ? -1 : 1;
199                        INT nLatitudeDegrees, nLongitudeDegrees;
200                        DOUBLE fLatitudeMinutes, fLongitudeMinutes;
201                        if(FALSE ||
202                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutD][1]), nLatitudeDegrees) || 
203                                !AtlStringToDouble(MatchContext.GetMatchString(g_pnMap[nLayoutD][2]), fLatitudeMinutes) || 
204                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutD][4]), nLongitudeDegrees) ||
205                                !AtlStringToDouble(MatchContext.GetMatchString(g_pnMap[nLayoutD][5]), fLongitudeMinutes) ||
206                                FALSE)
207                                return FALSE;
208                        _A(fLatitudeMinutes >= 0 && fLongitudeMinutes >= 0);
209                        if(fLatitudeMinutes >= 60.0 || fLongitudeMinutes >= 60.0)
210                                return FALSE;
211                        const DOUBLE fLatitude = nLatitudeSign * (nLatitudeDegrees + fLatitudeMinutes / 60.0);
212                        const DOUBLE fLongitude = nLongitudeSign * (nLongitudeDegrees + fLongitudeMinutes / 60.0);
213                        SetLocation(fLatitude, fLongitude);
214                        return TRUE;
215                }
216                #pragma endregion
217                #pragma region Degrees, Minutes and Seconds
218#define LATITUDE_SYMBOL         _T("{[NSCÞ]}")
219#define LONGITUDE_SYMBOL        _T("{[EWÂÇ]}")
220#define VALUE                           _T("{[0-9]+}[^0-9]+?{[0-9]+}[^0-9\\.]+?{[0-9]+(\\.([0-9]+)?)?}")
221#define OPTIONAL_WHITESPACE     _T("[\t ]*")
222#define SEPARATOR                       _T("[^0-9\\.]+?")
223                static CAtlStaticRegExp<> g_ExpressionE0(_T("^") OPTIONAL_WHITESPACE LATITUDE_SYMBOL OPTIONAL_WHITESPACE VALUE SEPARATOR LONGITUDE_SYMBOL OPTIONAL_WHITESPACE VALUE _T(""), FALSE);
224                static CAtlStaticRegExp<> g_ExpressionE1(_T("^") OPTIONAL_WHITESPACE LONGITUDE_SYMBOL OPTIONAL_WHITESPACE VALUE SEPARATOR LATITUDE_SYMBOL OPTIONAL_WHITESPACE VALUE  _T(""), FALSE);
225                static CAtlStaticRegExp<> g_ExpressionE2(_T("^") OPTIONAL_WHITESPACE VALUE OPTIONAL_WHITESPACE LATITUDE_SYMBOL SEPARATOR VALUE OPTIONAL_WHITESPACE LONGITUDE_SYMBOL _T(""), FALSE);
226                static CAtlStaticRegExp<> g_ExpressionE3(_T("^") OPTIONAL_WHITESPACE VALUE OPTIONAL_WHITESPACE LONGITUDE_SYMBOL SEPARATOR VALUE OPTIONAL_WHITESPACE LATITUDE_SYMBOL _T(""), FALSE);
227#undef LATITUDE_SYMBOL
228#undef LONGITUDE_SYMBOL
229#undef VALUE
230#undef OPTIONAL_WHITESPACE
231#undef SEPARATOR
232                INT nLayoutE = -1;
233                if(g_ExpressionE0.Match(sText, &MatchContext))
234                        nLayoutE = 0;
235                else if(g_ExpressionE1.Match(sText, &MatchContext))
236                        nLayoutE = 1;
237                else if(g_ExpressionE2.Match(sText, &MatchContext))
238                        nLayoutE = 2;
239                else if(g_ExpressionE3.Match(sText, &MatchContext))
240                        nLayoutE = 3;
241                if(nLayoutE >= 0)
242                {
243                        static const SIZE_T g_pnMap[4][8] = 
244                        {
245                                { 0, 1, 2, 3, 4, 5, 6, 7, },
246                                { 4, 5, 6, 7, 0, 1, 2, 3, },
247                                { 3, 0, 1, 2, 7, 4, 5, 6, },
248                                { 7, 4, 5, 6, 3, 0, 1, 2, },
249                        };
250                        const INT nLatitudeSign = (MatchContext.GetMatchString(g_pnMap[nLayoutE][0]).FindOneOf(_T("SsÞþ")) >= 0) ? -1 : 1;
251                        const INT nLongitudeSign = (MatchContext.GetMatchString(g_pnMap[nLayoutE][4]).FindOneOf(_T("WwÇç")) >= 0) ? -1 : 1;
252                        INT nLatitudeDegrees, nLongitudeDegrees;
253                        INT nLatitudeMinutes, nLongitudeMinutes;
254                        DOUBLE fLatitudeSeconds, fLongitudeSeconds;
255                        if(FALSE ||
256                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutE][1]), nLatitudeDegrees) || 
257                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutE][2]), nLatitudeMinutes) || 
258                                !AtlStringToDouble(MatchContext.GetMatchString(g_pnMap[nLayoutE][3]), fLatitudeSeconds) || 
259                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutE][5]), nLongitudeDegrees) ||
260                                !AtlStringToInteger(MatchContext.GetMatchString(g_pnMap[nLayoutE][6]), nLongitudeMinutes) ||
261                                !AtlStringToDouble(MatchContext.GetMatchString(g_pnMap[nLayoutE][7]), fLongitudeSeconds) ||
262                                FALSE)
263                                return FALSE;
264                        _A(nLatitudeMinutes >= 0 && nLongitudeMinutes >= 0);
265                        if(nLatitudeMinutes >= 60 || nLongitudeMinutes >= 60)
266                                return FALSE;
267                        _A(fLatitudeSeconds >= 0 && fLongitudeSeconds >= 0);
268                        if(fLatitudeSeconds >= 60 || fLongitudeSeconds >= 60)
269                                return FALSE;
270                        const DOUBLE fLatitude = nLatitudeSign * (nLatitudeDegrees + (nLatitudeMinutes + fLatitudeSeconds / 60.0) / 60.0);
271                        const DOUBLE fLongitude = nLongitudeSign * (nLongitudeDegrees + (nLongitudeMinutes + fLongitudeSeconds / 60.0) / 60.0);
272                        SetLocation(fLatitude, fLongitude);
273                        return TRUE;
274                }
275                #pragma endregion
276                #pragma region Degrees, Latitude and Longitude
277                static CAtlStaticRegExp<> g_ExpressionC(_T("^ *") _T("{-?[0-9]+\\.[0-9]+}") _T("[^0-9\\.]+") _T("{-?[0-9]+\\.[0-9]+}"), FALSE);
278                if(g_ExpressionC.Match(sText, &MatchContext))
279                {
280                        DOUBLE fLatitude, fLongitude;
281                        if(!AtlStringToDouble(MatchContext.GetMatchString(0), fLatitude) || !AtlStringToDouble(MatchContext.GetMatchString(1), fLongitude))
282                                return FALSE;
283                        SetLocation(fLatitude, fLongitude);
284                        return TRUE;
285                }
286                #pragma endregion
287                return FALSE;
288        }
289        BOOL SetText(LPCTSTR pszText)
290        {
291                return SetText(CString(pszText));
292        }
293
294// Window message handelrs
295        LRESULT OnInitDialog(HWND, LPARAM)
296        {
297                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)), TRUE);
298                SetIcon(AtlLoadIconImage(IDI_MODULE, LR_DEFAULTCOLOR, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)), FALSE);
299                CMenuHandle Menu = GetSystemMenu(FALSE);
300                _W(Menu.AppendMenu(MF_SEPARATOR));
301                _W(Menu.AppendMenu(MF_STRING, ID_APP_ABOUT, _T("&About...")));
302                _W(m_IntroductionStatic.SubclassWindow(GetDlgItem(IDC_MAIN_INTRODUCTION)));
303                for(SIZE_T nIndex = 0; nIndex < 12; nIndex++)
304                        _W(m_pStatics[nIndex].SubclassWindow(GetDlgItem(IDC_MAIN_DEGREES_LATITUDE + nIndex)));
305                _W(m_GoogleMapsStatic.SubclassWindow(GetDlgItem(IDC_MAIN_GOOGLEMAPS)));
306                _W(m_YandexMapsStatic.SubclassWindow(GetDlgItem(IDC_MAIN_YANDEXMAPS)));
307                _W(CenterWindow());
308                m_bSetClipboardTextActive = FALSE;
309                m_NextClipboardViewerWindow = SetClipboardViewer();
310                for(SIZE_T nIndex = 0; nIndex < 12; nIndex++)
311                        _W(RegisterHotKey(m_hWnd, (INT) nIndex, MOD_CONTROL | MOD_SHIFT, VK_F1 + nIndex));
312#if _DEVELOPMENT
313                //SetText(_T("http://maps.google.com.ua/maps/ms?msid=206853065838475655514.0004af0a0899ed541f5f2&msa=0&ll=45.296505,35.771999&spn=0.039547,0.095272"));
314                //SetText(_T("http://maps.yandex.ru/?ll=13.376147%2C45.797846&spn=2.820740%2C1.127727&z=9&l=map"));
315#endif // _DEVELOPMENT
316                return TRUE;
317        }
318        LRESULT OnDestroy() throw()
319        {
320                for(SIZE_T nIndex = 0; nIndex < 12; nIndex++)
321                        _W(UnregisterHotKey(m_hWnd, (INT) nIndex));
322                _W(ChangeClipboardChain(m_NextClipboardViewerWindow));
323                return 0;
324        }
325        LRESULT OnChangeCbChain(CWindow RemovedWindow, CWindow NextWindow)
326        {
327                if(m_NextClipboardViewerWindow == RemovedWindow)
328                        m_NextClipboardViewerWindow = NextWindow;
329                else if(m_NextClipboardViewerWindow)
330                        m_NextClipboardViewerWindow.SendMessage(WM_CHANGECBCHAIN, (WPARAM) (HWND) RemovedWindow, (LPARAM) (HWND) NextWindow);
331                return 0;
332        }
333        LRESULT OnDrawClipboard()
334        {
335                if(m_bSetClipboardTextActive)
336                        return 0;
337                if(OpenClipboard()) 
338                {
339                        _ATLTRY
340                        {
341                                if(IsClipboardFormatAvailable(CF_UNICODETEXT))
342                                {
343                                        CGlobalMemoryWeakHandle DataHandle = (HGLOBAL) GetClipboardData(CF_UNICODETEXT);
344                                        __E(DataHandle);
345                                        CGlobalMemoryHandle::CLockT<WCHAR> pszData(DataHandle);
346                                        if(SetText(CW2CT(pszData)))
347                                        {
348                                                FLASHWINFO FlashWindowInformation = { sizeof FlashWindowInformation, m_hWnd, FLASHW_CAPTION, 5 };
349                                                _W(FlashWindowEx(&FlashWindowInformation));
350                                                //MessageBeep(MB_OK);
351                                        }
352                                }
353                        }
354                        _ATLCATCHALL()
355                        {
356                                _W(CloseClipboard());
357                                _ATLRETHROW;
358                        }
359                        _W(CloseClipboard());
360                }
361                return 0;
362        }
363        LRESULT OnSysCommand(UINT nCommand, CPoint)
364        {
365                switch(nCommand)
366                {
367                case ID_APP_ABOUT:
368                        {
369                                CAboutDialog Dialog;
370                                Dialog.DoModal(m_hWnd);
371                        }
372                        break;
373                default:
374                        SetMsgHandled(FALSE);
375                }
376                return 0;
377        }
378        LRESULT OnCommand(UINT, INT nIdentifier, HWND)
379        {
380                _W(EndDialog(nIdentifier));
381                return 0;
382        }
383        LRESULT OnStaticAnchorClicked(NMHDR* pHeader)
384        {
385                CRoHyperStatic::NMANCHORCLICKED* pHeaderEx = (CRoHyperStatic::NMANCHORCLICKED*) pHeader;
386                m_bSetClipboardTextActive = TRUE;
387                SetClipboardText(m_hWnd, pHeaderEx->pszLocation);
388                m_bSetClipboardTextActive = FALSE;
389                pHeaderEx->bShellExecuteLocation = FALSE;
390                MessageBeep(MB_OK);
391                return 0;
392        }
393        LRESULT OnHotKey(INT nIdentifier, UINT nModifierFlags, UINT nVirtualKey)
394        {
395                nModifierFlags; nVirtualKey;
396                if(nIdentifier < 12)
397                {
398                        CString sText;
399                        m_pStatics[nIdentifier].GetWindowText(sText);
400                        CRoReMatchContext MatchContext;
401                        static CAtlStaticRegExp<> g_Expression(_T("HREF=\"{.+?}\""), FALSE);
402                        if(g_Expression.Match(sText, &MatchContext))
403                        {
404                                m_bSetClipboardTextActive = TRUE;
405                                SetClipboardText(m_hWnd, MatchContext.GetMatchString(0));
406                                m_bSetClipboardTextActive = FALSE;
407                                MessageBeep(MB_OK);
408                        }
409                }
410                return 0;
411        }
412};
Note: See TracBrowser for help on using the repository browser.