|
전에도 똑같은 질문 올리셨죠?
기본적으로는 TStringGrid * 에서는 안되기 때문에.. 답변을 못해드렸는데...
아래코드는 직접 코딩으로 구현한것입니다.
MouseDown , MouseMove , MouseUp 이벤트를 이용했습니다.
급하게 만들어서 문제가 좀 있습니다.
[문제들]
1. 스크롤바가 생겼을때 처리 ( 옆으로 옮긴 위치만큼 처리안됨)
2. Paint문제가 좀 있는것 같아요
3. Click할때 Cell이 선택되는 문제...
그대로 가져가셔서 붙인후 테스트 해보세요
위 몇가지 문제만 해결하면 쓸만할 겁니다. (특히 1번문제 반드시 처리해야함)
시간이 없어서 이만..
조만간 시간되면 위에 문제도 해결해서 올려드릴께요
그럼
==========<<샘플>>===========================================================
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool bSize;
TPoint FsPoint,LaPoint;
int iColNum;
TColor clPenColor;
TPenMode pmPenMode;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//
for(int r=0;r<sgrd->RowCount;r++)
{
for(int c=0;c<sgrd->RowCount;c++)
{
sgrd->Cells[r][c]=IntToStr(r)+" - "+IntToStr(c);
}
}
pmPenMode=sgrd->Canvas->Pen->Mode;
clPenColor=sgrd->Canvas->Pen->Color;
sgrd->Options=sgrd->Options>>goColSizing;
}
//---------------------------------------------------------------------------
int __fastcall IABS(int a ,int b)
{
if(a>b)return a-b;
else b-a;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::sgrdMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(sgrd->Cursor==crHSplit)
{
bSize=true;
FsPoint.x=X;
FsPoint.y=0;
LaPoint.x=X;
LaPoint.y=sgrd->RowCount*(sgrd->DefaultRowHeight+sgrd->GridLineWidth);
sgrd->Canvas->Pen->Mode=pmNot;
sgrd->Canvas->Pen->Color=clBlack;
sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);
sgrd->Canvas->Pen->Mode=pmPenMode;
sgrd->Canvas->Pen->Color=clPenColor;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::sgrdMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(bSize)
{
sgrd->Canvas->Pen->Mode=pmNot;
sgrd->Canvas->Pen->Color=clBlack;
sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);
FsPoint.x=X;
FsPoint.y=0;
LaPoint.x=X;
LaPoint.y=sgrd->RowCount*(sgrd->DefaultRowHeight+sgrd->GridLineWidth);
sgrd->Canvas->MoveTo(FsPoint.x,FsPoint.y);
sgrd->Canvas->LineTo(LaPoint.x,LaPoint.y);
sgrd->Canvas->Pen->Mode=pmPenMode;
sgrd->Canvas->Pen->Color=clPenColor;
//enum TPenMode {pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy, pmMergePenNot, pmMaskPenNot, pmMergeNotPen, pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor};
}
else
{
if(!Shift.Contains(ssLeft))
{
int iX=0;
for(int c=0;c<sgrd->RowCount;c++)
{
iX=iX+sgrd->ColWidths[c]+1;
if(IABS(iX,X)<2)
{
sgrd->Cursor=crHSplit;
iColNum=c;
sgrd->Options>>goRangeSelect;
return;
}
}
}
if(sgrd->Cursor==crHSplit)
{
sgrd->Cursor=crDefault;//
sgrd->Options=sgrd->Options<<goRangeSelect;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::sgrdMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
sgrd->Invalidate();
sgrd->Canvas->Pen->Color=clWhite;
if(bSize)
{
int iX=0;
for(int c=0;c<iColNum;c++)
{
iX=iX+sgrd->ColWidths[c]+1;
}
sgrd->ColWidths[iColNum]=X-iX;
}
bSize=false;
sgrd->Cursor=crDefault;
sgrd->Options=sgrd->Options<<goRangeSelect;
}
//---------------------------------------------------------------------------
쥐르미온 님이 쓰신 글 :
: 회섹으로 된 고정셀의 경우, 마우스를 셀의 경계선쪽으로 가져가면 열이나 너비를 수정할 수가 있게 되는데요. 일반 셀에서는 그것이 불가능합니다.
:
: 맨윗줄을 회색의 고정셀로 하지 않고도 너비 수정을 할 수 있었으면 좋겠는데요. 어떻게 해야하죠?
|