TDBGrid如何通过HitTest判断鼠标是否在列表头以避免误触发拖动
解决TDBGrid调整列宽时意外触发拖动的问题
你可以通过TDBGrid的MouseCoord方法结合HitTest属性,精准判断鼠标位置是否属于表头或列宽调整区域,从而避免触发拖动操作。具体修改如下:
修改后的代码
void __fastcall TMyForm::DBGrid1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { TDBGrid* grid = static_cast<TDBGrid*>(Sender); TCellCoord cell = grid->MouseCoord(X, Y); // 判断鼠标是否位于表头标题、列宽调整区域或表头其他区域 if (grid->HitTest(cell.X, cell.Y) == ghColTitle || grid->HitTest(cell.X, cell.Y) == ghColumnResize || grid->HitTest(cell.X, cell.Y) == ghHeader) { return; // 位于表头相关区域,跳过拖动逻辑 } if (DragDetect(grid->Handle, Point(X,Y))) { grid->BeginDrag(true); } }
关键说明
MouseCoord(X,Y):将屏幕坐标转换为TDBGrid内部的单元格坐标(列索引+行索引)。HitTest(cell.X, cell.Y):返回鼠标所在位置的类型,常用枚举值包括:ghColTitle:鼠标在列标题上ghColumnResize:鼠标在列宽调整的分隔线上ghHeader:鼠标在表头的其他区域
- 只要命中以上任意一种表头相关区域,就直接返回,不执行拖动启动逻辑,这样调整列宽时就不会误触发拖动了。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

