옙~ 임프랍니다.
오늘도 변함없이.. 간단하고 쉬운, 그러나 유용한 팁 하나와 함께 즐거운
하루를 시작합시다.
어케 런타임에 컨트롤들을 클릭해서 이동, 즉 드래그할 수 있나...?
모를때는 엄청 복잡하게 구현을 해야 한다고 생각을 했었는데,
얼마전에 이 방법을 웹에서 발견하고는, 에구궁~ 했답니다.
이러한 처리를 위해서는, 드래그할 컨트롤에 WM_SYSCOMMAND를 주기만 하면 됩니다.
이 메시지는 윈도우의 무브, 사이즈변경, 닫기, 스크롤 등이 생길때
발생하는 메시지로서, 빌더의 윈32 헬프를 뒤져보면 자세한 옵션들이 나옵니다.
문제는.. M$ 에서 여기에 쓰일 수 있는 옵션들을 모두 공개하지
않았다는 것입니다. 예를 들어서, 약간의 상상력과 추리력을 발휘해보면,
당연히 윈도우를 드래그하는 것은 이 메시지에 의할 것임을 유추할 수 있습니다.
여기에 쓰이는 인자는, 매크로로 정의되지 않은 인자로, 값은 0xf012 입니다.
그러니까 드래그할 윈도우에 WM_SYSCOMMAND 메시지를 lparam으로 0xf012를 보내
면 되는겁니다. 코딩은,
void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton
Button, TShiftState Shift, int X, int Y)
{
ReleaseCapture();
Panel1->Perform(WM_SYSCOMMAND, 0xf012, 0);
}
와 같이 하면 되죠
델파이 소스로는,
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Panel1.Perform(WM_SYSCOMMAND, $f012, 0);
end;
ReleaseCapture() 가 필요한 이유에 대해서는...
윈 32 헬프를 참고하시길 바랍니다. (좀 길고, 설명하기도 까다롭습니다.)
이 내용은 볼랜드의 TI에서 참고한 것입니다.
참고로, 값을 이리저리 바꾸다 보면 드래그 사이징, 즉 드래그하여 컨트롤의
크기를 변경하는 옵션도 있습니다. 이 경우엔 각각 8개의 방향에 해당하는
옵션을 발견하실 수 있을겁니다. 뭐, 찾기 귀찮으신데 정말 필요하신 분은
말씀하시면 알려드리도록 하죠.
그럼, 도움되시길 바라면서, 이만...
독립문에서 임펠리테리였습니다.