trying to make a class out of this shi-at
This commit is contained in:
parent
509fb5e001
commit
25c63c6e04
2
stdafx.h
2
stdafx.h
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
const _TCHAR g_szClassName[] = _T("myWindowClass");
|
const _TCHAR windowClassName[] = _T("myWindowClass");
|
||||||
|
|
||||||
const int topMarginHeight = 20;
|
const int topMarginHeight = 20;
|
||||||
const int leftMarginWidth = 70;
|
const int leftMarginWidth = 70;
|
||||||
@ -324,6 +324,21 @@ LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
onSize(hwnd, LOWORD(lParam), HIWORD(lParam));
|
onSize(hwnd, LOWORD(lParam), HIWORD(lParam));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_GETMINMAXINFO:
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = leftMarginWidth;
|
||||||
|
rect.bottom = topMarginHeight;
|
||||||
|
AdjustWindowRectEx(&rect, WS_VSCROLL | WS_HSCROLL | WS_OVERLAPPEDWINDOW, FALSE, WS_EX_CLIENTEDGE);
|
||||||
|
|
||||||
|
MINMAXINFO *mm=(MINMAXINFO*)lParam;
|
||||||
|
mm->ptMinTrackSize.x = rect.right;
|
||||||
|
mm->ptMinTrackSize.y = rect.bottom - rect.top;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
DestroyWindow(hwnd);
|
DestroyWindow(hwnd);
|
||||||
@ -351,14 +366,10 @@ LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _tmain(int argc, _TCHAR* argv[])
|
ATOM registerWindowClass(HINSTANCE hInstance)
|
||||||
{
|
{
|
||||||
WNDCLASSEX wc;
|
WNDCLASSEX wc;
|
||||||
HWND hwnd;
|
|
||||||
MSG Msg;
|
|
||||||
HINSTANCE hInstance = GetModuleHandle(NULL);
|
|
||||||
|
|
||||||
//Step 1: Registering the Window Class
|
|
||||||
wc.cbSize = sizeof(WNDCLASSEX);
|
wc.cbSize = sizeof(WNDCLASSEX);
|
||||||
wc.style = 0;
|
wc.style = 0;
|
||||||
wc.lpfnWndProc = windowProc;
|
wc.lpfnWndProc = windowProc;
|
||||||
@ -369,10 +380,20 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||||
wc.lpszMenuName = NULL;
|
wc.lpszMenuName = NULL;
|
||||||
wc.lpszClassName = g_szClassName;
|
wc.lpszClassName = windowClassName;
|
||||||
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||||
|
|
||||||
if(!RegisterClassEx(&wc))
|
return RegisterClassEx(&wc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _tmain(int argc, _TCHAR* argv[])
|
||||||
|
{
|
||||||
|
HWND hwnd;
|
||||||
|
MSG Msg;
|
||||||
|
HINSTANCE hInstance = GetModuleHandle(NULL);
|
||||||
|
|
||||||
|
ATOM wc = registerWindowClass(hInstance);
|
||||||
|
if(!wc)
|
||||||
{
|
{
|
||||||
MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
|
MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
|
||||||
return 0;
|
return 0;
|
||||||
@ -381,7 +402,7 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
// Step 2: Creating the Window
|
// Step 2: Creating the Window
|
||||||
hwnd = CreateWindowEx(
|
hwnd = CreateWindowEx(
|
||||||
WS_EX_CLIENTEDGE,
|
WS_EX_CLIENTEDGE,
|
||||||
g_szClassName,
|
windowClassName,
|
||||||
_T("SyncTracker 3000"),
|
_T("SyncTracker 3000"),
|
||||||
WS_VSCROLL | WS_HSCROLL | WS_OVERLAPPEDWINDOW,
|
WS_VSCROLL | WS_HSCROLL | WS_OVERLAPPEDWINDOW,
|
||||||
CW_USEDEFAULT, CW_USEDEFAULT, // x, y
|
CW_USEDEFAULT, CW_USEDEFAULT, // x, y
|
||||||
@ -389,7 +410,7 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
NULL, NULL, hInstance, NULL
|
NULL, NULL, hInstance, NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
if(hwnd == NULL)
|
if (NULL == hwnd)
|
||||||
{
|
{
|
||||||
MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
|
MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"), MB_ICONEXCLAMATION | MB_OK);
|
||||||
return 0;
|
return 0;
|
||||||
@ -405,5 +426,6 @@ int _tmain(int argc, _TCHAR* argv[])
|
|||||||
DispatchMessage(&Msg);
|
DispatchMessage(&Msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UnregisterClass(windowClassName, hInstance);
|
||||||
return int(Msg.wParam);
|
return int(Msg.wParam);
|
||||||
}
|
}
|
||||||
@ -182,6 +182,10 @@
|
|||||||
RelativePath=".\synctracker2.cpp"
|
RelativePath=".\synctracker2.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\trackview.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
@ -192,6 +196,10 @@
|
|||||||
RelativePath=".\stdafx.h"
|
RelativePath=".\stdafx.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\trackview.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Resource Files"
|
Name="Resource Files"
|
||||||
|
|||||||
288
trackview.cpp
Normal file
288
trackview.cpp
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include "trackview.h"
|
||||||
|
|
||||||
|
void TrackView::onCreate(HWND hwnd)
|
||||||
|
{
|
||||||
|
scrollPosX = 0;
|
||||||
|
scrollPosY = 0;
|
||||||
|
windowWidth = -1;
|
||||||
|
windowHeight = -1;
|
||||||
|
setupScrollBars(hwnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::onPaint(HWND hwnd)
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
HDC hdc = BeginPaint(hwnd, &ps);
|
||||||
|
|
||||||
|
SetBkMode(hdc, OPAQUE);
|
||||||
|
// SetBkColor(hdc, RGB(255, 0, 0));
|
||||||
|
|
||||||
|
/*
|
||||||
|
RECT margin = rect;
|
||||||
|
|
||||||
|
margin.left = 0;
|
||||||
|
margin.right = LeftMarginWidth();
|
||||||
|
rect.left += LeftMarginWidth();
|
||||||
|
|
||||||
|
PaintMargin(hdc, nLineNo, &margin);
|
||||||
|
*/
|
||||||
|
|
||||||
|
paintTracks(hdc, ps.rcPaint);
|
||||||
|
|
||||||
|
EndPaint(hwnd, &ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::paintTracks(HDC hdc, RECT rcTracks)
|
||||||
|
{
|
||||||
|
char temp[256];
|
||||||
|
|
||||||
|
int firstLine = max((rcTracks.top - topMarginHeight) / fontHeight, 0);
|
||||||
|
int lastLine = scrollPosY + ((rcTracks.bottom - topMarginHeight) + (fontHeight - 1)) / fontHeight;
|
||||||
|
|
||||||
|
lastLine = min(lastLine, lines);
|
||||||
|
|
||||||
|
SetBkMode(hdc, TRANSPARENT);
|
||||||
|
|
||||||
|
for (int y = firstLine; y < lastLine; ++y)
|
||||||
|
{
|
||||||
|
RECT leftMargin;
|
||||||
|
leftMargin.left = 0;
|
||||||
|
leftMargin.right = leftMarginWidth;
|
||||||
|
leftMargin.top = topMarginHeight + (y - scrollPosY) * fontHeight;
|
||||||
|
leftMargin.bottom = leftMargin.top + fontHeight;
|
||||||
|
|
||||||
|
FillRect(hdc, &leftMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
||||||
|
|
||||||
|
if ((y % 16) == 0) SetTextColor(hdc, RGB(0, 0, 0));
|
||||||
|
else if ((y % 8) == 0) SetTextColor(hdc, RGB(32, 32, 32));
|
||||||
|
else if ((y % 4) == 0) SetTextColor(hdc, RGB(64, 64, 64));
|
||||||
|
else SetTextColor(hdc, RGB(128, 128, 128));
|
||||||
|
|
||||||
|
_snprintf_s(temp, 256, "%04Xh", y);
|
||||||
|
TextOut(hdc,
|
||||||
|
leftMargin.left, leftMargin.top,
|
||||||
|
temp, int(strlen(temp))
|
||||||
|
);
|
||||||
|
|
||||||
|
ExcludeClipRect(hdc, leftMargin.left, leftMargin.top, leftMargin.right, leftMargin.bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTextColor(hdc, RGB(0, 0, 0));
|
||||||
|
|
||||||
|
int trackLeft = leftMarginWidth - scrollPosX;
|
||||||
|
for (int x = 0; x < tracks; ++x)
|
||||||
|
{
|
||||||
|
int trackWidth = fontWidth * 5;
|
||||||
|
|
||||||
|
RECT topMargin;
|
||||||
|
|
||||||
|
topMargin.top = 0;
|
||||||
|
topMargin.bottom = topMarginHeight;
|
||||||
|
|
||||||
|
topMargin.left = trackLeft;
|
||||||
|
topMargin.right = trackLeft + trackWidth;
|
||||||
|
|
||||||
|
FillRect( hdc, &topMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
||||||
|
|
||||||
|
/* format the text */
|
||||||
|
_snprintf_s(temp, 256, "track %d", x);
|
||||||
|
TextOut(hdc,
|
||||||
|
topMargin.left, 0,
|
||||||
|
temp, int(strlen(temp))
|
||||||
|
);
|
||||||
|
ExcludeClipRect(hdc, topMargin.left, topMargin.top, topMargin.right, topMargin.bottom);
|
||||||
|
|
||||||
|
// SetBkColor(hdc, RGB(255, 0, 0));
|
||||||
|
int trackTop = topMarginHeight + (firstLine - scrollPosY) * fontHeight;
|
||||||
|
for (int y = firstLine; y < lastLine; ++y)
|
||||||
|
{
|
||||||
|
RECT patternDataRect;
|
||||||
|
patternDataRect.left = trackLeft;
|
||||||
|
patternDataRect.right = trackLeft + trackWidth;
|
||||||
|
patternDataRect.top = trackTop;
|
||||||
|
patternDataRect.bottom = patternDataRect.top + fontHeight;
|
||||||
|
FillRect( hdc, &patternDataRect, (HBRUSH)GetStockObject(WHITE_BRUSH));
|
||||||
|
|
||||||
|
bool key = (y % 8 == 0);
|
||||||
|
float val = (float(y) / 16);
|
||||||
|
|
||||||
|
/* format the text */
|
||||||
|
if (!key) _snprintf_s(temp, 256, " - - -");
|
||||||
|
else _snprintf_s(temp, 256, "%2.2f", val);
|
||||||
|
TextOut(hdc,
|
||||||
|
trackLeft, trackTop,
|
||||||
|
temp, int(strlen(temp))
|
||||||
|
);
|
||||||
|
trackTop += fontHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
RECT bottomMargin;
|
||||||
|
bottomMargin.top = trackTop;
|
||||||
|
bottomMargin.bottom = rcTracks.bottom;
|
||||||
|
bottomMargin.left = trackLeft;
|
||||||
|
bottomMargin.right = trackLeft + trackWidth;
|
||||||
|
FillRect( hdc, &bottomMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
||||||
|
|
||||||
|
trackLeft += trackWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* pad top margin to the left edge */
|
||||||
|
RECT topMargin;
|
||||||
|
topMargin.top = 0;
|
||||||
|
topMargin.bottom = topMarginHeight;
|
||||||
|
topMargin.left = trackLeft;
|
||||||
|
topMargin.right = rcTracks.right;
|
||||||
|
FillRect( hdc, &topMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
||||||
|
|
||||||
|
/* right margin */
|
||||||
|
RECT rightMargin;
|
||||||
|
rightMargin.top = topMarginHeight;
|
||||||
|
rightMargin.bottom = rcTracks.bottom;
|
||||||
|
rightMargin.left = trackLeft;
|
||||||
|
rightMargin.right = rcTracks.right;
|
||||||
|
FillRect( hdc, &rightMargin, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::setupScrollBars(HWND hwnd)
|
||||||
|
{
|
||||||
|
SCROLLINFO si = { sizeof(si) };
|
||||||
|
si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;
|
||||||
|
si.nPos = scrollPosY;
|
||||||
|
si.nPage = windowLines;
|
||||||
|
si.nMin = 0;
|
||||||
|
si.nMax = lines - 1;
|
||||||
|
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
|
||||||
|
|
||||||
|
si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;
|
||||||
|
si.nPos = scrollPosX;
|
||||||
|
si.nPage = windowWidth;
|
||||||
|
si.nMin = 0;
|
||||||
|
si.nMax = windowWidth * 2; // 0x80;
|
||||||
|
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::setScrollPos(HWND hwnd, int newScrollPosX, int newScrollPosY)
|
||||||
|
{
|
||||||
|
const int oldScrollPosX = scrollPosX;
|
||||||
|
const int oldScrollPosY = scrollPosY;
|
||||||
|
|
||||||
|
// update scrollPos
|
||||||
|
scrollPosX = newScrollPosX;
|
||||||
|
scrollPosY = newScrollPosY;
|
||||||
|
|
||||||
|
// clamp scrollPos
|
||||||
|
scrollPosX = max(scrollPosX, 0);
|
||||||
|
scrollPosY = max(scrollPosY, 0);
|
||||||
|
|
||||||
|
scrollPosY = min(scrollPosY, (lines - 1) - windowLines);
|
||||||
|
|
||||||
|
if (oldScrollPosX != scrollPosX || oldScrollPosY != scrollPosY)
|
||||||
|
{
|
||||||
|
int scrollX = oldScrollPosX - scrollPosX;
|
||||||
|
int scrollY = (oldScrollPosY - scrollPosY) * fontHeight;
|
||||||
|
|
||||||
|
RECT clip;
|
||||||
|
GetClientRect(hwnd, &clip);
|
||||||
|
|
||||||
|
if (scrollX == 0) clip.top = topMarginHeight; /* don't scroll the top line */
|
||||||
|
if (scrollY == 0) clip.left = leftMarginWidth; /* don't scroll the top line */
|
||||||
|
|
||||||
|
ScrollWindowEx(
|
||||||
|
hwnd,
|
||||||
|
scrollX,
|
||||||
|
scrollY,
|
||||||
|
NULL,
|
||||||
|
&clip,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
SW_INVALIDATE
|
||||||
|
);
|
||||||
|
setupScrollBars(hwnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getScrollPos(HWND hwnd, int bar)
|
||||||
|
{
|
||||||
|
SCROLLINFO si = { sizeof(si), SIF_TRACKPOS };
|
||||||
|
GetScrollInfo(hwnd, bar, &si);
|
||||||
|
return int(si.nTrackPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::onVScroll(HWND hwnd, UINT sbCode, int newPos)
|
||||||
|
{
|
||||||
|
switch (sbCode)
|
||||||
|
{
|
||||||
|
case SB_TOP:
|
||||||
|
setScrollPos(hwnd, scrollPosX, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_LINEUP:
|
||||||
|
setScrollPos(hwnd, scrollPosX, scrollPosY - 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_LINEDOWN:
|
||||||
|
setScrollPos(hwnd, scrollPosX, scrollPosY + 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_PAGEUP:
|
||||||
|
setScrollPos(hwnd, scrollPosX, scrollPosY - windowLines);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_PAGEDOWN:
|
||||||
|
setScrollPos(hwnd, scrollPosX, scrollPosY + windowLines);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_THUMBPOSITION:
|
||||||
|
case SB_THUMBTRACK:
|
||||||
|
setScrollPos(hwnd, scrollPosX, getScrollPos(hwnd, SB_VERT));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::onHScroll(HWND hwnd, UINT sbCode, int newPos)
|
||||||
|
{
|
||||||
|
switch (sbCode)
|
||||||
|
{
|
||||||
|
case SB_LEFT:
|
||||||
|
setScrollPos(hwnd, 0, scrollPosY);
|
||||||
|
break;
|
||||||
|
// SB_RIGHT currently missing.
|
||||||
|
|
||||||
|
case SB_LINELEFT:
|
||||||
|
setScrollPos(hwnd, scrollPosX - fontWidth, scrollPosY);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_LINERIGHT:
|
||||||
|
setScrollPos(hwnd, scrollPosX + fontWidth, scrollPosY);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_PAGELEFT:
|
||||||
|
setScrollPos(hwnd, scrollPosX - 20, scrollPosY);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_PAGEDOWN:
|
||||||
|
setScrollPos(hwnd, scrollPosX + 20, scrollPosY);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SB_THUMBPOSITION:
|
||||||
|
case SB_THUMBTRACK:
|
||||||
|
setScrollPos(hwnd, getScrollPos(hwnd, SB_HORZ), scrollPosY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackView::onSize(HWND hwnd, int width, int height)
|
||||||
|
{
|
||||||
|
const int oldWindowWidth = windowWidth;
|
||||||
|
const int oldWindowHeight = windowHeight;
|
||||||
|
|
||||||
|
windowWidth = width;
|
||||||
|
windowHeight = height;
|
||||||
|
|
||||||
|
windowLines = (height - topMarginHeight) / fontHeight;
|
||||||
|
// windowLines = min((height - topMarginHeight) / fontHeight, lines);
|
||||||
|
setupScrollBars(hwnd);
|
||||||
|
}
|
||||||
|
|
||||||
28
trackview.h
Normal file
28
trackview.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class TrackView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// events
|
||||||
|
void onCreate(HWND hwnd);
|
||||||
|
void onPaint(HWND hwnd);
|
||||||
|
void onVScroll(HWND hwnd, UINT sbCode, int newPos);
|
||||||
|
void onHScroll(HWND hwnd, UINT sbCode, int newPos);
|
||||||
|
void onSize(HWND hwnd, int width, int height);
|
||||||
|
|
||||||
|
void paintTracks(HDC hdc, RECT rcTracks);
|
||||||
|
|
||||||
|
void setupScrollBars(HWND hwnd);
|
||||||
|
void setScrollPos(HWND hwnd, int newScrollPosX, int newScrollPosY);
|
||||||
|
|
||||||
|
|
||||||
|
int tracks;
|
||||||
|
int lines;
|
||||||
|
|
||||||
|
int topMarginHeight, leftMarginWidth;
|
||||||
|
int fontHeight, fontWidth;
|
||||||
|
int scrollPosX, scrollPosY;
|
||||||
|
|
||||||
|
int windowWidth, windowHeight;
|
||||||
|
int windowLines;
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user