00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <windows.h>
00020 #include "MyMenu.h"
00021 #include "resource.h"
00022 #include "systray.h"
00023 #include "valueEditor.h"
00024 #include "controlEngine.h"
00025 #include "communTools.h"
00026
00027 extern ControlEngine ce;
00028
00029 LRESULT WINAPI SysTrayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
00030 {
00031 static HICON hIcon;
00032 static NOTIFYICONDATA nid;
00033
00034 const UINT trayId = 1;
00035 const UINT WM_MYTRAY = WM_APP + 1;
00036
00037 HMENU hMenu;
00038 static CMyMenu menu;
00039 POINT pt;
00040
00041 switch(message)
00042 {
00043 case WM_MEASUREITEM: menu.MeasureItem((LPMEASUREITEMSTRUCT)lParam); return TRUE;
00044 case WM_DRAWITEM: menu.DrawItem((LPDRAWITEMSTRUCT)lParam); return TRUE;
00045 case WM_CREATE:
00046 hIcon = (HICON)LoadImage(
00047 ce.hInst,
00048 MAKEINTRESOURCE(IDI_ICON_SYSTRAY),
00049 IMAGE_ICON,
00050 GetSystemMetrics(SM_CXSMICON),
00051 GetSystemMetrics(SM_CYSMICON),
00052 0);
00053
00054 if (!hIcon) { ErrorMessage(TRUE, MB_ICONSTOP, NULL); return -1; }
00055
00056 ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
00057 nid.cbSize = sizeof(NOTIFYICONDATA);
00058 nid.hIcon = hIcon;
00059 nid.hWnd = hWnd;
00060 nid.uID = trayId;
00061 nid.uCallbackMessage = WM_MYTRAY;
00062 lstrcpy(nid.szTip, TEXT("3D Controls"));
00063 nid.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON;
00064 Shell_NotifyIcon(NIM_ADD, &nid);
00065 return 0;
00066
00067 case WM_QUIT:
00068 case WM_DESTROY:
00069 Shell_NotifyIcon(NIM_DELETE, &nid);
00070 PostQuitMessage(0);
00071 return 0;
00072
00073 case WM_MYTRAY:
00074 switch (lParam)
00075 {
00076 case WM_RBUTTONDOWN:
00077 hMenu = LoadMenu(ce.hInst,MAKEINTRESOURCE(IDC_MENU));
00078
00079 if(hMenu)
00080 {
00081 hMenu = GetSubMenu(hMenu, 0);
00082 menu = hMenu;
00083 menu.AddTitle(TITLE_NAME);
00084
00085 if(hMenu)
00086 {
00087
00088 GetCursorPos(&pt);
00089 SetForegroundWindow(hWnd);
00090 TrackPopupMenu(
00091 hMenu,
00092 TPM_RIGHTALIGN | TPM_VCENTERALIGN | TPM_RIGHTBUTTON,
00093 pt.x,pt.y,0,
00094 hWnd,NULL);
00095 }
00096 }
00097 else ErrorMessage(TRUE, MB_ICONEXCLAMATION, NULL);
00098 break;
00099
00100 case WM_LBUTTONDBLCLK:
00101 ShowWindow(CreateDialogParam(ce.hInst,MAKEINTRESOURCE(IDD_DEBUG_STRUCT),NULL,(DLGPROC)DebugStructProc,NULL),SW_SHOW);
00102 break;
00103 }
00104 return 0;
00105
00106 case WM_COMMAND:
00107 switch(LOWORD(wParam))
00108 {
00109 case ID_POPUP_DEBUGER:
00110 ShowWindow(CreateDialogParam(ce.hInst,MAKEINTRESOURCE(IDD_DEBUG_STRUCT),NULL,(DLGPROC)DebugStructProc,NULL),SW_SHOW);
00111 return 0;
00112
00113 case ID_POPUP_ABOUT:
00114 DialogBox(ce.hInst,MAKEINTRESOURCE(IDD_ABOUT),NULL,(DLGPROC)AboutProc);
00115 return 0;
00116
00117 case ID_POPUP_HELP:
00118 MyOpenBrowser(URL_3D_CONTROLS);
00119 return 0;
00120
00121 case ID_POPUP_CONFIG:
00122 DialogBox(ce.hInst,MAKEINTRESOURCE(IDD_CONFIG),NULL,(DLGPROC)ConfigProc);
00123 return 0;
00124
00125 case ID_POPUP_EXIT:
00126 PostMessage(hWnd, WM_CLOSE, 0, 0);
00127 return 0;
00128 }
00129 break;
00130 }
00131 return DefWindowProc(hWnd, message, wParam, lParam);
00132 }
00133
00134 LRESULT WINAPI AboutProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
00135 {
00136 switch (message)
00137 {
00138 case WM_INITDIALOG:
00139 {
00140 MyString title;
00141 title.Format("3D Controls v%s - Copyright 2003-2004",VERSION);
00142 Static_SetText(GetDlgItem(hWnd,IDC_STATIC_VERSION),title);
00143 }
00144 return TRUE;
00145
00146 case WM_COMMAND:
00147 switch (wParam)
00148 {
00149 case IDC_BUTTON_MAILME:
00150 MailTo(MAIL_ADRESS);
00151 return TRUE;
00152
00153 case IDC_BUTTON_URL:
00154 MyOpenBrowser(URL_3D_CONTROLS);
00155 return TRUE;
00156
00157 case IDC_BUTTON_FORUM:
00158 MyOpenBrowser(URL_FORUM);
00159 return TRUE;
00160
00161 case IDC_BUTTON_LICENCE:
00162 MyOpenBrowser(URL_LICENCE);
00163 return TRUE;
00164
00165 case IDOK:
00166 case IDCANCEL: EndDialog(hWnd, LOWORD(wParam)); return TRUE;
00167 }
00168 }
00169 return FALSE;
00170 }
00171
00172
00173 #define WM_REFRESH WM_USER+1973
00174 #define WM_REFRESH_EDIT WM_USER+1974
00175 #define WM_REFRESH_SPIN WM_USER+1975
00176 #define WM_READ_FROM_EDIT WM_USER+1976
00177
00178 BOOL SetSpinPos(HWND hWnd,int id,int pos)
00179 {
00180 return (BOOL)SendMessage(GetDlgItem(hWnd,id),UDM_SETPOS32,0,pos);
00181 }
00183 BOOL SetSpinRange(HWND hWnd,int id,int minPos,int maxPos,int delta)
00184 {
00185 return (BOOL)SendMessage(GetDlgItem (hWnd,id), UDM_SETRANGE32,minPos,maxPos);
00186 }
00187
00188 int GetSpinPos(HWND hWnd)
00189 {
00190 return (BOOL)SendMessage(hWnd,UDM_GETPOS32,0,0);
00191 }
00192
00193 LRESULT WINAPI ConfigProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
00194 {
00195 static char temp[1024];
00196 HWND hWndCtrl;
00197
00198
00199
00200 switch (message)
00201 {
00202 case WM_REFRESH_SPIN:
00203 SetSpinPos(hDlg,IDC_SPIN_FOG_START,(int)ce.fog.start);
00204 SetSpinPos(hDlg,IDC_SPIN_FOG_END,(int)ce.fog.end);
00205 SetSpinPos(hDlg,IDC_SPIN_FOG_DENSITY,(int)ce.fog.density);
00206 SetSpinPos(hDlg,IDC_SPIN_XSIZE,(int)ce.dxWin);
00207 SetSpinPos(hDlg,IDC_SPIN_YSIZE,(int)ce.dyWin);
00208 SetSpinPos(hDlg,IDC_SPIN_FRAMERATE,ce.refreshTime);
00209 SetSpinPos(hDlg,IDC_SPIN_CPU,ce.cpuLimit);
00210 return TRUE;
00211
00212 case WM_READ_FROM_EDIT:
00213 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_START),temp,1024);
00214 sscanf(temp,"%f",&ce.fog.start);
00215 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_END),temp,1024);
00216 sscanf(temp,"%f",&ce.fog.end);
00217 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_DENSITY),temp,1024);
00218 sscanf(temp,"%f",&ce.fog.density);
00219 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_FRAMERATE),temp,1024);
00220 sscanf(temp,"%d",&ce.timerRefresh);
00221 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_CPU),temp,1024);
00222 sscanf(temp,"%d",&ce.cpuLimit);
00223 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_XSIZE),temp,1024);
00224 sscanf(temp,"%d",&ce.dxWin);
00225 Edit_GetText(GetDlgItem(hDlg,IDC_RICHEDIT_YSIZE),temp,1024);
00226 sscanf(temp,"%d",&ce.dyWin);
00227 PostMessage(hDlg,WM_REFRESH_SPIN,NULL,NULL);
00228 return TRUE;
00229
00230 case WM_REFRESH_EDIT:
00231 sprintf(temp,"%.2f",ce.fog.start);
00232 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_START),temp);
00233 sprintf(temp,"%.2f",ce.fog.end);
00234 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_END),temp);
00235 sprintf(temp,"%.2f",ce.fog.density);
00236 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_FOG_DENSITY),temp);
00237 sprintf(temp,"%d",ce.timerRefresh);
00238 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_FRAMERATE),temp);
00239 sprintf(temp,"%d",ce.cpuLimit);
00240 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_CPU),temp);
00241 sprintf(temp,"%d",ce.dxWin);
00242 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_XSIZE),temp);
00243 sprintf(temp,"%d",ce.dyWin);
00244 Edit_SetText(GetDlgItem(hDlg,IDC_RICHEDIT_YSIZE),temp);
00245 return TRUE;
00246
00247 case WM_REFRESH:
00248 ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_COMBO_FOG_MODE),ce.fog.GetIndexMode());
00249 ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK),ce.polygonMode.back);
00250 ComboBox_SetCurSel(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT),ce.polygonMode.front);
00251 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT),Light::IsLighting());
00252 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT0),ce.lights[0].isEnable);
00253 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT1),ce.lights[1].isEnable);
00254 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT2),ce.lights[2].isEnable);
00255 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT0_MOVE),ce.lightsMove[0]);
00256 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT1_MOVE),ce.lightsMove[1]);
00257 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_LIGHT2_MOVE),ce.lightsMove[2]);
00258 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_BACKGROUND),ce.enableBackGround);
00259 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_FPS),ce.enableFPS);
00260 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_REPERE),ce.enableRepere);
00261 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_INERTIA),ce.enableInertia);
00262 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_MONITOR),ce.monitor.enable);
00263 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_LIGHT),ce.enableLightView);
00264 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_VIEW_REGION),ce.screenMain.region.enable);
00265 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_PICKING),ce.enablePicking);
00266 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_FOG),ce.fog.isEnable);
00267 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_TITLED),ce.screenMain.enableTitle);
00268 Button_SetCheck(GetDlgItem(hDlg,IDC_CHECK_INERTIA),ce.enableViewInertia);
00269 PostMessage(hDlg,WM_REFRESH_EDIT,NULL,NULL);
00270 return TRUE;
00271
00272 case WM_INITDIALOG:
00273 ce.screenConfig.hWnd=hDlg;
00274
00275 SetSpinRange(hDlg,IDC_SPIN_FOG_START,-10,10,1);
00276 SetSpinRange(hDlg,IDC_SPIN_FOG_END,-10,10,1);
00277 SetSpinRange(hDlg,IDC_SPIN_FOG_DENSITY,-10,10,1);
00278 SetSpinRange(hDlg,IDC_SPIN_XSIZE,50,1280,50);
00279 SetSpinRange(hDlg,IDC_SPIN_YSIZE,50,1280,50);
00280 SetSpinRange(hDlg,IDC_SPIN_FRAMERATE,0,200,5);
00281 SetSpinRange(hDlg,IDC_SPIN_CPU,10,100,10);
00282
00283
00284 ComboBox_ResetContent(GetDlgItem(hDlg,IDC_COMBO_FOG_MODE));
00285 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_FOG_MODE),"linear");
00286 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_FOG_MODE),"exp");
00287 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_FOG_MODE),"exp˛");
00288
00289 ComboBox_ResetContent(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT));
00290 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT),"fill");
00291 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT),"line");
00292 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT),"dot");
00293 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_FRONT),"nothing");
00294
00295 ComboBox_ResetContent(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK));
00296 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK),"fill");
00297 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK),"line");
00298 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK),"dot");
00299 ComboBox_AddString(GetDlgItem(hDlg,IDC_COMBO_POLYGONE_BACK),"nothing");
00300 PostMessage(hDlg,WM_REFRESH,NULL,NULL);
00301 PostMessage(hDlg,WM_REFRESH_SPIN,NULL,NULL);
00302
00303 return TRUE;
00304
00305 case WM_VSCROLL:
00306 case WM_HSCROLL:
00307 if ((int)LOWORD(wParam) == SB_THUMBPOSITION)
00308 {
00309 int num = GetSpinPos((HWND)lParam);
00310 switch (GetDlgCtrlID((HWND)lParam))
00311 {
00312 case IDC_SPIN_XSIZE: ce.dxWin = num; break;
00313 case IDC_SPIN_YSIZE: ce.dyWin = num; break;
00314 case IDC_SPIN_FRAMERATE: ce.refreshTime = num; break;
00315 case IDC_SPIN_CPU: ce.cpuLimit= num; break;
00316 case IDC_SPIN_FOG_START: ce.fog.start = (float)num; break;
00317 case IDC_SPIN_FOG_END: ce.fog.end = (float)num; break;
00318 case IDC_SPIN_FOG_DENSITY: ce.fog.density = (float)num; break;
00319 default: return FALSE;
00320 }
00321 PostMessage(hDlg,WM_REFRESH_EDIT,NULL,NULL);
00322 return TRUE;
00323 }
00324 break;
00325
00326 case WM_COMMAND:
00327 int id;
00328 id = LOWORD(wParam);
00329 hWndCtrl = GetDlgItem(hDlg,id);
00330 switch (id)
00331 {
00332
00333 case IDC_CHECK_LIGHT: Light::SetLighting(Button_GetCheck(hWndCtrl)); return TRUE;
00334 case IDC_CHECK_LIGHT0: ce.lights[0].isEnable=Button_GetCheck(hWndCtrl); return TRUE;
00335 case IDC_CHECK_LIGHT1: ce.lights[1].isEnable=Button_GetCheck(hWndCtrl); return TRUE;
00336 case IDC_CHECK_LIGHT2: ce.lights[2].isEnable=Button_GetCheck(hWndCtrl); return TRUE;
00337 case IDC_CHECK_LIGHT0_MOVE: ce.lightsMove[0]=Button_GetCheck(hWndCtrl); return TRUE;
00338 case IDC_CHECK_LIGHT1_MOVE: ce.lightsMove[1]=Button_GetCheck(hWndCtrl); return TRUE;
00339 case IDC_CHECK_LIGHT2_MOVE: ce.lightsMove[2]=Button_GetCheck(hWndCtrl); return TRUE;
00340
00341 case IDC_CHECK_VIEW_INERTIA: ce.enableViewInertia=Button_GetCheck(hWndCtrl); return TRUE;
00342 case IDC_CHECK_VIEW_BACKGROUND: ce.enableBackGround=Button_GetCheck(hWndCtrl); return TRUE;
00343 case IDC_CHECK_VIEW_FPS: ce.enableFPS=Button_GetCheck(hWndCtrl); return TRUE;
00344 case IDC_CHECK_VIEW_REPERE: ce.enableRepere=Button_GetCheck(hWndCtrl); return TRUE;
00345 case IDC_CHECK_VIEW_LIGHT: ce.enableLightView=Button_GetCheck(hWndCtrl); return TRUE;
00346 case IDC_CHECK_VIEW_REGION: ce.screenMain.region.enable=Button_GetCheck(hWndCtrl); return TRUE;
00347
00348 case IDC_CHECK_PICKING:ce.enablePicking=Button_GetCheck(hWndCtrl); return TRUE;
00349
00350
00351
00352 case IDC_CHECK_FOG: ce.fog.Enable(Button_GetCheck(hWndCtrl)); return TRUE;
00353 case IDC_RICHEDIT_FOG_START:
00354 case IDC_RICHEDIT_FOG_END:
00355 case IDC_RICHEDIT_FOG_DENSITY:
00356 PostMessage(hDlg,WM_READ_FROM_EDIT,NULL,NULL); return TRUE;
00357 case IDC_COMBO_FOG_MODE:
00358 return TRUE;
00359
00360 case IDC_COMBO_POLYGONE_FRONT:
00361 case IDC_COMBO_POLYGONE_BACK:
00362 return TRUE;
00363 case IDC_CHECK_TITLED: ce.screenMain.enableTitle=Button_GetCheck(hWndCtrl); ce.screenMain.Update(TRUE); return TRUE;
00364 case IDC_RADIO_FULLSCREEN: ce.screenMain.enableFullScreen=TRUE; ce.screenMain.Update(TRUE); return TRUE;
00365 case IDC_RADIO_CUSTOMSCREEN: ce.screenMain.enableFullScreen=FALSE; ce.screenMain.Update(TRUE); return TRUE;
00366 case IDC_RICHEDIT_XSIZE:
00367 case IDC_RICHEDIT_YSIZE:
00368 case IDC_RICHEDIT_FRAMERATE:
00369 case IDC_RICHEDIT_CPU:
00370 PostMessage(hDlg,WM_READ_FROM_EDIT,NULL,NULL); return TRUE;
00371 return TRUE;
00372
00373 case IDC_CHECK_INERTIA: ce.enableInertia=Button_GetCheck(hWndCtrl); return TRUE;
00374 case IDC_CHECK_MONITOR: ce.monitor.enable=Button_GetCheck(hWndCtrl); return TRUE;
00375
00376 case IDOK:
00377 case IDCANCEL:
00378 ce.screenConfig.hWnd=NULL;
00379 EndDialog(hDlg, LOWORD(wParam));
00380 return TRUE;
00381
00382 case IDC_BUTTON_DEFAULT:
00383 ce.lightsMove[0]=DEFAULT_LIGHT_MOVE0;
00384 ce.lightsMove[1]=DEFAULT_LIGHT_MOVE1;
00385 ce.lightsMove[2]=DEFAULT_LIGHT_MOVE2;
00386 ce.lights[0].isEnable=DEFAULT_LIGHT_ENABLE0;
00387 ce.lights[1].isEnable=DEFAULT_LIGHT_ENABLE1;
00388 ce.lights[2].isEnable=DEFAULT_LIGHT_ENABLE2;
00389
00390 ce.fog.isEnable=DEFAULT_FOG_ENABLE;
00391 ce.fog.start=DEFAULT_FOG_START;
00392 ce.fog.end=DEFAULT_FOG_END;
00393 ce.fog.density=DEFAULT_FOG_DENSITY;
00394 ce.fog.mode=DEFAULT_FOG_MODE;
00395
00396 ce.enableAntiAliasing=DEFAULT_ANTIALIASING;
00397 ce.enableRepere=DEFAULT_VIEW_REPERE;
00398 ce.enableLightView=DEFAULT_VIEW_LIGHT;
00399 ce.enablePicking=DEFAULT_PICKING;
00400 ce.enableDelta=DEFAULT_DELTA;
00401 ce.enableBackGround=DEFAULT_VIEW_BACKGROUND;
00402 ce.enableFPS=DEFAULT_VIEW_FPS;
00403 ce.enableInertia=DEFAULT_INERTIA;
00404 ce.monitor.enable=DEFAULT_MONITOR;
00405 ce.enableViewInertia=DEFAULT_VIEW_INERTIA;
00406
00407 ce.screenMain.enableFullScreen=DEFAULT_FULLSCREEN;
00408 ce.screenMain.enableTitle=DEFAULT_TITLED;
00409 ce.screenMain.region.enable=DEFAULT_VIEW_REGION;
00410
00411 ce.polygonMode.front=DEFAULT_POLYGON_FRONT;
00412 ce.polygonMode.back=DEFAULT_POLYGON_BACK;
00413
00414 ce.dxWin=DEFAULT_XSIZE;
00415 ce.dyWin=DEFAULT_YSIZE;
00416
00417 ce.refreshTime=DEFAULT_TIMER_REFRESH;
00418 ce.cpuLimit=DEFAULT_CPU_LIMIT;
00419 PostMessage(hDlg,WM_REFRESH,NULL,NULL);
00420 PostMessage(hDlg,WM_REFRESH_SPIN,NULL,NULL);
00421 return TRUE;
00422 }
00423 }
00424 return FALSE;
00425 }