#include "main.h"
CONFIG Config;
HINSTANCE hInstance;
HWND hMainWnd;
char DecimalChar;
bool CONFIG::Load() {
HKEY key;
bool ret=false;
if (!RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\h#s\\o1"),0,KEY_QUERY_VALUE,&key)) {
DWORD len=sizeof(*this);
ret= !RegQueryValueEx(key,TEXT("config"),0,0,(byte*)this,&len) && len==sizeof(*this);
RegCloseKey(key);
}
return ret;
}
bool CONFIG::Save() {
HKEY key;
DWORD dispo;
bool ret=false;
if (!RegCreateKeyEx(HKEY_CURRENT_USER,TEXT("Software\\h#s\\o1"),0,0,0,KEY_WRITE,0,&key,&dispo)) {
if (dispo==REG_CREATED_NEW_KEY) {
TCHAR buf[64];
int l=GetWindowText(hMainWnd,buf,elemof(buf));
RegSetValueEx(key,0,0,REG_SZ,(byte*)buf,(l+1)*sizeof(TCHAR));
}
ret= !RegSetValueEx(key,TEXT("config"),0,REG_BINARY,(byte*)this,sizeof(*this));
RegCloseKey(key);
}
return ret;
}
static void repos(HDWP&wpi, HWND Wnd, HWND w, int dx, int dy, int cx, int cy) {
Rect r;
GetWindowRect(w,&r);
r.right-=r.left; r.bottom-=r.top;
ScreenToClient(Wnd,(POINT*)&r);
r.left+=dx; r.top+=dy; r.right+=cx; r.bottom+=cy;
wpi=DeferWindowPos(wpi,w,0,r.left,r.top,r.right,r.bottom,SWP_NOZORDER);
}
static void repos(HDWP&wpi, HWND Wnd, UINT id, int dx, int dy, int cx, int cy) {
repos(wpi,Wnd,GetDlgItem(Wnd,id),dx,dy,cx,cy);
}
static BOOL CALLBACK MainDlgProc(HWND Wnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static SIZE prevsize,minsize;
switch (msg) {
case WM_INITDIALOG: {
hMainWnd=Wnd;
TCHAR s[8];
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SDECIMAL,s,elemof(s));
WideCharToMultiByte(CP_ACP,0,s,1,&DecimalChar,1,0,0);
WINDOWPLACEMENT wp;
GetClientRect(Wnd,&wp.rcNormalPosition);
prevsize.cx=wp.rcNormalPosition.right-wp.rcNormalPosition.left;
prevsize.cy=wp.rcNormalPosition.bottom-wp.rcNormalPosition.top;
wp.length=sizeof wp;
GetWindowPlacement(Wnd,&wp);
minsize.cx=wp.rcNormalPosition.right-wp.rcNormalPosition.left;
minsize.cy=wp.rcNormalPosition.bottom-wp.rcNormalPosition.top;
if (Config.Load()) {
Config.WinPos.toRECT(wp.rcNormalPosition);
wp.showCmd=Config.show;
SetWindowPlacement(Wnd,&wp);
}else Config.HidNo=Config.rawview=0;
CheckRadioButton(Wnd,96,98,96+Config.rawview);
HIDDEV::ild.cbSize=sizeof(HIDDEV::ild);
SetupDiGetClassImageList(&HIDDEV::ild);
SendDlgItemMessage(Wnd,10,CBEM_SETIMAGELIST,0,(LPARAM)HIDDEV::ild.ImageList);
SendMessage(Wnd,WM_TIMER,1,0);
onEditInit(GetDlgItem(Wnd,12));
// PostMessage(Wnd,WM_COMMAND,MAKELONG(10,CBN_SELCHANGE),(LPARAM)GetDlgItem(Wnd,10));
CreateStatusWindow(WS_VISIBLE|WS_CHILD|SBARS_SIZEGRIP,TEXT("Status"),Wnd,3);
/*
const float data[]={10,0,0,10};
const PLOTDATA pd={
"Test",0xC4,0,{data}
};
*/ PLOT pd;
memset(&pd,0,sizeof pd);
pd.name="Ist";
// pd.unit="°C";
// pd.unitcode=0x00010001; // Kelvin
pd.lineWidth=2;
pd.sr.sx.f=regler.reportk.tr_ms/1000.0F;
pd.sr.sy.f=regler.reportk.T_mK/1000.0F;
pd.sr.typeY=1; // short
SendDlgItemMessage(Wnd,16,PM_SETPLOT,0,(LPARAM)&pd);
pd.name="Power";
// pd.unit="W";
// pd.unitcode=0x7000D121; // Watt (High-Nibble=Unit-Exponent)
pd.index=1;
pd.yscale=1;
pd.sr.sy.f=regler.reportk.P_mW/1000.0F;
// SendDlgItemMessage(Wnd,16,PM_SETPLOT,0,(LPARAM)&pd);
}return TRUE;
case WM_GETMINMAXINFO: {
MINMAXINFO*mmi=(MINMAXINFO*)lParam;
mmi->ptMinTrackSize.x=minsize.cx; // Pixel
mmi->ptMinTrackSize.y=minsize.cy;
}break;
case WM_SIZE: if (wParam!=SIZE_MINIMIZED) {
if (prevsize.cx) {
SIZE diff={GET_X_LPARAM(lParam)-prevsize.cx,GET_Y_LPARAM(lParam)-prevsize.cy};
HDWP wpi=BeginDeferWindowPos(50);
repos(wpi,Wnd,12,0,0,0,diff.cy); // TableEdit
repos(wpi,Wnd,16,0,0,diff.cx,diff.cy); // XY-Graf
for (HWND w=GetDlgItem(Wnd,96);;w=GetNextSibling(w)) {
repos(wpi,Wnd,w,0,diff.cy,0,0); // Anzeigen
if (GetWindowID(w)==63) break;
}
EndDeferWindowPos(wpi);
}
prevsize.cx=GET_X_LPARAM(lParam);
prevsize.cy=GET_Y_LPARAM(lParam);
SendDlgItemMessage(Wnd,3,msg,wParam,lParam); // Statuszeile
}break;
case WM_TIMER: switch (wParam) {
case 1: {
KillTimer(Wnd,wParam);
HWND cb=GetDlgItem(Wnd,10);
regler.Enum(cb,regler.mine);
//Unschön, aber da zumeist nur 0-1 Regler am PC hängt:
if (!ComboBox_GetCount(cb) || !regler.hDev) PostMessage(Wnd,WM_COMMAND,MAKELONG(10,CBN_SELCHANGE),(LPARAM)cb);
}break;
case 2: {
if (regler.getinput(1)) regler.onInputReport();
}break;
case 64:
case 66:
case 67:
case 68: KillTimer(Wnd,wParam);
if (GetFocus()==GetDlgItem(Wnd,wParam)) SetFocus(0);
regler.setValue(LOBYTE(wParam));
break;
}break;
case WM_COMMAND: switch (wParam) {
case MAKELONG(10,CBN_SELCHANGE): {
regler.Close();
KillTimer(Wnd,2);
EnableMenuItem(GetMenu(Wnd),16,MF_GRAYED);
EnableMenuItem(GetMenu(Wnd),17,MF_GRAYED);
EnableMenuItem(GetMenu(Wnd),99,MF_GRAYED);
int sel=ComboBox_GetCurSel((HWND)lParam);
if (sel>=0) {
regler.Open(sel,regler.mine);
if (regler.hDev && regler.getfeature(15)) {
memcpy(®ler.reportk,regler.report,sizeof regler.reportk);
EnableMenuItem(GetMenu(Wnd),16,MF_ENABLED);
EnableMenuItem(GetMenu(Wnd),17,MF_ENABLED);
EnableMenuItem(GetMenu(Wnd),99,MF_ENABLED);
onEditRevert(GetDlgItem(Wnd,12));
SetTimer(Wnd,2,250,0);
}
}
}break;
case 1: SetFocus(0); break;
case 2: EndDialog(Wnd,wParam); break;
case MAKELONG(12,EN_CHANGE): onEditChange((HWND)lParam); break;
case 56:
case 57: regler.setValue(LOBYTE(wParam)); break;
case MAKELONG(64,EN_CHANGE):
case MAKELONG(66,EN_CHANGE):
case MAKELONG(67,EN_CHANGE):
case MAKELONG(68,EN_CHANGE): SetTimer(Wnd,LOWORD(wParam),1000,0); break;
case 96:
case 97:
case 98: Config.rawview=GetRadioCheck(Wnd,96,98); break;
case 99: regler.report[0]=99; regler.report[1]=1; regler.setoutput(); break;
case 16: DialogBox(0,MAKEINTRESOURCE(16),Wnd,PidDlgProc); break;
}break;
case WM_DEVICECHANGE: {
SetTimer(Wnd,1,500,0);
}break;
case WM_CLOSE: {
regler.Close();
WINDOWPLACEMENT wp;
wp.length=sizeof wp;
GetWindowPlacement(Wnd,&wp);
Config.WinPos.fromRECT(wp.rcNormalPosition);
Config.show=(byte)wp.showCmd;
Config.Save();
}break;
case WM_DESTROY: {
SetupDiDestroyClassImageList(&HIDDEV::ild);
}break;
}
return FALSE;
}
void CALLBACK WinMainCRTStartup() {
InitCommonControls();
LoadLibrary(TEXT("riched20.dll"));
PlotInit();
TableInit();
ExitProcess(DialogBox(0,MAKEINTRESOURCE(1),0,MainDlgProc));
}
extern "C" int _fltused;
int _fltused;
Detected encoding: UTF-8 | 0
|