yesyes, cleaner code (lost that HWND passed around everywhere).

This commit is contained in:
Erik Faye-Lund 2007-12-04 01:48:40 +00:00
parent cee8d85cf9
commit 5dc27deef9
2 changed files with 65 additions and 56 deletions

View File

@ -15,24 +15,27 @@ static const int trackWidth = fontWidth * 16;
static const int lines = 0x80; static const int lines = 0x80;
static const int tracks = 16; static const int tracks = 16;
int TrackView::getScreenY(int line) TrackView::TrackView(HWND hwnd)
{
return topMarginHeight + (line * fontHeight) - scrollPosY;
}
void TrackView::onCreate(HWND hwnd)
{ {
scrollPosX = 0; scrollPosX = 0;
scrollPosY = 0; scrollPosY = 0;
windowWidth = -1; windowWidth = -1;
windowHeight = -1; windowHeight = -1;
editLine = 0; editLine = 0;
this->hwnd = hwnd;
setupScrollBars(hwnd);
} }
void TrackView::onPaint(HWND hwnd) int TrackView::getScreenY(int line)
{
return topMarginHeight + (line * fontHeight) - scrollPosY;
}
void TrackView::onCreate()
{
setupScrollBars();
}
void TrackView::onPaint()
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); HDC hdc = BeginPaint(hwnd, &ps);
@ -208,7 +211,7 @@ void TrackView::paintTracks(HDC hdc, RECT rcTracks)
DeleteObject(editBrush); DeleteObject(editBrush);
} }
void TrackView::setupScrollBars(HWND hwnd) void TrackView::setupScrollBars()
{ {
SCROLLINFO si = { sizeof(si) }; SCROLLINFO si = { sizeof(si) };
si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL; si.fMask = SIF_POS | SIF_PAGE | SIF_RANGE | SIF_DISABLENOSCROLL;
@ -226,7 +229,7 @@ void TrackView::setupScrollBars(HWND hwnd)
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
} }
void TrackView::scrollWindow(HWND hwnd, int scrollX, int scrollY) void TrackView::scrollWindow(int scrollX, int scrollY)
{ {
RECT clip; RECT clip;
GetClientRect(hwnd, &clip); GetClientRect(hwnd, &clip);
@ -246,7 +249,7 @@ void TrackView::scrollWindow(HWND hwnd, int scrollX, int scrollY)
); );
} }
void TrackView::setScrollPos(HWND hwnd, int newScrollPosX, int newScrollPosY) void TrackView::setScrollPos(int newScrollPosX, int newScrollPosY)
{ {
// clamp newscrollPosX // clamp newscrollPosX
newScrollPosX = max(newScrollPosX, 0); newScrollPosX = max(newScrollPosX, 0);
@ -260,12 +263,12 @@ void TrackView::setScrollPos(HWND hwnd, int newScrollPosX, int newScrollPosY)
scrollPosX = newScrollPosX; scrollPosX = newScrollPosX;
scrollPosY = newScrollPosY; scrollPosY = newScrollPosY;
scrollWindow(hwnd, scrollX, scrollY); scrollWindow(scrollX, scrollY);
setupScrollBars(hwnd); setupScrollBars();
} }
} }
void TrackView::setEditLine(HWND hwnd, int newEditLine) void TrackView::setEditLine(int newEditLine)
{ {
int oldEditLine = editLine; int oldEditLine = editLine;
editLine = newEditLine; editLine = newEditLine;
@ -289,7 +292,7 @@ void TrackView::setEditLine(HWND hwnd, int newEditLine)
lineRect.bottom = lineRect.top + fontHeight; lineRect.bottom = lineRect.top + fontHeight;
InvalidateRect(hwnd, &lineRect, TRUE); InvalidateRect(hwnd, &lineRect, TRUE);
setScrollPos(hwnd, scrollPosX, ((editLine + 1) * fontHeight) - (windowHeight / 2)); setScrollPos(scrollPosX, ((editLine + 1) * fontHeight) - (windowHeight / 2));
} }
static int getScrollPos(HWND hwnd, int bar) static int getScrollPos(HWND hwnd, int bar)
@ -299,82 +302,82 @@ static int getScrollPos(HWND hwnd, int bar)
return int(si.nTrackPos); return int(si.nTrackPos);
} }
void TrackView::onVScroll(HWND hwnd, UINT sbCode, int newPos) void TrackView::onVScroll(UINT sbCode, int newPos)
{ {
switch (sbCode) switch (sbCode)
{ {
case SB_TOP: case SB_TOP:
setEditLine(hwnd, 0); setEditLine(0);
break; break;
case SB_LINEUP: case SB_LINEUP:
setEditLine(hwnd, editLine - 1); setEditLine(editLine - 1);
break; break;
case SB_LINEDOWN: case SB_LINEDOWN:
setEditLine(hwnd, editLine + 1); setEditLine(editLine + 1);
break; break;
case SB_PAGEUP: case SB_PAGEUP:
setEditLine(hwnd, editLine - windowLines / 2); setEditLine(editLine - windowLines / 2);
break; break;
case SB_PAGEDOWN: case SB_PAGEDOWN:
setEditLine(hwnd, editLine + windowLines / 2); setEditLine(editLine + windowLines / 2);
break; break;
case SB_THUMBPOSITION: case SB_THUMBPOSITION:
case SB_THUMBTRACK: case SB_THUMBTRACK:
setEditLine(hwnd, getScrollPos(hwnd, SB_VERT)); setEditLine(getScrollPos(hwnd, SB_VERT));
break; break;
} }
} }
void TrackView::onHScroll(HWND hwnd, UINT sbCode, int newPos) void TrackView::onHScroll(UINT sbCode, int newPos)
{ {
switch (sbCode) switch (sbCode)
{ {
case SB_LEFT: case SB_LEFT:
setScrollPos(hwnd, 0, scrollPosY); setScrollPos(0, scrollPosY);
break; break;
// SB_RIGHT currently missing. // SB_RIGHT currently missing.
case SB_LINELEFT: case SB_LINELEFT:
setScrollPos(hwnd, scrollPosX - fontWidth, scrollPosY); setScrollPos(scrollPosX - fontWidth, scrollPosY);
break; break;
case SB_LINERIGHT: case SB_LINERIGHT:
setScrollPos(hwnd, scrollPosX + fontWidth, scrollPosY); setScrollPos(scrollPosX + fontWidth, scrollPosY);
break; break;
case SB_PAGELEFT: case SB_PAGELEFT:
setScrollPos(hwnd, scrollPosX - 20, scrollPosY); setScrollPos(scrollPosX - 20, scrollPosY);
break; break;
case SB_PAGEDOWN: case SB_PAGEDOWN:
setScrollPos(hwnd, scrollPosX + 20, scrollPosY); setScrollPos(scrollPosX + 20, scrollPosY);
break; break;
case SB_THUMBPOSITION: case SB_THUMBPOSITION:
case SB_THUMBTRACK: case SB_THUMBTRACK:
setScrollPos(hwnd, getScrollPos(hwnd, SB_HORZ), scrollPosY); setScrollPos(getScrollPos(hwnd, SB_HORZ), scrollPosY);
break; break;
} }
} }
void TrackView::onKeyDown(HWND hwnd, UINT keyCode, UINT flags) void TrackView::onKeyDown(UINT keyCode, UINT flags)
{ {
switch (keyCode) switch (keyCode)
{ {
case VK_UP: setEditLine(hwnd, editLine - 1); break; case VK_UP: setEditLine(editLine - 1); break;
case VK_DOWN: setEditLine(hwnd, editLine + 1); break; case VK_DOWN: setEditLine(editLine + 1); break;
case VK_PRIOR: setEditLine(hwnd, editLine - windowLines / 2); break; case VK_PRIOR: setEditLine(editLine - windowLines / 2); break;
case VK_NEXT: setEditLine(hwnd, editLine + windowLines / 2); break; case VK_NEXT: setEditLine(editLine + windowLines / 2); break;
} }
} }
void TrackView::onSize(HWND hwnd, int width, int height) void TrackView::onSize(int width, int height)
{ {
const int oldWindowWidth = windowWidth; const int oldWindowWidth = windowWidth;
const int oldWindowHeight = windowHeight; const int oldWindowHeight = windowHeight;
@ -384,16 +387,18 @@ void TrackView::onSize(HWND hwnd, int width, int height)
windowLines = (height - topMarginHeight) / fontHeight; windowLines = (height - topMarginHeight) / fontHeight;
setEditLine(hwnd, editLine); setEditLine(editLine);
setupScrollBars(hwnd); setupScrollBars();
} }
LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
ASSERT(hwnd == this->hwnd);
switch(msg) switch(msg)
{ {
case WM_CREATE: case WM_CREATE:
onCreate(hwnd); onCreate();
break; break;
case WM_CLOSE: case WM_CLOSE:
@ -405,23 +410,23 @@ LRESULT TrackView::windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
break; break;
case WM_SIZE: case WM_SIZE:
onSize(hwnd, LOWORD(lParam), HIWORD(lParam)); onSize(LOWORD(lParam), HIWORD(lParam));
break; break;
case WM_VSCROLL: case WM_VSCROLL:
onVScroll(hwnd, LOWORD(wParam), getScrollPos(hwnd, SB_VERT)); onVScroll(LOWORD(wParam), getScrollPos(hwnd, SB_VERT));
break; break;
case WM_HSCROLL: case WM_HSCROLL:
onHScroll(hwnd, LOWORD(wParam), getScrollPos(hwnd, SB_HORZ)); onHScroll(LOWORD(wParam), getScrollPos(hwnd, SB_HORZ));
break; break;
case WM_PAINT: case WM_PAINT:
onPaint(hwnd); onPaint();
break; break;
case WM_KEYDOWN: case WM_KEYDOWN:
onKeyDown(hwnd, (UINT)wParam, (UINT)lParam); onKeyDown((UINT)wParam, (UINT)lParam);
break; break;
default: default:
@ -442,7 +447,7 @@ LRESULT CALLBACK trackViewWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
ASSERT(NULL == trackView); ASSERT(NULL == trackView);
// allocate a TrackView instance // allocate a TrackView instance
trackView = new TrackView(); trackView = new TrackView(hwnd);
// Set the TrackView instance // Set the TrackView instance
#pragma warning(suppress:4244) /* remove a pointless warning */ #pragma warning(suppress:4244) /* remove a pointless warning */

View File

@ -3,23 +3,25 @@
class TrackView class TrackView
{ {
public: public:
TrackView(HWND hwnd);
// events // events
void onCreate(HWND hwnd); void onCreate();
void onPaint(HWND hwnd); void onPaint();
void onVScroll(HWND hwnd, UINT sbCode, int newPos); void onVScroll(UINT sbCode, int newPos);
void onHScroll(HWND hwnd, UINT sbCode, int newPos); void onHScroll(UINT sbCode, int newPos);
void onSize(HWND hwnd, int width, int height); void onSize(int width, int height);
void onKeyDown(HWND hwnd, UINT keyCode, UINT flags); void onKeyDown(UINT keyCode, UINT flags);
// the window procedure // the window procedure
LRESULT windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT windowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void paintTracks(HDC hdc, RECT rcTracks); void paintTracks(HDC hdc, RECT rcTracks);
void setupScrollBars(HWND hwnd); void setupScrollBars();
void setScrollPos(HWND hwnd, int newScrollPosX, int newScrollPosY); void setScrollPos(int newScrollPosX, int newScrollPosY);
void setEditLine(HWND hwnd, int newEditLine); void setEditLine(int newEditLine);
void scrollWindow(HWND hwnd, int newScrollPosX, int newScrollPosY); void scrollWindow(int newScrollPosX, int newScrollPosY);
int getScreenY(int line); int getScreenY(int line);
@ -27,6 +29,8 @@ public:
int scrollPosX, scrollPosY; int scrollPosX, scrollPosY;
int windowWidth, windowHeight; int windowWidth, windowHeight;
int windowLines; int windowLines;
HWND hwnd;
}; };
ATOM registerTrackViewWindowClass(HINSTANCE hInstance); ATOM registerTrackViewWindowClass(HINSTANCE hInstance);