mirror of https://github.com/tongzx/nt5src
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.
512 lines
13 KiB
512 lines
13 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tabletpc.c
|
|
|
|
Abstract: Tablet PC Control Panel applet main module.
|
|
|
|
Environment:
|
|
|
|
User mode
|
|
|
|
Author:
|
|
|
|
Michael Tsang (MikeTs) 20-Apr-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pch.h"
|
|
|
|
HINSTANCE ghInstance = NULL;
|
|
RPC_BINDING_HANDLE ghBinding = NULL;
|
|
#ifdef SYSACC
|
|
HANDLE ghSysAcc = INVALID_HANDLE_VALUE;
|
|
HFONT ghFont = NULL;
|
|
#endif
|
|
TCHAR gtszTitle[64] = {0};
|
|
|
|
UINT uHelpMessage = 0;
|
|
TABLETPC_PROPPAGE TabletPCPropPages[] =
|
|
{
|
|
#ifdef PENPAGE
|
|
MAKEINTRESOURCE(IDD_MUTOHPEN), MutohPenDlgProc, 0,
|
|
#endif
|
|
#ifdef BUTTONPAGE
|
|
MAKEINTRESOURCE(IDD_BUTTONS), ButtonsDlgProc, 0,
|
|
#endif
|
|
MAKEINTRESOURCE(IDD_DISPLAY), DisplayDlgProc, 0,
|
|
MAKEINTRESOURCE(IDD_GESTURE), GestureDlgProc, 0,
|
|
#ifdef DEBUG
|
|
MAKEINTRESOURCE(IDD_TUNING), TuningDlgProc, 0,
|
|
#endif
|
|
#ifdef BATTINFO
|
|
MAKEINTRESOURCE(IDD_BATTERY), BatteryDlgProc, 0,
|
|
#endif
|
|
#ifdef CHGRINFO
|
|
MAKEINTRESOURCE(IDD_CHARGER), ChargerDlgProc, 0,
|
|
#endif
|
|
#ifdef TMPINFO
|
|
MAKEINTRESOURCE(IDD_TEMPERATURE), TemperatureDlgProc, 0,
|
|
#endif
|
|
0, NULL, 0
|
|
};
|
|
#define MAX_PAGES (sizeof(TabletPCPropPages)/sizeof(TABLETPC_PROPPAGE))
|
|
|
|
/*++
|
|
@doc EXTERNAL
|
|
|
|
@func BOOL | DllInitialize |
|
|
Library entry point.
|
|
|
|
@parm IN HINSTANCE | hDLLInstance | Instance handle.
|
|
@parm IN DWORD | dwReason | Reason being called.
|
|
@parm IN LPVOID | lpvReserved | Reserved (Unused).
|
|
|
|
@rvalue SUCCESS | always returns TRUE
|
|
--*/
|
|
|
|
BOOL WINAPI
|
|
DllInitialize(
|
|
IN HINSTANCE hDLLInstance,
|
|
IN DWORD dwReason,
|
|
IN LPVOID lpvReserved OPTIONAL
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(lpvReserved);
|
|
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
ghInstance = hDLLInstance;
|
|
LoadString(ghInstance,
|
|
IDS_TITLE,
|
|
gtszTitle,
|
|
sizeof(gtszTitle)/sizeof(TCHAR));
|
|
DisableThreadLibraryCalls(ghInstance);
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
} //DllInitialize
|
|
|
|
/*++
|
|
@doc EXTERNAL
|
|
|
|
@func LONG | CPlApplet |
|
|
Library-defined callback function that serves as the entry point
|
|
for a Control Panel application.
|
|
|
|
@parm IN HHWN | hwnd | Main window handle.
|
|
@parm IN UINT | uMsg | Message.
|
|
@parm IN LONG | lParam1 | Message specific parameter 1.
|
|
@parm IN LONG | lParam2 | Message specific parameter 2.
|
|
|
|
@rvalue Return value depends on the message.
|
|
--*/
|
|
|
|
LONG APIENTRY
|
|
CPlApplet(
|
|
IN HWND hwnd,
|
|
IN UINT uMsg,
|
|
IN LONG lParam1,
|
|
IN LONG lParam2
|
|
)
|
|
{
|
|
TRACEPROC("CPlApplet", 1)
|
|
LONG rc = 0;
|
|
|
|
TRACEENTER(("(hwnd=%p,Msg=%s,Param1=%x,Param2=%x)\n",
|
|
hwnd, LookupName(uMsg, CPLMsgNames), lParam1, lParam2));
|
|
|
|
switch (uMsg)
|
|
{
|
|
case CPL_INIT:
|
|
TRACEINIT(MODNAME, 0, 0);
|
|
uHelpMessage = RegisterWindowMessage(TEXT("ShellHelp"));
|
|
rc = (LONG)TRUE;
|
|
break;
|
|
|
|
case CPL_GETCOUNT:
|
|
rc = 1;
|
|
break;
|
|
|
|
case CPL_INQUIRE:
|
|
{
|
|
LPCPLINFO CPLInfo = (LPCPLINFO)lParam2;
|
|
|
|
CPLInfo->idIcon = IDI_TABLETPC;
|
|
CPLInfo->idName = IDS_NAME;
|
|
CPLInfo->idInfo = IDS_INFO;
|
|
CPLInfo->lData = 0;
|
|
rc = (LONG)TRUE;
|
|
break;
|
|
}
|
|
|
|
case CPL_NEWINQUIRE:
|
|
{
|
|
LPNEWCPLINFO NewCPLInfo = (LPNEWCPLINFO)lParam2;
|
|
|
|
memset(NewCPLInfo, 0, sizeof(NEWCPLINFO));
|
|
NewCPLInfo->dwSize = sizeof(NEWCPLINFO);
|
|
NewCPLInfo->hIcon = LoadIcon(ghInstance,
|
|
MAKEINTRESOURCE(IDI_TABLETPC));
|
|
LoadString(ghInstance,
|
|
IDS_NAME,
|
|
NewCPLInfo->szName,
|
|
sizeof(NewCPLInfo->szName)/sizeof(TCHAR));
|
|
LoadString(ghInstance,
|
|
IDS_INFO,
|
|
NewCPLInfo->szInfo,
|
|
sizeof(NewCPLInfo->szInfo)/sizeof(TCHAR));
|
|
lstrcpy(NewCPLInfo->szHelpFile, TEXT(""));
|
|
rc = (LONG)TRUE;
|
|
break;
|
|
}
|
|
|
|
case CPL_DBLCLK:
|
|
lParam2 = 0L;
|
|
//
|
|
// Fall through ...
|
|
//
|
|
case CPL_STARTWPARMS:
|
|
{
|
|
HWND hwndMe;
|
|
|
|
if (!(gtszTitle[0]))
|
|
{
|
|
LoadString(ghInstance,
|
|
IDS_TITLE,
|
|
gtszTitle,
|
|
sizeof(gtszTitle)/sizeof(TCHAR));
|
|
}
|
|
hwndMe = FindWindow(TEXT("#32770"), gtszTitle);
|
|
if (hwndMe != NULL)
|
|
{
|
|
//
|
|
// We found another copy running, let's just switch focus to it.
|
|
//
|
|
SetForegroundWindow(hwndMe);
|
|
}
|
|
else
|
|
{
|
|
rc = RunApplet(hwnd, (LPTSTR)lParam2);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case CPL_STOP:
|
|
break;
|
|
|
|
case CPL_EXIT:
|
|
#ifdef SYSACC
|
|
if (ghSysAcc != INVALID_HANDLE_VALUE)
|
|
{
|
|
CloseHandle(ghSysAcc);
|
|
ghSysAcc = INVALID_HANDLE_VALUE;
|
|
}
|
|
#endif
|
|
TRACETERMINATE();
|
|
break;
|
|
}
|
|
|
|
TRACEEXIT(("=%d\n", rc));
|
|
return rc;
|
|
} //CPlApplet
|
|
|
|
/*++
|
|
@doc INTERNAL
|
|
|
|
@func VOID | RunApplet |
|
|
The applet has been invoked.
|
|
|
|
@parm IN HHWN | hwnd | Main window handle.
|
|
@parm IN LPTSTR | CmdLine | Supplies the command line used to
|
|
invoke the applet.
|
|
|
|
@rvalue SUCCESS | Returns TRUE.
|
|
@rvalue FAILURE | Returns FALSE.
|
|
--*/
|
|
|
|
BOOL
|
|
RunApplet(
|
|
IN HWND hwnd,
|
|
IN LPTSTR CmdLine OPTIONAL
|
|
)
|
|
{
|
|
TRACEPROC("RunApplet", 1)
|
|
BOOL rc = FALSE;
|
|
RPC_STATUS status;
|
|
unsigned char *StringBinding;
|
|
|
|
TRACEENTER(("(hwnd=%p,CmdLine=%s)\n", hwnd, CmdLine? CmdLine: "NULL"));
|
|
|
|
if ((status = RpcStringBindingCompose(NULL,
|
|
TEXT("ncalrpc"),
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&StringBinding)) != RPC_S_OK)
|
|
{
|
|
ErrorMsg(IDSERR_STRING_BINDING, status);
|
|
}
|
|
else if ((status = RpcBindingFromStringBinding(StringBinding, &ghBinding))
|
|
!= RPC_S_OK)
|
|
{
|
|
ErrorMsg(IDSERR_BINDING_HANDLE, status);
|
|
}
|
|
else if ((status = RpcBindingSetAuthInfo(ghBinding,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_NONE,
|
|
RPC_C_AUTHN_WINNT,
|
|
NULL,
|
|
0)) != RPC_S_OK)
|
|
{
|
|
ErrorMsg(IDSERR_SETAUTHO_INFO, status);
|
|
}
|
|
else
|
|
{
|
|
INITCOMMONCONTROLSEX ComCtrl;
|
|
#ifdef SYSACC
|
|
|
|
ghSysAcc = CreateFile(SMBLITE_IOCTL_DEVNAME,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (ghSysAcc == INVALID_HANDLE_VALUE)
|
|
{
|
|
ErrorMsg(IDSERR_SYSACC_OPENDEV, GetLastError());
|
|
}
|
|
|
|
ghFont = GetStockObject(SYSTEM_FIXED_FONT);
|
|
#endif
|
|
ComCtrl.dwSize = sizeof(ComCtrl);
|
|
ComCtrl.dwICC = ICC_BAR_CLASSES | ICC_USEREX_CLASSES;
|
|
if (InitCommonControlsEx(&ComCtrl))
|
|
{
|
|
HPROPSHEETPAGE hPages[MAX_PAGES];
|
|
PROPSHEETHEADER psh;
|
|
|
|
psh.dwSize = sizeof(psh);
|
|
psh.dwFlags = 0;
|
|
psh.hwndParent = hwnd;
|
|
psh.hInstance = ghInstance;
|
|
psh.pszCaption = MAKEINTRESOURCE(IDS_TITLE);
|
|
psh.phpage = hPages;
|
|
psh.nStartPage = 0;
|
|
psh.nPages = CreatePropertyPages(TabletPCPropPages, hPages);
|
|
|
|
if (PropertySheet(&psh) >= 0)
|
|
{
|
|
rc = TRUE;
|
|
}
|
|
else
|
|
{
|
|
ErrorMsg(IDSERR_PROP_SHEET, GetLastError());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ErrorMsg(IDSERR_COMMCTRL);
|
|
}
|
|
}
|
|
|
|
TRACEEXIT(("=%x\n", rc));
|
|
return rc;
|
|
} //RunApplet
|
|
|
|
/*++
|
|
@doc INTERNAL
|
|
|
|
@func VOID | CreatePropertyPages |
|
|
Create all the property sheet pages according to the property
|
|
page table.
|
|
|
|
@parm IN PTABLETPC_PROPPAGE | TabletPCPages | Points to the property page
|
|
table.
|
|
@parm OUT HPROPSHEETPAGE * | hPages | Points to the array to hold all
|
|
the created property sheet handles.
|
|
|
|
@rvalue Returns number of property page handles created.
|
|
--*/
|
|
|
|
UINT
|
|
CreatePropertyPages(
|
|
IN PTABLETPC_PROPPAGE TabletPCPages,
|
|
OUT HPROPSHEETPAGE *hPages
|
|
)
|
|
{
|
|
TRACEPROC("CreatePropertyPages", 3)
|
|
UINT nPages = 0;
|
|
PROPSHEETPAGE psp;
|
|
|
|
TRACEENTER(("(TabletPCPages=%p,hPages=%p)\n", TabletPCPages, hPages));
|
|
|
|
psp.dwSize = sizeof(psp);
|
|
psp.dwFlags = 0;
|
|
psp.hInstance = ghInstance;
|
|
psp.pszTitle = NULL;
|
|
psp.lParam = 0;
|
|
|
|
while (TabletPCPages->DlgTemplate != NULL)
|
|
{
|
|
psp.pszTemplate = TabletPCPages->DlgTemplate;
|
|
psp.pfnDlgProc = TabletPCPages->DlgProc;
|
|
TabletPCPages->hPropSheetPage = CreatePropertySheetPage(&psp);
|
|
if (TabletPCPages->hPropSheetPage != NULL)
|
|
{
|
|
hPages[nPages] = TabletPCPages->hPropSheetPage;
|
|
nPages++;
|
|
}
|
|
TabletPCPages++;
|
|
}
|
|
|
|
TRACEEXIT(("=%d\n", nPages));
|
|
return nPages;
|
|
} //CreatePropertyPages
|
|
|
|
/*++
|
|
@doc INTERNAL
|
|
|
|
@func VOID | InsertComboBoxStrings |
|
|
Insert the strings into the given combo box.
|
|
|
|
@parm IN HWND | hwnd | Dialog handle.
|
|
@parm IN UINT | ComboBoxID | The ID of the combo box.
|
|
@parm IN PCOMBOBOX_STRING | ComboString | Points to the combo box
|
|
string table.
|
|
|
|
@rvalue None.
|
|
--*/
|
|
|
|
VOID
|
|
InsertComboBoxStrings(
|
|
IN HWND hwnd,
|
|
IN UINT ComboBoxID,
|
|
IN PCOMBOBOX_STRING ComboString
|
|
)
|
|
{
|
|
TRACEPROC("InsertComboBoxStrings", 3)
|
|
TCHAR tszStringText[64];
|
|
|
|
TRACEENTER(("(hwnd=%x,ComboBoxID=%x,ComboStringTable=%p)\n",
|
|
hwnd, ComboBoxID, ComboString));
|
|
|
|
SendDlgItemMessage(hwnd, ComboBoxID, CB_RESETCONTENT, 0, 0);
|
|
while (ComboString->StringID != 0)
|
|
{
|
|
LoadString(ghInstance,
|
|
ComboString->StringID,
|
|
tszStringText,
|
|
sizeof(tszStringText)/sizeof(TCHAR));
|
|
SendDlgItemMessage(hwnd,
|
|
ComboBoxID,
|
|
CB_INSERTSTRING,
|
|
ComboString->StringIndex,
|
|
(LPARAM)tszStringText);
|
|
|
|
ComboString++;
|
|
}
|
|
|
|
TRACEEXIT(("!\n"));
|
|
return;
|
|
} //InsertComboBoxStrings
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* @doc INTERNAL
|
|
*
|
|
* @func VOID | EnableDlgControls | Enable dialog controls.
|
|
*
|
|
* @parm IN HWND | hwnd | Window handle.
|
|
* @parm IN int * | piControls | Points to the dialog control array.
|
|
* @parm IN BOOL | fEnable | TRUE if enable.
|
|
*
|
|
* @rvalue None.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
VOID
|
|
EnableDlgControls(
|
|
IN HWND hwnd,
|
|
IN int *piControls,
|
|
IN BOOL fEnable
|
|
)
|
|
{
|
|
TRACEPROC("EnableDlgControls", 2)
|
|
|
|
TRACEENTER(("(hwnd=%x,piControls=%p,fEnable=%x)\n",
|
|
hwnd, piControls, fEnable));
|
|
|
|
while (*piControls != 0)
|
|
{
|
|
EnableWindow(GetDlgItem(hwnd, *piControls), fEnable);
|
|
piControls++;
|
|
}
|
|
|
|
TRACEEXIT(("!\n"));
|
|
return;
|
|
} //EnableDlgControls
|
|
|
|
/*++
|
|
@doc EXTERNAL
|
|
|
|
@func void __RPC_FAR * | MIDL_user_allocate | MIDL allocate.
|
|
|
|
@parm IN size_t | len | size of allocation.
|
|
|
|
@rvalue SUCCESS | Returns the pointer to the memory allocated.
|
|
@rvalue FAILURE | Returns NULL.
|
|
--*/
|
|
|
|
void __RPC_FAR * __RPC_USER
|
|
MIDL_user_allocate(
|
|
IN size_t len
|
|
)
|
|
{
|
|
TRACEPROC("MIDL_user_allocate", 5)
|
|
void __RPC_FAR *ptr;
|
|
|
|
TRACEENTER(("(len=%d)\n", len));
|
|
|
|
ptr = malloc(len);
|
|
|
|
TRACEEXIT(("=%p\n", ptr));
|
|
return ptr;
|
|
} //MIDL_user_allocate
|
|
|
|
/*++
|
|
@doc EXTERNAL
|
|
|
|
@func void | MIDL_user_free | MIDL free.
|
|
|
|
@parm IN void __PRC_FAR * | ptr | Points to the memory to be freed.
|
|
|
|
@rvalue None.
|
|
--*/
|
|
|
|
void __RPC_USER
|
|
MIDL_user_free(
|
|
IN void __RPC_FAR *ptr
|
|
)
|
|
{
|
|
TRACEPROC("MIDL_user_free", 5)
|
|
|
|
TRACEENTER(("(ptr=%p)\n", ptr));
|
|
|
|
free(ptr);
|
|
|
|
TRACEEXIT(("!\n"));
|
|
return;
|
|
} //MIDL_user_free
|