OSDN Git Service

フォーラム[#56172] SlimDX(改)のフォルダ内容が不完全だったので再UP。
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / source / windows / RenderForm.cpp
1 /*\r
2 * Copyright (c) 2007-2010 SlimDX Group\r
3\r
4 * Permission is hereby granted, free of charge, to any person obtaining a copy\r
5 * of this software and associated documentation files (the "Software"), to deal\r
6 * in the Software without restriction, including without limitation the rights\r
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
8 * copies of the Software, and to permit persons to whom the Software is\r
9 * furnished to do so, subject to the following conditions:\r
10\r
11 * The above copyright notice and this permission notice shall be included in\r
12 * all copies or substantial portions of the Software.\r
13\r
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
20 * THE SOFTWARE.\r
21 */\r
22 #include "stdafx.h"\r
23 \r
24 #include "../InternalHelpers.h"\r
25 #include "../Resources.h"\r
26 \r
27 #include "RenderForm.h"\r
28 \r
29 using namespace System;\r
30 using namespace System::Drawing;\r
31 using namespace System::ComponentModel;\r
32 using namespace System::Windows::Forms;\r
33 \r
34 namespace SlimDX\r
35 {\r
36 namespace Windows\r
37 {\r
38         RenderForm::RenderForm()\r
39         {\r
40                 Construct( "SlimDX" );\r
41         }\r
42 \r
43         RenderForm::RenderForm( System::String^ text )\r
44         {\r
45                 Construct( text );\r
46         }\r
47 \r
48         void RenderForm::Construct( System::String^ text )\r
49         {\r
50                 Text = text;\r
51                 ClientSize = System::Drawing::Size( 800, 600 );\r
52                 MinimumSize = System::Drawing::Size( 200, 200 );\r
53 \r
54                 ResizeRedraw = true;\r
55                 SetStyle( ControlStyles::AllPaintingInWmPaint | ControlStyles::UserPaint, true );\r
56 \r
57                 Icon = SlimDX::Resources::BlackIcon;\r
58         }\r
59 \r
60         void RenderForm::OnResizeBegin( EventArgs^ e )\r
61         {\r
62                 Form::OnResizeBegin(e);\r
63 \r
64                 sizeMove = true;\r
65                 cachedSize = Size;\r
66                 OnPauseRendering(e);\r
67         }\r
68 \r
69         void RenderForm::OnResizeEnd( EventArgs^ e )\r
70         {\r
71                 Form::OnResizeEnd(e);\r
72 \r
73                 OnUserResized(e);\r
74                 UpdateScreen();\r
75 \r
76                 sizeMove = false;\r
77                 OnResumeRendering(e);\r
78         }\r
79 \r
80         void RenderForm::OnLoad( EventArgs^ e )\r
81         {\r
82                 Form::OnLoad(e);\r
83                 cachedSize = Size;\r
84                 UpdateScreen();\r
85         }\r
86 \r
87         void RenderForm::OnPaintBackground( PaintEventArgs^ e )\r
88         {\r
89                 SLIMDX_UNREFERENCED_PARAMETER( e );\r
90         }\r
91 \r
92         void RenderForm::OnPauseRendering(EventArgs^ e)\r
93         {\r
94                 if (&RenderForm::PauseRendering != nullptr)\r
95                         PauseRendering(this, e);\r
96         }\r
97 \r
98         void RenderForm::OnResumeRendering(EventArgs^ e)\r
99         {\r
100                 if (&RenderForm::ResumeRendering != nullptr)\r
101                         ResumeRendering(this, e);\r
102         }\r
103 \r
104         void RenderForm::OnUserResized(EventArgs^ e)\r
105         {\r
106                 if (&RenderForm::UserResized != nullptr)\r
107                         UserResized(this, e);\r
108         }\r
109 \r
110         void RenderForm::OnMonitorChanged(EventArgs^ e)\r
111         {\r
112                 if (&RenderForm::MonitorChanged != nullptr)\r
113                         MonitorChanged(this, e);\r
114         }\r
115 \r
116         void RenderForm::OnAppActivated(EventArgs^ e)\r
117         {\r
118                 if (&RenderForm::AppActivated != nullptr)\r
119                         AppActivated(this, e);\r
120         }\r
121 \r
122         void RenderForm::OnAppDeactivated(EventArgs^ e)\r
123         {\r
124                 if (&RenderForm::AppDeactivated != nullptr)\r
125                         AppDeactivated(this, e);\r
126         }\r
127 \r
128         void RenderForm::OnSystemSuspend(EventArgs^ e)\r
129         {\r
130                 if (&RenderForm::SystemSuspend != nullptr)\r
131                         SystemSuspend(this, e);\r
132         }\r
133 \r
134         void RenderForm::OnSystemResume(EventArgs^ e)\r
135         {\r
136                 if (&RenderForm::SystemResume != nullptr)\r
137                         SystemResume(this, e);\r
138         }\r
139 \r
140         void RenderForm::OnScreensaver(CancelEventArgs^ e)\r
141         {\r
142                 if (&RenderForm::Screensaver != nullptr)\r
143                         Screensaver(this, e);\r
144         }\r
145 \r
146         void RenderForm::WndProc( Message% m )\r
147         {\r
148                 Int64 wparam = m.WParam.ToInt64();\r
149 \r
150                 if (m.Msg == WM_SIZE)\r
151                 {\r
152                         if (wparam == SIZE_MINIMIZED)\r
153                         {\r
154                                 minimized = true;\r
155                                 maximized = false;\r
156                                 OnPauseRendering(EventArgs::Empty);\r
157                         }\r
158                         else\r
159                         {\r
160                                 RECT rect;\r
161                                 GetClientRect(reinterpret_cast<HWND>(m.HWnd.ToPointer()), &rect);\r
162                                 if (rect.bottom - rect.top == 0)\r
163                                 {\r
164                                         // Rapidly clicking the task bar to minimize and restore a window\r
165                     // can cause a WM_SIZE message with SIZE_RESTORED when \r
166                     // the window has actually become minimized due to rapid change\r
167                     // so just ignore this message\r
168                                 }\r
169                                 else if (wparam == SIZE_MAXIMIZED)\r
170                                 {\r
171                                         if (minimized)\r
172                                                 OnResumeRendering(EventArgs::Empty);\r
173 \r
174                                         minimized = false;\r
175                                         maximized = true;\r
176 \r
177                                         OnUserResized(EventArgs::Empty);\r
178                                         UpdateScreen();\r
179                                 }\r
180                                 else if (wparam == SIZE_RESTORED)\r
181                                 {\r
182                                         if (minimized)\r
183                                                 OnResumeRendering(EventArgs::Empty);\r
184 \r
185                                         minimized = false;\r
186                                         maximized = false;\r
187 \r
188                                         if (!sizeMove && Size != cachedSize)\r
189                                         {\r
190                                                 OnUserResized(EventArgs::Empty);\r
191                                                 UpdateScreen();\r
192                                                 cachedSize = Size;\r
193                                         }\r
194                                 }\r
195                         }\r
196                 }\r
197                 else if (m.Msg == WM_ACTIVATEAPP)\r
198                 {\r
199                         if (wparam != 0)\r
200                                 OnAppActivated(EventArgs::Empty);\r
201                         else\r
202                                 OnAppDeactivated(EventArgs::Empty);\r
203                 }\r
204                 else if (m.Msg == WM_POWERBROADCAST)\r
205                 {\r
206                         if (wparam == PBT_APMQUERYSUSPEND)\r
207                         {\r
208                                 OnSystemSuspend(EventArgs::Empty);\r
209                                 m.Result = IntPtr(1);\r
210                                 return;\r
211                         }\r
212                         else if (wparam == PBT_APMRESUMESUSPEND)\r
213                         {\r
214                                 OnSystemResume(EventArgs::Empty);\r
215                                 m.Result = IntPtr(1);\r
216                                 return;\r
217                         }\r
218                 }\r
219                 else if (m.Msg == WM_MENUCHAR)\r
220                 {\r
221                         // A menu is active and the user presses a key that does not correspond to any mnemonic or accelerator key\r
222             // So just ignore and don't beep\r
223                         m.Result = IntPtr(MAKELRESULT(0, MNC_CLOSE));\r
224                         return;\r
225                 }\r
226                 else if (m.Msg == WM_SYSCOMMAND)\r
227                 {\r
228                         wparam &= 0xFFF0;\r
229                         if (wparam == SC_MONITORPOWER || wparam == SC_SCREENSAVE)\r
230                         {\r
231                                 CancelEventArgs^ e = gcnew CancelEventArgs();\r
232                                 OnScreensaver(e);\r
233                                 if (e->Cancel)\r
234                                 {\r
235                                         m.Result = IntPtr::Zero;\r
236                                         return;\r
237                                 }\r
238                         }\r
239                 }\r
240 \r
241                 Form::WndProc(m);\r
242         }\r
243 \r
244         void RenderForm::UpdateScreen()\r
245         {\r
246                 DisplayMonitor^ current = DisplayMonitor::FromWindow(Handle);\r
247                 if (monitor != nullptr && monitor->DeviceName != current->DeviceName)\r
248                 {\r
249                         monitor = current;\r
250                         OnMonitorChanged(EventArgs::Empty);\r
251                 }\r
252 \r
253                 monitor = current;\r
254         }\r
255 }\r
256 }