void SaveWindowRect(HWND hWnd)
{
	// Save position of active window
	if (!hWnd)
		return;

	WINDOWPLACEMENT wp;
	memset(&wp, 0, sizeof(WINDOWPLACEMENT));
	wp.length = sizeof(WINDOWPLACEMENT);

	if (GetWindowPlacement(hWnd, &wp))
	{
		// Only save window positions for "restored" and "maximized" states.
		// If window is closed while "minimized", we don't want it to open minimized
		// for next session, so don't update registry so it opens in previous state.
		if (wp.showCmd == SW_SHOWNORMAL || wp.showCmd == SW_SHOW || wp.showCmd == SW_MAXIMIZE)
		{
			RECT rect;
			if (GetWindowRect(hWnd, &rect))
			{
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_LEFT,   rect.left);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_TOP,    rect.top);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_WIDTH,  rect.right - rect.left);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_HEIGHT, rect.bottom - rect.top);
			}

			if (wp.showCmd == SW_MAXIMIZE)
			{
				// When window is maximized, we also store the "restore" size
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_RESTORE_LEFT,   wp.rcNormalPosition.left);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_RESTORE_TOP,    wp.rcNormalPosition.top);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_RESTORE_RIGHT,  wp.rcNormalPosition.right);
				WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_RESTORE_BOTTOM, wp.rcNormalPosition.bottom);
			}

			// Maximize is the only special case we handle
			WriteRegistryInt(PREF_WINPOS_FOLDER, PREF_SHOWSTATE,
							 (wp.showCmd == SW_MAXIMIZE) ? SW_MAXIMIZE : SW_SHOW);
		}
	}
}
void CAtmoRegistryConfig::SaveSettings() {
    // alle Variabel etc. in Registry speichern
    char regKeyName[100],valueName[32];
	WriteRegistryInt(configRootKey,"comport",this->m_Comport);

    WriteRegistryInt(configRootKey,"comport_1", m_Comports[0] );
    WriteRegistryInt(configRootKey,"comport_2", m_Comports[1] );
    WriteRegistryInt(configRootKey,"comport_3", m_Comports[2] );


    // don't destroy config in that case..
    if(m_eAtmoConnectionType != actNUL)
       WriteRegistryInt(configRootKey,"ConnectionType",(int)m_eAtmoConnectionType);

    WriteRegistryInt(configRootKey,"EffectMode",(int)m_eEffectMode);

	WriteRegistryInt(configRootKey,"WhiteAdjustment_Red",m_WhiteAdjustment_Red);
	WriteRegistryInt(configRootKey,"WhiteAdjustment_Green",m_WhiteAdjustment_Green);
	WriteRegistryInt(configRootKey,"WhiteAdjustment_Blue",m_WhiteAdjustment_Blue);
	WriteRegistryInt(configRootKey,"UseSoftwareWhiteAdj",(int)m_UseSoftwareWhiteAdj);

    
    WriteRegistryInt(configRootKey,"UsePerChWhiteAdj",(int)m_WhiteAdjPerChannel);

    sprintf(regKeyName,"%sWhiteAdjPerChannel\\",configRootKey);
    WriteRegistryInt(regKeyName,"count",(int)m_chWhiteAdj_Count);

    for(int i=0; (i<m_chWhiteAdj_Count) && m_chWhiteAdj_Red && m_chWhiteAdj_Blue && m_chWhiteAdj_Green; i++) 
    {
        sprintf(valueName,"red_%d",i);
        WriteRegistryInt(regKeyName, valueName, m_chWhiteAdj_Red[i] );

        sprintf(valueName,"green_%d",i);
        WriteRegistryInt(regKeyName, valueName, m_chWhiteAdj_Green[i] );

        sprintf(valueName,"blue_%d",i);
        WriteRegistryInt(regKeyName, valueName, m_chWhiteAdj_Blue[i] );
    }


    WriteRegistryInt(configRootKey,"ColorChanger_iSteps",this->m_ColorChanger_iSteps);
    WriteRegistryInt(configRootKey,"ColorChanger_iDelay",this->m_ColorChanger_iDelay);

    WriteRegistryInt(configRootKey,"LrColorChanger_iSteps",this->m_LrColorChanger_iSteps);
    WriteRegistryInt(configRootKey,"LrColorChanger_iDelay",this->m_LrColorChanger_iDelay);

    WriteRegistryInt(configRootKey,"StaticColor_Red",this->m_StaticColor_Red);
    WriteRegistryInt(configRootKey,"StaticColor_Green",this->m_StaticColor_Green);
    WriteRegistryInt(configRootKey,"StaticColor_Blue",this->m_StaticColor_Blue);

    WriteRegistryInt(configRootKey,"isSetShutdownColor",m_IsSetShutdownColor);
	WriteRegistryInt(configRootKey,"ShutdownColor_red",m_ShutdownColor_Red);
	WriteRegistryInt(configRootKey,"ShutdownColor_green",m_ShutdownColor_Green);
	WriteRegistryInt(configRootKey,"ShutdownColor_blue",m_ShutdownColor_Blue);

    WriteRegistryInt(configRootKey,"LiveViewFilterMode",(int)m_LiveViewFilterMode);
    WriteRegistryInt(configRootKey,"LiveViewFilter_PercentNew",m_LiveViewFilter_PercentNew);
    WriteRegistryInt(configRootKey,"LiveViewFilter_MeanLength",m_LiveViewFilter_MeanLength);
    WriteRegistryInt(configRootKey,"LiveViewFilter_MeanThreshold",m_LiveViewFilter_MeanThreshold);

    WriteRegistryInt(configRootKey,"LiveView_EdgeWeighting",m_LiveView_EdgeWeighting);
    WriteRegistryInt(configRootKey,"LiveView_RowsPerFrame",m_LiveView_RowsPerFrame);

    WriteRegistryInt(configRootKey,"LiveView_BrightCorrect",m_LiveView_BrightCorrect);
    WriteRegistryInt(configRootKey,"LiveView_DarknessLimit",m_LiveView_DarknessLimit);
    WriteRegistryInt(configRootKey,"LiveView_HueWinSize",m_LiveView_HueWinSize);
    WriteRegistryInt(configRootKey,"LiveView_SatWinSize",m_LiveView_SatWinSize);
    WriteRegistryInt(configRootKey,"LiveView_WidescreenMode",m_LiveView_WidescreenMode);

    WriteRegistryInt(configRootKey,"LiveView_HOverscanBorder",m_LiveView_HOverscanBorder);
    WriteRegistryInt(configRootKey,"LiveView_VOverscanBorder",m_LiveView_VOverscanBorder);
    WriteRegistryInt(configRootKey,"LiveView_DisplayNr",m_LiveView_DisplayNr);
    WriteRegistryInt(configRootKey,"LiveView_FrameDelay",m_LiveView_FrameDelay);
    WriteRegistryInt(configRootKey,"LiveView_GDI_FrameRate",m_LiveView_GDI_FrameRate);

    WriteRegistryInt(configRootKey,"ZonesTopCount",m_ZonesTopCount);
    WriteRegistryInt(configRootKey,"ZonesBottomCount",m_ZonesBottomCount);
    WriteRegistryInt(configRootKey,"ZonesLRCount",m_ZonesLRCount);
    WriteRegistryInt(configRootKey,"ZoneSummary",m_ZoneSummary);
    


    WriteRegistryInt(configRootKey,"Hardware_global_gamma",m_Hardware_global_gamma);
    WriteRegistryInt(configRootKey,"Hardware_global_contrast",m_Hardware_global_contrast);
    WriteRegistryInt(configRootKey,"Hardware_contrast_red",m_Hardware_contrast_red);
    WriteRegistryInt(configRootKey,"Hardware_contrast_green",m_Hardware_contrast_green);
    WriteRegistryInt(configRootKey,"Hardware_contrast_blue",m_Hardware_contrast_blue);
    WriteRegistryInt(configRootKey,"Hardware_gamma_red",m_Hardware_gamma_red);
    WriteRegistryInt(configRootKey,"Hardware_gamma_green",m_Hardware_gamma_green);
    WriteRegistryInt(configRootKey,"Hardware_gamma_blue",m_Hardware_gamma_blue);

    WriteRegistryInt(configRootKey,"Software_gamma_mode",(int)m_Software_gamma_mode);
    WriteRegistryInt(configRootKey,"Software_gamma_red",m_Software_gamma_red);
    WriteRegistryInt(configRootKey,"Software_gamma_green",m_Software_gamma_green);
    WriteRegistryInt(configRootKey,"Software_gamma_blue",m_Software_gamma_blue);
    WriteRegistryInt(configRootKey,"Software_gamma_global",m_Software_gamma_global);

    WriteRegistryString( configRootKey, "DMX_BaseChannels", m_DMX_BaseChannels );
    WriteRegistryInt(configRootKey,"DMX_RGB_Channels",m_DMX_RGB_Channels);
    WriteRegistryInt(configRootKey,"DMX_BaudrateIndex", m_DMX_BaudrateIndex );  

    WriteRegistryInt(configRootKey,"MoMo_Channels", m_MoMo_Channels );

    WriteRegistryInt(configRootKey,"Fnordlicht_Amount", m_Fnordlicht_Amount );

    WriteRegistryInt(configRootKey,"hAtmoClLeds", m_AtmoClLeds);

    WriteRegistryInt(configRootKey,"NumChannelAssignments",getNumChannelAssignments());
    WriteRegistryInt(configRootKey,"CurrentChannelAssignment",m_CurrentChannelAssignment);
    for(int i=1;i<10;i++) {
        CAtmoChannelAssignment *ta = this->m_ChannelAssignments[i];
        if(ta!=NULL) {
           sprintf(regKeyName,"%sChannelAssignment_%d\\",configRootKey,i);
           WriteRegistryString(regKeyName,"name", ta->getName() );
           WriteRegistryInt(regKeyName,"count", ta->getSize() );
           for(int c=0;c<ta->getSize();c++) {
               sprintf(valueName,"channel_%d",c);
               WriteRegistryInt(regKeyName,valueName,ta->getZoneIndex(c));
           }
        }
    }
}