|
에.. 너무 힘들게 생각하시는것 같아서 노가다를 알려드리려고 합니다.
캡션바 없이 움직이는 예제들을 보면.. 좀 편한 방법으로 하고 있는데 -ㅅ-;;
독립폼이 아니거나 간단한 경우를 벗어나게 되면 힘들어 지는 경우가 있습니다.
소스에서(전체 소스중의 일부이기 때문에 없는 부분이 있으므로)에서 얻어내지 마시고
방법만 얻어내시고 스스로 구현해 보세요.
간단한 원리는. Mouse가 DownEvent를 발생할때 위치를 기억해 두고,
Move가 발생하면 (버튼다운 상태에서) 새로운 위치와의 차이만큼 폼을 움직여 주면 됩니다.
그리고 움직인 다음 해당 마우스 위치를 새로 갱신시켜 주구요.
기본원리죠 '.';;
근데 저는 DirectShow이런건 잘 몰라서 -_- 잘 될지는 모르겠네요
OnClick는 엄밀히 말하면 마우스 이벤트가 아닙니다. MouseDown을 사용하시고,
DirectShow때문에 그것도 발생을 안(?)하면 WndProc를 오버라이딩 해서 사용하세요.
WndProc가 안먹으면 타이머등을 이용해서 마우스 정보를 10ms정도 단위로 검사해서
직접 이벤트 처리를 하시면 됩니다.
수고하세요
case WM_MOUSEMOVE :
if(!GetCursorPos(&pt))
return;
// 눌린 상태에서 이동하면 그에 따른 변경을 함
switch(mcState) {
case mdMove :
MoveWindow(Handle, Left - (ox - pt.x), Top - (oy - pt.y), ClientWidth, ClientHeight, true);
ox = pt.x;
oy = pt.y;
ResetPos();
break;
case mdSize :
if(CanSizing) {
MoveWindow(Handle, Left, Top - (oy - pt.y), ClientWidth - (ox - pt.x), ClientHeight + (oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
}
break;
case mdsLT :
MoveWindow(Handle, Left-(ox - pt.x), Top-(oy - pt.y), ClientWidth+(ox - pt.x), ClientHeight+(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsT :
MoveWindow(Handle, Left, Top-(oy - pt.y), ClientWidth, ClientHeight+(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsTR :
MoveWindow(Handle, Left, Top-(oy - pt.y), ClientWidth-(ox - pt.x), ClientHeight+(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsR :
MoveWindow(Handle, Left, Top, ClientWidth-(ox - pt.x), ClientHeight, true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsRB :
MoveWindow(Handle, Left, Top, ClientWidth-(ox - pt.x), ClientHeight-(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsB :
MoveWindow(Handle, Left, Top, ClientWidth, ClientHeight-(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsBL :
MoveWindow(Handle, Left-(ox - pt.x), Top, ClientWidth+(ox - pt.x), ClientHeight-(oy - pt.y), true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
case mdsL :
MoveWindow(Handle, Left-(ox - pt.x), Top, ClientWidth+(ox - pt.x), ClientHeight, true);
ox = pt.x;
oy = pt.y;
ResetSize();
break;
}
break;
case WM_LBUTTONDOWN :
// 클릭에 대한 모드 변경
if(GetCursorPos(&pt)) {
mcState = mnState;
ox = pt.x;
oy = pt.y;
}
break;
case WM_LBUTTONUP :
// 창 제거 명령
// 눌렸던 버튼들을 원상복귀 시킨다.
if(mcState != mnState && Visible)
Perform(WM_PAINT, 0, 0);
// 모드 해제
mcState = mdNone;
break;
heartsim 님이 쓰신 글 :
: 안녕하세요.음...몇일전 질문을 올렸는데...혼자서 해결을 할려고 했는데 아직까지 해결을 못했네요...
: 그래서 해법을 공유하는 차원에서 다시 한번 올립니다.
:
: 전 지금 Directshow8.1로 멀티미디아를 만들고 있습니다.
: 그런데 마우스로 동적서브폼이 드래그가 안되는군요.
: 그리고 마우스OnClick이벤트도 안먹는군요..^^;
:
: 대략 말씀을 드리면...
: 일단 아래쪽에 메인폼이 있고, 메인폼 위에 Video창인 동적서브폼이 붙어 있습니다.
: (위아래로 붙어있는거죠..둘다 캡션이 없는 폼임..
: 따라서 이동시에는 클라이언트영역을 마우스로 드래그해서 이동을 함)
:
: 비디오창인 서브폼은 폼위에 Image1컴포넌트를 올려놓고 거기다 배경그림을 넣었습니다.( 문제의 폼형태 )
:
: 프로그램을 실행시키고 파일재생이 안될경우에는 비디오창(서브폼)이 마우스로 드래그가 됩니다.
: void __fastcall TForm1::Image1MouseDown(TObject *Sender,
: TMouseButton Button, TShiftState Shift, int X, int Y)
: {
: ReleaseCapture();
: SendMessage(Handle,WM_SYSCOMMAND,0xf012,0);
: }
:
: 그런데, 비디오창에 비디오가 재생되고 있을 시에는 마우스로 드래그가 안되는군요.
: 역시나 OnClick이벤트도 안 먹구요...
: 영상이 재생될때에는 이벤트가 안먹을 수 밖에 없는건지요...
:
: 여러가지 방법으로 해보고 Tip란을 이용해서도 시도해보았으나 마찬가지로 영상파일재생시에는
: 동적서브폼이 마우스로 드래그가 안됩니다.
:
: 사사미 같은 미디어를 보면 재생시에도 비디오창이 드래그가 되는데요...
: 저도 역시나 계속해서 방법을 찾아보도록하겠습니다........^^;
:
: 넘 두서없이 말씀드렸네요........
:
: 즐거운 하루 되십시요...
|