📄 wnduserrng.c
字号:
// the cursor
if (
(WindowData->LinesListTail != WindowData->LinesListHead) &&
(WindowData->LinesListTail != NULL)
)
{
_wndUserRNG_DrawLine(
hWnd,
R2_MERGENOTPEN,
WindowData->LinesListTail->Point,
WindowData->LinesListTail->Next->Point
);
RemoveLastPoint(WindowData);
}
}
else
{
// AT THIS POINT, WE USE LastMouseX AND LastMouseY AS THE CO-ORDS TO USE
// Store the position
StoreNewPoint(WindowData, WindowData->LastPnt);
// User moved cursor - don't delete any more lines unless the max number
// of lines which may be displayed is exceeded
if (
((WindowData->PointCount+1) > WindowData->TrailLines) &&
(WindowData->PointCount > 1)
)
{
_wndUserRNG_DrawLine(
hWnd,
R2_MERGENOTPEN,
WindowData->LinesListTail->Point,
WindowData->LinesListTail->Next->Point
);
RemoveLastPoint(WindowData);
}
// Draw newest line
if (
(WindowData->TrailLines > 0) &&
(WindowData->PointCount > 1)
)
{
_wndUserRNG_DrawLine(
hWnd,
R2_COPYPEN,
WindowData->LinesListHead->Prev->Point,
WindowData->LinesListHead->Point
);
}
ProcessSample(hWnd, WindowData->LastPnt);
}
}
}
// =========================================================================
LRESULT CALLBACK wndUserRNG_HandleMsg_WM_ENABLE(HWND hWnd, WPARAM wParam)
{
BOOL enabled = (BOOL)wParam;
USERRNG_DATA* WindowData;
WindowData = wndUserRNG_GetWindowData(hWnd);
if (enabled)
{
WindowData->TimeOfLastSample = 0;
}
// Redraw to get enabled/disabled background
RedrawWindow(
hWnd,
NULL,
NULL,
(RDW_ERASE | RDW_INVALIDATE)
);
return 0; // Processed WM_ENABLE successfully
}
// =========================================================================
LRESULT CALLBACK wndUserRNG_HandleMsg_WM_ERASEBKGND(HWND hWnd, WPARAM wParam)
{
LRESULT retval = 0; // Zero indicates failure
HDC hDC;
RECT rect;
HBRUSH hBrush;
hDC = (HDC)wParam;
if (IsWindowEnabled(hWnd))
{
hBrush = GetSysColorBrush(COLOR_WINDOW);
}
else
{
hBrush = GetSysColorBrush(COLOR_BTNFACE);
}
if (GetClientRect(hWnd, &rect))
{
FillRect(hDC, &rect, hBrush);
retval = 1; // Nonzero means we processed the message
}
return retval;
}
// =========================================================================
LRESULT CALLBACK wndUserRNG_HandleMsg_WM_CLOSE(HWND hWnd)
{
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("wndUserRNG_HandleMsg_WM_CLOSE\n")));
//xxx - is this called?
DestroyWindow(hWnd);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("wndUserRNG_HandleMsg_WM_CLOSE\n")));
return 0;
}
// =========================================================================
LRESULT CALLBACK wndUserRNG_HandleMsg_WM_DESTROY(HWND hWnd)
{
USERRNG_DATA* WindowData;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("wndUserRNG_HandleMsg_WM_DESTROY\n")));
WindowData = wndUserRNG_GetWindowData(hWnd);
SecZeroAndFreeMemory(WindowData, sizeof(*WindowData));
WindowData = NULL;
wndUserRNG_SetWindowData(hWnd, WindowData);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("wndUserRNG_HandleMsg_WM_DESTROY\n")));
return 0;
}
// =========================================================================
void wndUserRNG_SetWindowData(HWND hWnd, USERRNG_DATA* WindowData)
{
SetWindowLong(hWnd, 0, (LONG)WindowData);
}
// =========================================================================
USERRNG_DATA* wndUserRNG_GetWindowData(HWND hWnd)
{
return (USERRNG_DATA*)GetWindowLong(hWnd, 0);
}
// =========================================================================
void _wndUserRNG_DrawLine(
HWND hWnd,
int Mode,
POINT A,
POINT B
)
{
USERRNG_DATA* WindowData;
HPEN hPen;
HDC hDC;
POINT pts[POINTS_TO_A_LINE];
WindowData = wndUserRNG_GetWindowData(hWnd);
hDC = GetDC(hWnd);
hPen = CreatePen(
PS_SOLID,
WindowData->LineWidth,
WindowData->LineColor
);
SelectObject(hDC, hPen);
SetROP2(hDC, Mode);
pts[0] = A;
pts[1] = B;
Polyline(hDC, pts, POINTS_TO_A_LINE);
DeleteObject(hPen);
}
// =========================================================================
void wndUserRNG_HandleMsg_WM_MOUSEMOVE(
HWND hWnd,
LPARAM lParam
)
{
USERRNG_DATA* WindowData;
DWORD sampleInterval;
DWORD currTime;
if (IsWindowEnabled(hWnd))
{
WindowData = wndUserRNG_GetWindowData(hWnd);
if (
(WindowData->TrailLines > 0) &&
(WindowData->PointCount >= 1)
)
{
_wndUserRNG_DrawLine(
hWnd,
R2_XORPEN,
WindowData->LinesListHead->Point,
WindowData->LastPnt
);
}
WindowData->LastPnt.x = LOWORD(lParam);
WindowData->LastPnt.y = HIWORD(lParam);
if (
(WindowData->TrailLines > 0) &&
(WindowData->PointCount >= 1)
)
{
_wndUserRNG_DrawLine(
hWnd,
R2_XORPEN,
WindowData->LinesListHead->Point,
WindowData->LastPnt
);
}
// Prevent potential problems with tick count looping back to 0
currTime = GetTickCount();
if (WindowData->TimeOfLastSample > currTime)
{
sampleInterval = WindowData->TimeOfLastSample - currTime;
}
else
{
sampleInterval = currTime - WindowData->TimeOfLastSample;
}
if (sampleInterval > USERRNG_TIMER_INTERVAL)
{
_wndUserRNG_TakeSampleIfMoved(hWnd);
WindowData->TimeOfLastSample = GetTickCount();
}
}
}
// =========================================================================
LRESULT CALLBACK wndUserRNG_Proc(
HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
LRESULT retval = 0;
// xxx - junk this - static SHACTIVATEINFO s_sai = {0};
switch(msg)
{
case WM_CREATE:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_CREATE\n")));
// xxx - junk this - s_sai.cbSize = sizeof(SHACTIVATEINFO);
retval = wndUserRNG_HandleMsg_WM_CREATE(hWnd, lParam);
break;
}
case WM_ENABLE:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_ENABLE\n")));
wndUserRNG_HandleMsg_WM_ENABLE(hWnd, wParam);
break;
}
case WM_ERASEBKGND:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_ERASEBKGND\n")));
retval = wndUserRNG_HandleMsg_WM_ERASEBKGND(hWnd, wParam);
break;
}
case WM_ACTIVATE:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_ACTIVATE\n")));
// xxx - junk this - SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, 0);
break;
}
case WM_SETTINGCHANGE:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_SETTINGCHANGE\n")));
// xxx - junk this - SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
break;
}
case WM_CLOSE:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_CLOSE\n")));
retval = wndUserRNG_HandleMsg_WM_CLOSE(hWnd);
break;
}
case WM_DESTROY:
{
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("MSG: WM_DESTROY\n")));
retval = wndUserRNG_HandleMsg_WM_DESTROY(hWnd);
break;
}
case WM_MOUSEMOVE:
{
wndUserRNG_HandleMsg_WM_MOUSEMOVE(hWnd, lParam);
break;
}
default:
{
retval = DefWindowProc(hWnd, msg, wParam, lParam);
}
} // switch(msg)
return retval;
}
// =========================================================================
BOOL WndUserRNGRegister()
{
WNDCLASS wc;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("WndMainRegister\n")));
InitCommonControls();
wc.style = (CS_HREDRAW | CS_VREDRAW) ;
wc.lpfnWndProc = (WNDPROC)wndUserRNG_Proc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(PUSERRNG_DATA);
wc.hIcon = NULL;
wc.hInstance = G_hInstance;
wc.hCursor = NULL; // No cursor for WinCE
// wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
wc.hbrBackground = NULL; // We use WM_ERASEBKGND
wc.lpszMenuName = NULL; // Must be set to NULL; WinCE doesn't support
// "MAKEINTRESOURCE(IDR_MAINMENU)" here
wc.lpszClassName = USERRNG_CONTROL;
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("WndMainRegister\n")));
return (RegisterClass(&wc) != 0);
}
// =========================================================================
// =========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -