2 #include <dali/internal/window-system/windows/platform-implement-win.h>
\r
20 namespace WindowsPlatformImplement
\r
23 HWND roothWnd = NULL;
\r
29 while( GetMessage( &nMsg, 0, NULL, NULL ) )
\r
31 TranslateMessage( &nMsg );
\r
32 DispatchMessage( &nMsg );
\r
38 if( WM_CLOSE == nMsg.message )
\r
45 void SetParent(long child, long parent)
\r
47 if (roothWnd == (HWND)child && NULL != (HWND)parent)
\r
49 roothWnd = (HWND)parent;
\r
52 ::SetParent((HWND)child, (HWND)parent);
\r
57 void GetDPI(float &xDpi, float &yDpi)
\r
59 HDC hdcScreen = GetDC(roothWnd);
\r
61 int iX = GetDeviceCaps( hdcScreen, HORZRES ); // pixel
\r
62 int iY = GetDeviceCaps( hdcScreen, VERTRES ); // pixel
\r
63 int iPhsX = GetDeviceCaps( hdcScreen, HORZSIZE ); // mm
\r
64 int iPhsY = GetDeviceCaps( hdcScreen, VERTSIZE ); // mm
\r
66 xDpi = (float)iX / (float)iPhsX * INCH;
\r
67 yDpi = (float)iY / (float)iPhsY * INCH;
\r
70 map<int, set<Dali::CallbackBase*>> callbackMap;
\r
71 set<winEventCallback> listenerSet;
\r
73 LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
75 for( set<winEventCallback>::iterator x = listenerSet.begin(); x != listenerSet.end(); ++x )
\r
77 ( *x )( (long)hWnd, (long)uMsg, (long)wParam, (long)lParam );
\r
81 map<int, set<Dali::CallbackBase*>>::iterator x = callbackMap.find( uMsg );
\r
83 if( callbackMap.end() != x )
\r
85 set<Dali::CallbackBase*> &cbSet = x->second;
\r
86 for( set<Dali::CallbackBase*>::iterator y = cbSet.begin(); cbSet.end() != y; ++y )
\r
88 Dali::CallbackBase::Execute(**y);
\r
93 LRESULT ret = DefWindowProc( hWnd, uMsg, wParam, lParam );
\r
97 DWORD windowStyle = WS_OVERLAPPED;
\r
101 switch( windowStyle )
\r
103 case WS_OVERLAPPED:
\r
113 int GetEdgeHeight()
\r
115 switch( windowStyle )
\r
117 case WS_OVERLAPPED:
\r
128 _In_opt_ const char *lpClassName,
\r
129 _In_opt_ const char *lpWindowName,
\r
134 _In_opt_ long parent)
\r
136 WNDCLASS cs = { 0 };
\r
139 cs.hbrBackground = (HBRUSH)( COLOR_WINDOW + 2 );
\r
142 cs.hInstance = GetModuleHandle( NULL );
\r
143 cs.lpfnWndProc = (WNDPROC)WinProc;
\r
144 cs.lpszClassName = lpClassName;
\r
145 cs.lpszMenuName = NULL;
\r
146 cs.style = CS_VREDRAW | CS_HREDRAW;
\r
147 RegisterClass( &cs );//ʵÏÖ×¢²á´°¿Ú
\r
149 HWND hWnd = CreateWindow( lpClassName, lpWindowName, windowStyle, X, Y, nWidth + 2 * GetEdgeWidth(), nHeight + 2 * GetEdgeHeight(), NULL, NULL, cs.hInstance, NULL );
\r
150 ShowWindow( hWnd, SW_SHOW );
\r
152 if( hWnd != roothWnd )
\r
160 void AddListener(winEventCallback callback)
\r
162 listenerSet.insert(callback);
\r
165 void AddListener( int msgType, Dali::CallbackBase *callback )
\r
167 map<int, set<Dali::CallbackBase*>>::iterator x = callbackMap.find( msgType );
\r
168 if( callbackMap.end() == x )
\r
170 set<Dali::CallbackBase*> callbackSet;
\r
171 callbackSet.insert( callback );
\r
173 callbackMap.insert( make_pair( msgType, callbackSet ) );
\r
177 set<Dali::CallbackBase*> &callbackSet = x->second;
\r
178 set<Dali::CallbackBase*>::iterator y = callbackSet.find( callback );
\r
179 if( callbackSet.end() == y )
\r
181 callbackSet.insert( callback );
\r
186 void RemoveListener(int msgType)
\r
188 callbackMap.erase(msgType);
\r
191 bool PostWinMessage(
\r
192 _In_ unsigned int Msg,
\r
195 _In_ long hWnd/* = 0*/)
\r
199 return (bool)PostMessage( roothWnd, Msg, wParam, lParam );
\r
203 return (bool)PostMessage( (HWND)hWnd, Msg, wParam, lParam );
\r
207 void ShowWindow(long hWnd)
\r
209 ::ShowWindow((HWND)hWnd, SW_SHOW);
\r
212 void HideWindow(long hWnd)
\r
214 ::ShowWindow((HWND)hWnd, SW_HIDE);
\r
217 long CreateWinSemaphore(_In_ long lInitialCount, _In_ long lMaximumCount)
\r
219 return (long)::CreateSemaphore(NULL, lInitialCount, lMaximumCount, NULL);
\r
222 unsigned long WaitForSingleObject(_In_ long hHandle, _In_ unsigned long dwMilliseconds)
\r
224 return ::WaitForSingleObject((HWND)hHandle, dwMilliseconds);
\r
227 bool ReleaseSemaphore(_In_ long hSemaphore, _In_ long lReleaseCount, _Out_opt_ long *lpPreviousCount)
\r
229 return ::ReleaseSemaphore((HWND)hSemaphore, lReleaseCount, lpPreviousCount);
\r
232 struct TTimerCallbackInfo
\r
235 timerCallback callback;
\r
238 map<int, TTimerCallbackInfo> mapTimerIDToData;
\r
240 void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nTimerid, DWORD dwTime)
\r
242 map<int, TTimerCallbackInfo>::iterator x = mapTimerIDToData.find( nTimerid );
\r
244 if( mapTimerIDToData.end() == x )
\r
249 TTimerCallbackInfo &info = x->second;
\r
251 info.callback( info.data );
\r
254 int SetTimer(int interval, timerCallback callback, void *data)
\r
258 for( map<int, TTimerCallbackInfo>::iterator x = mapTimerIDToData.begin(); mapTimerIDToData.end() != x; ++x )
\r
272 TTimerCallbackInfo callbackInfo;
\r
273 callbackInfo.data = data;
\r
274 callbackInfo.callback = callback;
\r
276 mapTimerIDToData.insert( make_pair( timerID, callbackInfo ) );
\r
278 ::SetTimer( roothWnd, timerID, interval, TimerProc );
\r
283 void KillTimer(int id)
\r
285 mapTimerIDToData.erase(id);
\r
286 ::KillTimer(roothWnd, id);
\r
289 const char* GetKeyName( int keyCode )
\r
294 return "Backspace";
\r
356 static LARGE_INTEGER _cpuFrequency;
\r
357 static LARGE_INTEGER *_pCpuFrequency = NULL;
\r
359 long GetCurrentThreadId()
\r
361 return ::GetCurrentThreadId();
\r
364 void GetNanoseconds( uint64_t& timeInNanoseconds )
\r
366 if( NULL == _pCpuFrequency )
\r
368 _pCpuFrequency = &_cpuFrequency;
\r
369 QueryPerformanceFrequency( _pCpuFrequency );
\r
372 LARGE_INTEGER curTime;
\r
373 QueryPerformanceCounter( &curTime );
\r
375 timeInNanoseconds = (double)curTime.QuadPart / (double)_pCpuFrequency->QuadPart * 1000000000;
\r
378 unsigned int GetCurrentMilliSeconds( void )
\r
380 if( NULL == _pCpuFrequency )
\r
382 _pCpuFrequency = &_cpuFrequency;
\r
383 QueryPerformanceFrequency( _pCpuFrequency );
\r
386 LARGE_INTEGER curTime;
\r
387 QueryPerformanceCounter( &curTime );
\r
389 return curTime.QuadPart * 1000 / _pCpuFrequency->QuadPart;
\r
392 } // namespace WindowsPlatformImplement
394 } // namespace Adaptor
396 } // namespace internal
398 } // namespace Dali
\r