2 * psychlops_widgets_Win32GL.cpp
3 * Psychlops Standard Library (Universal)
5 * Last Modified 2009/12/14 by Kenchi HOSOKAWA
6 * (C) 2009 Kenchi HOSOKAWA, Kazushi MARUYA and Takao SATO
11 #include "../../../core/ApplicationInterfaces/psychlops_code_exception.h"
\r
12 #include "../../win32/psychlops_app_tweak_Win32.h"
14 namespace Psychlops {
\r
22 void alert(std::string message)
\r
25 MessageBox( NULL, message.c_str(), "Notification", MB_OK );
\r
28 void alert(std::wstring message)
\r
31 MessageBoxW( NULL, message.c_str(), L"Notification", MB_OK );
\r
35 static TCHAR strFile[MAX_PATH] = "\0\0", strCustom[256] = TEXT("Beforefiles\0*.*\0\0");
\r
36 std::string getOpenFileName()
\r
38 Canvas *cnvs = dynamic_cast<Canvas*>(Drawable::prime);
\r
39 HWND handle = Psychlops::DebugTweakTool::getRawWindowHandle(*cnvs);
\r
41 OPENFILENAME *ofn = new OPENFILENAME;
\r
42 ZeroMemory(ofn, sizeof(OPENFILENAME));
\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
56 GetOpenFileName(ofn);
\r
57 //std::cout << CommDlgExtendedError();
\r
59 std::string result(ofn->lpstrFile);
\r
60 //std::string result;
\r
65 } /* <- namespace Dialog */
\r
71 CloseButton::CloseButton()
\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
79 void CloseButton::exitApp()
\r
81 if(AppState::shouldBeClose) exit(0);
\r
82 AppState::shouldBeClose = true;
\r
85 MinimizeButton::MinimizeButton(Canvas &target)
\r
90 Button::onClickP = &minimizeApp;
\r
91 label.font.weight = Font::bold;
\r
92 label.fill = Color::white;
\r
94 void MinimizeButton::minimizeApp(void *hwnd)
\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
103 TitleBar::TitleBar(Canvas &target)
\r
104 : mleft(Mouse::left), minimize(target)
\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
113 TitleBar& TitleBar::draw(Drawable &target)
\r
116 Canvas *cnvs = dynamic_cast<Canvas*>(&target);
\r
118 TRACKMOUSEEVENT eventTrack;
\r
121 HWND window = Psychlops::DebugTweakTool::getRawWindowHandle(*cnvs);
\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
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
155 cnvs->drawImage(*(Theme::current.button_back), area);
\r
156 cnvs->drawImage(*(Theme::current.horiz_grad), area);
\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
168 for(int i=0; i<movie.size(); i++) {
170 sprintf(buf, "snap%04d.png\0", i+1);
\r
171 movie[i]->save(directory+"/ScreenShots/"+buf);
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
177 ZeroMemory(&si,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
188 } /* <- namespace Widgets */
\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
197 for(int i=0; i<frames.size(); i++) {
199 sprintf(buf, "cap\\snap%04d.png\0", i+1);
\r
200 frames[i]->save(buf);
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
208 ZeroMemory(&si,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);
219 } /* <- namespace Psycholops */