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

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