#include "../HTCGSensor/HTCGSensor.h"
#include "Tester.h"
#include "resource.h"
#include "TestBall.h"
HINSTANCE g_hInstance;
HDC g_hdcBuffer;
RECT rc;
CHTCGSensor gsensor;
GVector gv;
AngleVector av;
bool g_bBall = false, g_bGraph = false, g_bWord = true;
bool g_bPause = false;
TCHAR szBtnText[2][6] = {L"start",L"pause"};
HWND g_hBtn;
// 文字界面变量
int g_nLastEvent = -1;
int msgCnt = 0;
UINT timer[MAX_MSGCNT];
UINT direction[MAX_MSGCNT], strength[MAX_MSGCNT];
// 小球界面变量
HDC g_hBmpDC;
TestBall *g_pBall;
HBITMAP g_hBall;
// 绘图界面变量
HDC g_hMemDC;
int g_nGraphH;
int g_nLastX,g_nLastY,g_nLastZ;
HPEN hpen1,hpen2,hpen3;
int overlap = 5; // 画图时两点之间的x间隔
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow)
{
MSG msg;
if (!InitInstance(hInstance, nCmdShow))
{
return 0;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;
return RegisterClass(&wc);
}
bool InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR * szTitle = _T("GSensor Test");
TCHAR * szWindowClass = _T("GSensorTestClass");
g_hInstance = hInstance;
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return 0;
}
if (!MyRegisterClass(hInstance, szWindowClass))
{
return false;
}
hWnd = CreateWindow(szWindowClass, szTitle,
WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return false;
}
if (!gsensor.InitSensor())
{
return false;
}
if (!gsensor.RegisterChangeEvent(hWnd,50))
{
return false;
}
if (!gsensor.RegisterStateEvent(hWnd))
{
return false;
}
if (!gsensor.RegisterShakeEvent(hWnd, 200, 1700))
{
return false;
}
RECT rc;
GetWindowRect(hWnd, &rc);
HDC hdc = GetDC(hWnd);
g_hdcBuffer = CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
SelectObject(g_hdcBuffer, hBitmap);
GetClientRect(hWnd,&rc);
g_pBall = new TestBall(rc);
g_hBall = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BALL), IMAGE_BITMAP, 0,0,0);
g_hBmpDC = CreateCompatibleDC(hdc);
SelectObject(g_hBmpDC, g_hBall);
int btnw = 100, btnh = 30;
g_nGraphH = rc.bottom/3;
g_nLastX = g_nGraphH/2;g_nLastY = g_nGraphH+g_nLastX;g_nLastZ = g_nGraphH+g_nLastY;
CreateWindow(L"button", L"文字", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
rc.right-btnw, rc.bottom-g_nGraphH-2*btnh+2, btnw, btnh,
hWnd, (HMENU)ID_BTN_WORD, hInstance, NULL);
CreateWindow(L"button", L"小球", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
rc.right-btnw, rc.bottom-g_nGraphH-1*btnh+1, btnw, btnh,
hWnd, (HMENU)ID_BTN_BALL, hInstance, NULL);
CreateWindow(L"button", L"图形", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
rc.right-btnw, rc.bottom-g_nGraphH+0*btnh, btnw, btnh,
hWnd, (HMENU)ID_BTN_GRAPH, hInstance, NULL);
g_hBtn = CreateWindow(L"button", L"pause", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
rc.right-btnw, rc.bottom-g_nGraphH+1*btnh, btnw, btnh,
hWnd, (HMENU)ID_BTN_PAUSE, hInstance, NULL);
g_hMemDC = CreateCompatibleDC(hdc);
HBITMAP hBitmap1 = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
SelectObject(g_hMemDC, hBitmap1);
Rectangle(g_hMemDC, -10, -10, rc.right+10, rc.bottom+10);
ReleaseDC(hWnd, hdc);
/* SetTimer(hWnd, TIMERID_READSENSOR, 50, NULL);*/
SetTimer(hWnd, TIMERID_KEEPALIVE, 5000, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return true;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HWND hWndSipButton;
switch (message)
{
case WM_CREATE:
hWndSipButton = FindWindow(TEXT("MS_SIPBUTTON"), NULL);
if( hWndSipButton != NULL )
{
ShowWindow(hWndSipButton, SW_HIDE);
}
hpen1 = CreatePen(PS_SOLID,2,RGB(0,0,0));
hpen2 = CreatePen(PS_SOLID,2,RGB(255,0,0));
hpen3 = CreatePen(PS_SOLID,2,RGB(0,0,255));
break;
case WM_ERASEBKGND:
return -1;
case WM_TIMER:
switch (wParam)
{
// 保持机器不进入等待状态
case TIMERID_KEEPALIVE:
SystemIdleTimerReset();
keybd_event(0, 0, KEYEVENTF_SILENT, 0);
keybd_event(0, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
SHIdleTimerReset();
break;
// case TIMERID_READSENSOR:
// if (!g_bPause) InvalidateRect(hWnd, NULL, TRUE);
// break;
}
break;
case WM_COMMAND:
ToggleView(wParam);
break;
// 当屏幕摆放方式发生变化时,共有6种状态。用diamond2的DLL,在diamond2上似无此功能,但s900c上可用
case WM_STATECHANGE:
if (lParam == SN_GSENSOR && !g_bPause)
{
g_nLastEvent = (wParam & SN_GSENSOR_BITMASK);
//InvalidateRect(hWnd, NULL, FALSE);
}
break;
case WM_PAINT:
GetClientRect(hWnd,&rc);
if (!g_bPause) OnPaint(hWnd);
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, rc.right, rc.bottom, g_hdcBuffer, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_SHAKE:
if (g_bWord && !g_bPause)
{
if(msgCnt == MAX_MSGCNT) msgCnt = 0;
timer[msgCnt] = lParam;
strength[msgCnt] = LOWORD(wParam);
direction[msgCnt] = HIWORD(wParam);
msgCnt++;
}
break;
case WM_GVECTORCHANGE:
InvalidateRect(hWnd,NULL,TRUE);
break;
case WM_ACTIVATE:
if (LOWORD(wParam) == WA_INACTIVE)
{
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void ToggleView( WPARAM wParam )
{
switch(LOWORD(wParam)) // 切换文字、小球或图形
{
case ID_BTN_WORD:
g_bWord = !g_bWord;
g_bGraph = false;
break;
case ID_BTN_BALL:
g_bBall = !g_bBall;
break;
case ID_BTN_GRAPH:
g_bGraph = !g_bGraph;
g_bWord = false;
g_nLastX = g_nGraphH/2; // 当转换界面时,令图形变得不连续以提示
g_nLastY = g_nGraphH+g_nLastX;
g_nLastZ = g_nGraphH+g_nLastY;
break;
case ID_BTN_PAUSE:
g_bPause = !g_bPause;
SetWindowText(g_hBtn, szBtnText[!g_bPause]);
g_nLastX = g_nGraphH/2;
g_nLastY = g_nGraphH+g_nLastX;
g_nLastZ = g_nGraphH+g_nLastY;
}
}
void OnPaint( HWND hWnd )
{
// 获取传感器值
gsensor.GetGVBuffer(&gv);
if (!gsensor.GetAngleVector(&av))
{
MessageBox(hWnd, L"error.", L"!", MB_OK);
PostQuitMessage(0);
}
Rectangle(g_hdcBuffer, -10, -10, rc.right+10, rc.bottom+10); // 将g_hdcBuffer清空
if (g_bGraph)
{
OnDrawGraph();
}
if (g_bWord)
{
OnDrawWord();
}
if (g_bBall)
{
// 获取小球位置
g_pBall->SetForce(gv.x,gv.y);
POINT ballPos;
g_pBall->GetNextXY(ballPos);
// 显示小球
int r = g_pBall->r;
TransparentBlt(g_hdcBuffer, ballPos.x-r, ballPos.y-r, 2*r,2*r, g_hBmpDC, 0,0,20,20, 0xFF00FF);
}
}
void OnDrawWord() // 文字界面
{
TCHAR szText[300], szShakeMsg[20];
TCHAR szShake[6][2] = {L"上",L"下",L"左",L"右",L"前",L"后"};
swprintf(szText,
L"GX:%d\nGY:%d\nGZ:%d\n\n手机在yz平面倾斜度数:%d\n "
L"在xz平面倾斜度数:%d\n 在xy平面倾斜度数:%d\n\n",
gv.x,gv.y,gv.z, av.x,av.y,av.z);
TCHAR * szLast;
switch (g_nLastEvent)
{
case ORIENTATION_LANDSCAPE:
szLast = _T("Last Event: 左侧着地");
break;
case ORIENTATION_REVERSE_LANDSCAPE:
szLast = _T("Last Event: 右侧着地");
break;
case ORIENTATIO
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
演示了怎样调用HTC手机中的gsensor,并提供了从diamond2手机中复制的dll,在s900c中测试可用。 工程中有笔者封装的一个类,提供了取得重力向量、手机倾角向量的方法,和重力、手机姿态发生变化时发送消息的方法,和手机发生摇动时发送消息的方法。
资源推荐
资源详情
资源评论
收起资源包目录
HTCGSensor.rar (20个子文件)
HTCSensorSDK.dll 18KB
HTCGSensor
HTCGSensor.ncb 6.91MB
HTCGSensor.suo 42KB
Tester
Tester.h 613B
resource.h 494B
ball.bmp 358B
TestBall.cpp 1KB
Tester.cpp 10KB
TestBall.h 605B
Tester.vcproj 6KB
Tester.rc 2KB
Tester.aps 72KB
Tester.vcproj.YANKE-COMPUTER.Admin.user 2KB
HTCGSensor.sln 3KB
HTCGSensor
HTCGSensor.h 2KB
HTCGSensor.cpp 5KB
HTCGSensor.vcproj 5KB
HTCGSensor.vcproj.YANKE-COMPUTER.Admin.user 2KB
HTCSensorDefs.h 2KB
SensorInit.cpp 3KB
共 20 条
- 1
viggin
- 粉丝: 33
- 资源: 57
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页