Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

275 lines
6.4 KiB

/*
* Copyright (c) 1996 1997, 1998 Philips CE I&C
*
* FILE PRPCTRL.CPP
* DATE 7-1-97
* VERSION 1.00
* AUTHOR M.J. Verberne
* DESCRIPTION Handle controls associated with
* properties
* HISTORY
*/
#include <windows.h>
#include <winioctl.h>
#include <ks.h>
#include <ksmedia.h>
#include <commctrl.h>
#include "prpcom.h"
#include "debug.h"
#include "phvcmext.h"
#include "prpctrl.h"
/*======================== LOCAL FUNCTION DEFINITIONS ====================*/
static void PRPCTRL_ScaleToPercent(LONG *plValue, LONG lMin, LONG lMax);
/*======================== EXPORTED FUNCTIONS =============================*/
/*-------------------------------------------------------------------------*/
BOOL PRPCTRL_Init(
HWND hDlg,
PRPCTRL_INFO *pCtrl,
BOOL bEnable)
/*-------------------------------------------------------------------------*/
{
BOOL bResult = TRUE;
PVFWEXT_INFO pVfWExtInfo = (PVFWEXT_INFO) GetWindowLongPtr(hDlg, DWLP_USER);
// check control
if (!pCtrl->PrpCtrl)
return FALSE;
// get and set the ranges for slider controls
if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_SLIDER)
{
// preinit min and max for savety reasons
pCtrl->lMin = 0;
pCtrl->lMax = 0;
// get property range
bResult = PRPCOM_Get_Range(
pCtrl->PropertySet,
pCtrl->ulPropertyId,
pVfWExtInfo->pfnDeviceIoControl,
pVfWExtInfo->lParam,
&pCtrl->lMin, &pCtrl->lMax);
if (!bResult)
return FALSE;
// check ranges
if (pCtrl->lMin > pCtrl->lMax)
return FALSE;
// set property range
SendMessage(
GetDlgItem(hDlg, pCtrl->PrpCtrl),
TBM_SETRANGE, TRUE, MAKELONG(pCtrl->lMin, pCtrl->lMax));
// set the thick marks
SendMessage(
GetDlgItem(hDlg, pCtrl->PrpCtrl),
TBM_SETTICFREQ, (WPARAM) ((pCtrl->lMax - pCtrl->lMin) / 10), (LPARAM) 0);
}
else if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_CHECKBOX)
{
// already filled in by user
}
else
return FALSE;
// update actual state
bResult = PRPCTRL_Enable(hDlg, pCtrl, bEnable);
return bResult;
}
/*-------------------------------------------------------------------------*/
BOOL PRPCTRL_Enable(
HWND hDlg,
PRPCTRL_INFO *pCtrl,
BOOL bEnable)
/*-------------------------------------------------------------------------*/
{
LONG lValue;
BOOL bResult = TRUE;
PVFWEXT_INFO pVfWExtInfo = (PVFWEXT_INFO) GetWindowLongPtr(hDlg, DWLP_USER);
// check control
if (!pCtrl->PrpCtrl)
return FALSE;
// get value if enable
if (bEnable)
{
// get value of the control
bResult = PRPCOM_Get_Value(
pCtrl->PropertySet,
pCtrl->ulPropertyId,
pVfWExtInfo->pfnDeviceIoControl,
pVfWExtInfo->lParam,
&lValue);
if (!bResult)
return FALSE;
// bring it into range of slider
if (lValue < pCtrl->lMin)
lValue = pCtrl->lMin;
else if (lValue > pCtrl->lMax)
lValue = pCtrl->lMax;
// adjust if reverse
if (pCtrl->bReverse)
{
lValue = pCtrl->lMin + pCtrl->lMax - lValue;
}
if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_SLIDER)
{
// update slider pos
SendMessage(
GetDlgItem(hDlg, pCtrl->PrpCtrl),
TBM_SETPOS, TRUE, (LPARAM)(LONG) lValue);
}
else if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_CHECKBOX)
{
// update checkbox state
SendMessage(GetDlgItem(hDlg, pCtrl->PrpCtrl), BM_SETCHECK, lValue, 0);
}
else
return FALSE;
// update buddy
if (pCtrl->BuddyCtrl)
{
if (pCtrl->BuddyStrings != NULL)
{
SetDlgItemText(hDlg, pCtrl->BuddyCtrl, pCtrl->BuddyStrings[lValue]);
}
else
{
PRPCTRL_ScaleToPercent(&lValue, pCtrl->lMin, pCtrl->lMax);
SetDlgItemInt(hDlg, pCtrl->BuddyCtrl, lValue, FALSE);
}
}
}
else
{
if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_SLIDER)
{
// set the thumb to the middle of the slider
lValue = pCtrl->lMin + (pCtrl->lMax - pCtrl->lMin) / 2;
SendMessage(
GetDlgItem(hDlg, pCtrl->PrpCtrl),
TBM_SETPOS, TRUE, (LPARAM)(LONG) lValue);
}
// clear the buddy
if (pCtrl->BuddyCtrl)
SetDlgItemText(hDlg, pCtrl->BuddyCtrl, "");
}
// enable / disable controls.
EnableWindow(GetDlgItem(hDlg, pCtrl->PrpCtrl), bEnable);
if (pCtrl->BuddyCtrl)
EnableWindow(GetDlgItem(hDlg, pCtrl->BuddyCtrl), bEnable);
if (pCtrl->TextCtrl)
EnableWindow(GetDlgItem(hDlg, pCtrl->TextCtrl), bEnable);
return bResult;
}
/*-------------------------------------------------------------------------*/
BOOL PRPCTRL_Handle_Msg(
HWND hDlg,
PRPCTRL_INFO *pCtrl)
/*-------------------------------------------------------------------------*/
{
LONG lValue, lPos;
BOOL bResult;
PVFWEXT_INFO pVfWExtInfo = (PVFWEXT_INFO) GetWindowLongPtr(hDlg, DWLP_USER);
if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_SLIDER)
{
// get position of slider
lPos = (LONG)SendMessage(
GetDlgItem(hDlg, pCtrl->PrpCtrl),
TBM_GETPOS, (WPARAM) 0, (LPARAM) 0);
// bring it into range of slider
if (lPos < pCtrl->lMin)
lPos = pCtrl->lMin;
else if (lPos > pCtrl->lMax)
lPos = pCtrl->lMax;
}
else if (pCtrl->PrpCtrlType == PRPCTRL_TYPE_CHECKBOX)
{
// get state of checkbox
if (SendMessage(GetDlgItem(hDlg, pCtrl->PrpCtrl),
BM_GETCHECK, 0, 0) == BST_CHECKED)
lPos = pCtrl->lMax;
else
lPos = pCtrl->lMin;
}
else
return FALSE;
// reverse if needed
if (pCtrl->bReverse)
lValue = pCtrl->lMin + pCtrl->lMax - lPos;
else
lValue = lPos;
// Set value of property
bResult = PRPCOM_Set_Value(
pCtrl->PropertySet,
pCtrl->ulPropertyId,
pVfWExtInfo->pfnDeviceIoControl,
pVfWExtInfo->lParam,
lValue);
if (!bResult)
return FALSE;
// update buddy
if (pCtrl->BuddyCtrl)
{
if (pCtrl->BuddyStrings != NULL)
{
SetDlgItemText(hDlg, pCtrl->BuddyCtrl, pCtrl->BuddyStrings[lPos]);
}
else
{
PRPCTRL_ScaleToPercent(&lPos, pCtrl->lMin, pCtrl->lMax);
SetDlgItemInt(hDlg, pCtrl->BuddyCtrl, lPos, FALSE);
}
}
return TRUE;
}
/*-------------------------------------------------------------------------*/
static void PRPCTRL_ScaleToPercent(LONG *plValue, LONG lMin, LONG lMax)
/*-------------------------------------------------------------------------*/
{
// validate
if (lMin >= lMax)
{
(*plValue) = lMin;
return;
}
// check borders
if ((*plValue) < lMin)
{
(*plValue) = 0;
return;
}
if ((*plValue) > lMax)
{
(*plValue) = 10000;
return;
}
(*plValue) = (((*plValue) - lMin) * 100) / (lMax - lMin);
}