diff options
| -rw-r--r-- | wintable/new/coord.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/wintable/new/coord.h b/wintable/new/coord.h index d42ab67..592b141 100644 --- a/wintable/new/coord.h +++ b/wintable/new/coord.h @@ -38,6 +38,7 @@ static struct rowcol clientCoordToRowColumn(struct table *t, POINT pt) RECT r; struct rowcol rc; intptr_t i; + intptr_t row, column; // initial values for the PtInRect() check rc.row = -1; @@ -51,12 +52,15 @@ static struct rowcol clientCoordToRowColumn(struct table *t, POINT pt) // the row is easy pt.y -= t->headerHeight; - rc.row = (pt.y / rowht(t)) + t->vscrollpos; + row = (pt.y / rowht(t)) + t->vscrollpos; + if (row > t->count - 1) + // after the last row; don't select anything + return rc; // the column... not so much // we scroll p.x, then subtract column widths until we cross the left edge of the control pt.x += t->hscrollpos; - rc.column = 0; + column = 0; for (i = 0; i < t->nColumns; i++) { pt.x -= columnWidth(t, i); // use <, not <=, here: @@ -67,10 +71,14 @@ static struct rowcol clientCoordToRowColumn(struct table *t, POINT pt) // pt.x == 100 (first pixel of col 1) -> p.x - 100 == 0 >= 0 -> next column if (pt.x < r.left) break; - rc.column++; + column++; } - // TODO what happens if the break was never taken? + if (column > t->nColumns - 1) + // to the right of all columns; select nothing + return rc; + rc.row = row; + rc.column = column; return rc; } |
