음....
지난번 질문에 대한 답변은 제가 잘못 쓴것 같네요
저는 Parent와 Owner의 개념에 대해 설명하려 했는데...
이번에는 제대로 전달해야 될텐데...
[ 컨트롤을 이동시켜도 스크롤바가 생기지 않습니다]
코딩을 보니 Control을 이동하는 방법이 2가지네요
첫번째는 Control의 Left , Top 등의 값을 바꿔서 움직였구
두번째는 WM_SYSCOMMAND로 움직였네요
첫번째방식을 컨트롤이 ScrollBox영역을 벗어나면 자동으로 scrollbar가 생기죠
그런데 두번째 방식은 ScrollBar가 안생깁니다.
첫번재와 두번째 방식의 차이점을 찾으면 되겠죠
@설명
VCL의 모든 Control의 Left , Right , Width , Height를 조절하면
SetBound라는 함수가 호출됩니다.
SetBound라는 함수를 따라가보면..
Parent.AlignControl 이 호출됩니다.
즉 ScrollBox 안에 있는 Panel의 위치를 조절하면
ScrollBox.AlignControl이 호출되는것이죠
AlignControl 함수안에서 ScrollBar 의 크기라던가.. 뭐 그런것이 조정됩니다.
그런데 SysCommand로 하면 AlignControl 함수가 호출되지 않으니..
scrollbar가 나타나지 않는것입니다.
@해결책
SYSCOMMAND로 Panel을 움직이면서 ScrollBar가 나타나게 하려면?
SYSCOMMAND후에 ScrollBox의 AlignControl 을 호출해 주면 되겟죠
그런데 AlignControl 함수는 private 함수라서 접근이 쉽지 않습니다.
그래서 꼼수로...
SYSCOMMAND 뒤제 Panel의 위치를 살짝 움직였다가 원래대로 오면 .. ㅋㅋ 됩니다.
아래와 같이
void __fastcall TForm3::Panel1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
ReleaseCapture();
Panel1->Perform(WM_SYSCOMMAND,0xf012,0);
Panel1->Left=Panel1->Left+1;
Panel1->Left=Panel1->Left-1;
}
[SCROLLBOX영역을 이미지로 저장 가능한가요?]
문론 가능합니다.
님께서 하신 방식으로 해도 잘 될텐데 질문올리신것을 보면
ScrollBox의 안보이는 영역까지 이미지로 저장하고 싶으신것인가요?
만약 그런것이라면 쪼금 고생해야 합니다.
TForm에 보면 GetFormImage라는 함수가 있습니다
이함수는 Form의 Client영역의 이미지를 캡쳐해주는 함수입니다.
단 scroll영역까지는 아니구요
이함수의 vcl소스를 잘 살펴보시면 원리가 나옵니다.
TWinControl에 보면 WM_PAINT 메세지에 WParam에 dc를 넘겨주면
넘겨준 dc에다가 컨트롤의 이미지를 그려줍니다.
이원리를 이용한것이지요
좀 까다로우니... 구현은 직접함 해보세요
참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=753
그럼..
linuxman 님이 쓰신 글 :
: 안녕하세요.
: 장성호님 덕분에... control과 콤포넌트의 차이점을 알았습니다..(거듭 감사 합니다 )
:
: 스코롤박스 영역밖으로 , 컨트롤을 이동시켜도 스크롤 바가 생기지 않습니다.((첨부된 화일 참조 )
: 그리고 스코롤 박스 영역을 이미지로 저장한가요?
:
:
:
: 수고하세요...