OSDN Git Service

first
[psychlops/cpp.git] / psychlops / platform / win32gl / extension / psychlops_widgets_win32gl.cpp
1 /*
2  *  psychlops_widgets_Win32GL.cpp
3  *  Psychlops Standard Library (Universal)
4  *
5  *  Last Modified 2009/12/14 by Kenchi HOSOKAWA
6  *  (C) 2009 Kenchi HOSOKAWA, Kazushi MARUYA and Takao SATO
7  */
8 \r
9 \r
10 #include <windows.h>
11 #include "../../../core/ApplicationInterfaces/psychlops_code_exception.h"\r
12 #include "../../win32/psychlops_app_tweak_Win32.h"
13
14 namespace Psychlops {\r
15 namespace Widgets {
16 \r
17 \r
18 \r
19 \r
20 namespace Dialog {\r
21 \r
22         void alert(std::string message)\r
23         {\r
24                 ShowCursor(true);\r
25                 MessageBox( NULL, message.c_str(), "Notification", MB_OK );\r
26                 ShowCursor(false);\r
27         }\r
28         void alert(std::wstring message)\r
29         {\r
30                 ShowCursor(true);\r
31                 MessageBoxW( NULL, message.c_str(), L"Notification", MB_OK );\r
32                 ShowCursor(false);\r
33         }\r
34 \r
35 static TCHAR strFile[MAX_PATH] = "\0\0", strCustom[256] = TEXT("Beforefiles\0*.*\0\0");\r
36         std::string getOpenFileName()\r
37         {\r
38                 Canvas *cnvs = dynamic_cast<Canvas*>(Drawable::prime);\r
39                 HWND handle = Psychlops::DebugTweakTool::getRawWindowHandle(*cnvs);\r
40 \r
41                 OPENFILENAME *ofn = new OPENFILENAME;\r
42                 ZeroMemory(ofn, sizeof(OPENFILENAME));\r
43 \r
44                 ofn->lStructSize = sizeof(OPENFILENAME);\r
45                 ofn->hwndOwner = handle;\r
46                 ofn->lpstrFilter =  //TEXT("Text files {*.txt}\0*.txt\0")\r
47                                                         TEXT("All files {*.*}\0*.*\0\0");\r
48                 ofn->lpstrCustomFilter = NULL;//strCustom;\r
49                 ofn->nMaxCustFilter = 256;\r
50                 ofn->nFilterIndex = 0;\r
51                 ofn->lpstrFile = strFile;\r
52                 ofn->nMaxFile = MAX_PATH;\r
53                 ofn->Flags = OFN_FILEMUSTEXIST;\r
54 \r
55                 ShowCursor(true);\r
56                 GetOpenFileName(ofn);\r
57                 //std::cout << CommDlgExtendedError();\r
58                 ShowCursor(false);\r
59                 std::string result(ofn->lpstrFile);\r
60                 //std::string result;\r
61                 delete ofn;\r
62                 return result;\r
63         }\r
64 \r
65 }       /*      <- namespace Dialog     */\r
66 \r
67 \r
68 \r
69 \r
70 \r
71         CloseButton::CloseButton()\r
72         : Button(L"X", 20)\r
73         {\r
74                 theme_type = Widgets::Theme::ALERT;\r
75                 Button::onClick = &exitApp;\r
76                 label.font.weight = Font::bold;\r
77                 label.fill = Color::white;\r
78         }\r
79         void CloseButton::exitApp()\r
80         {\r
81                 if(AppState::shouldBeClose) exit(0);\r
82                 AppState::shouldBeClose = true;\r
83         }\r
84 \r
85         MinimizeButton::MinimizeButton(Canvas &target)\r
86         : Button(L"-", 20)\r
87         {\r
88                 window = &target;\r
89                 arg = this;\r
90                 Button::onClickP = &minimizeApp;\r
91                 label.font.weight = Font::bold;\r
92                 label.fill = Color::white;\r
93         }\r
94         void MinimizeButton::minimizeApp(void *hwnd)\r
95         {\r
96                 MinimizeButton *button = (MinimizeButton*)(hwnd);\r
97                 button->pushed_ = false;\r
98                 HWND window = Psychlops::DebugTweakTool::getRawWindowHandle(*(button->window));\r
99                 ShowWindow( window, SW_MINIMIZE );\r
100         }\r
101 \r
102 \r
103         TitleBar::TitleBar(Canvas &target)\r
104         : mleft(Mouse::left), minimize(target)\r
105         {\r
106 Theme::initialize();\r
107                 area.set(target.getWidth()-85, 20);\r
108                 area.fill = Color::white;\r
109                 close.area.set(50, 20).setDatum(Point(target.getWidth()-55, 0));\r
110                 minimize.area.set(30, 20).setDatum(Point(target.getWidth()-85, 0));\r
111                 dragged_ = false;\r
112         }\r
113         TitleBar& TitleBar::draw(Drawable &target)\r
114         {\r
115                 /*\r
116                 Canvas *cnvs = dynamic_cast<Canvas*>(&target);\r
117                 ::RECT rect;\r
118                 TRACKMOUSEEVENT eventTrack;\r
119 \r
120                 if(cnvs!=0) {\r
121                         HWND window = Psychlops::DebugTweakTool::getRawWindowHandle(*cnvs);\r
122                         ::POINT mousept;\r
123                         if(mleft.pushed()) {\r
124                                 if(area.include(Mouse::position)) {\r
125                                         GetWindowRect(window, &rect);\r
126                                         begin_w.set(rect.left, rect.top);\r
127                                         begin_w_size.set(rect.right - rect.left, rect.bottom - rect.top);\r
128                                         begin_m = Mouse::uniPosition;\r
129                                         GetCursorPos(&mousept);\r
130                                                 eventTrack.cbSize = sizeof(TRACKMOUSEEVENT);\r
131                                                 eventTrack.dwFlags = TME_LEAVE;\r
132                                                 eventTrack.hwndTrack = window;\r
133                                                 eventTrack.dwHoverTime = 100;\r
134                                                 TrackMouseEvent(&eventTrack);\r
135                                         DragDetect( window, mousept );\r
136                                         //ClipCursor( rect );\r
137                                         dragged_=true;\r
138                                 }\r
139                         } else if(mleft.pressed() && dragged_) {\r
140                                 GetWindowRect(window, &rect);\r
141                                 Point p = (Point)Mouse::uniPosition - begin_m, np = p + begin_w;\r
142                                 MoveWindow(window, np.x, np.y, begin_w_size.x, begin_w_size.y, false);\r
143                                                 eventTrack.cbSize = sizeof(TRACKMOUSEEVENT);\r
144                                                 eventTrack.dwFlags = TME_LEAVE;\r
145                                                 eventTrack.hwndTrack = window;\r
146                                                 eventTrack.dwHoverTime = 100;\r
147                                                 TrackMouseEvent(&eventTrack);\r
148                                 //GetCursorPos(&mousept);\r
149                                 //DragDetect( window, mousept );\r
150                                 //ClipCursor( rect );\r
151                         } else if(mleft.released()) {\r
152                                 //ClipCursor( NULL );\r
153                                 dragged_ = false;\r
154                         }\r
155                         cnvs->drawImage(*(Theme::current.button_back), area);\r
156                         cnvs->drawImage(*(Theme::current.horiz_grad), area);\r
157                 }\r
158                 */\r
159                 minimize.draw();\r
160                 close.draw();\r
161                 return *this;\r
162         }\r
163 \r
164         std::string SequentialScreenshot::bin_path = "C:\\Library\\Frameworks\\Psychlops.framework\\bin\\fmpeg.exe ";\r
165         const SequentialScreenshot& SequentialScreenshot::save(std::string filename) {\r
166                 std::stringstream command;\r
167                 char buf[256];
168                 for(int i=0; i<movie.size(); i++) {
169                         memset(buf, 0, 256);
170                         sprintf(buf, "snap%04d.png\0", i+1);\r
171                         movie[i]->save(directory+"/ScreenShots/"+buf);
172                 }\r
173                 command << bin_path << " -r 60 -y -i cap\\cap%04d.png -vcodec msmpeg4 " << filename;
174                 const char *lpArg = command.str().c_str();\r
175                 PROCESS_INFORMATION pi;\r
176                 STARTUPINFO si;\r
177                 ZeroMemory(&si,sizeof(si));\r
178                 si.cb=sizeof(si);\r
179                 CreateProcess(NULL,(LPTSTR)lpArg,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si, &pi);\r
180                 CloseHandle(pi.hThread);\r
181                 WaitForSingleObject(pi.hProcess,INFINITE);\r
182                 CloseHandle(pi.hProcess);\r
183                 clear();
184                 saved = true;
185                 return *this;
186         }
187 \r
188 }       /*      <- namespace Widgets    */\r
189 \r
190 \r
191         /*\r
192         std::string Figures::Movie::bin_path = "C:\\Library\\Frameworks\\Psychlops.framework\\bin\\ffmpeg.exe ";\r
193         const Figures::Movie& Figures::Movie::save(std::string filename) {\r
194                 std::string app_ = File::decodePath("%APP%");\r
195                 std::stringstream command;\r
196                 char buf[256];
197                 for(int i=0; i<frames.size(); i++) {
198                         memset(buf, 0, 256);
199                         sprintf(buf, "cap\\snap%04d.png\0", i+1);\r
200                         frames[i]->save(buf);
201                 }\r
202                 command.str("");\r
203                 command << bin_path << " -i \"cap/snap%04d.png\" -loop_output 0 -pix_fmt rgb24 \"" << filename << "\"";\r
204                 std::cout << command.str();
205                 const char *lpArg = command.str().c_str();\r
206                 PROCESS_INFORMATION pi;\r
207                 STARTUPINFO si;\r
208                 ZeroMemory(&si,sizeof(si));\r
209                 si.cb=sizeof(si);\r
210                 CreateProcess(NULL,(LPTSTR)lpArg,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si, &pi);\r
211                 CloseHandle(pi.hThread);\r
212                 WaitForSingleObject(pi.hProcess,INFINITE);\r
213                 CloseHandle(pi.hProcess);
214                 return *this;
215         }\r
216         */
217 \r
218
219 }       /*      <- namespace Psycholops         */