|
phoihos 님이 쓰신 글 :
: 김영욱 님이 쓰신 글 :
: : phoihos님 안녕하세요.
: : 저는 김영욱이라고 합니다.
: : 검색을 해보니까 phoihos님께서 DirectX부분에 대해서 답변을 많이 해주셔서 질문을 드리고 싶네요..
: : (죄송합니다.)
: :
: : 제가 현재 하고 있는것은 윈도우 미디어플레이어를 이용한 App를 만들고 있습니다.
: : 여기서 실제 동영상이 나오는 부분에 어떠한 텍스트를 보여 주고 싶은데
: : 미디어플레이어의 화면이 나오는 부분위로 어떠한 VCL컨트롤도 올라가지 않습니다.
: : 아시다시피 미디어플레이어(OCX)는 TWinControl 에서 상속받은 TOleContol의 파생클래스 입니다.
: : 이점때문인지 아니면 화면이 Uodate되면서 생기는 이벤트 때문인지 원인을 잘 모르겠습니다.
: :
: : 강제로 VCL컨트롤(TEdit, TLabel)들에 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE:SWP_NOSIZE); 도 해보았지만, 안돼네요...
: :
: : 우연히 델마당에서 DirectX를 이용한 미디어플레이어 컴포넌트를 찾긴 찾았는데,
: : 빌더에서 인스톨이 안되더 군요..(아마 몇개의 파스칼 유닛이 없는것 같습니다.)
: :
: : 서론이 길었네요..
: : DirectX를 사용하면 이러한 기능이 가능할것 같은데요.. (DirectX는 거의 초보입니다.)
: : DX모드로 변경하지 않고 사용하면서 미디어 플레이어의 위로 올라오는 Text를 뿌릴수 있는
: : 방법은 없는지요...
: :
: : 답변해주시면 감사하겠습니다.
: :
: : 김영욱
: :
: :
:
: 안녕하세요...
: phoihos입니다...
:
: 흠...일종의 자막재생프로그램을 만들겠다는 거군요?
:
: 가장 간단한 방법으로...
: SetCooperlationLevel으로 일단 윈도우를 DX NormalMode로 설정합니다.
: 그리고 MCIDEVICE로 동영상을 출력합니다.
: 그리고 Timer나 다른 메세지 루프를 이용해 BackBuffer와 FrontBuffer를
: Blt시킵니다.
: (참고, Flip은 FullMode에서만 쓰입니다.)
: 이때 GetDC(핸들)와 TextOut("문자열"); 함수를 이용에 BackBuffer에
: 글씨를 출력하고 FrontBuffer에 Blt시키면
: 화면에 글씨가 출력 되겠죠?
: 그외에 DirectShow를 이용한 방법도 있는 걸로 암니다만...
: 아직 해보지 않은 관계로 뭐라 설명해 드리기 힘드네요...
: 그냥 참고만 하세요...
: 그럼...
제라툴입니다.
Q&A를 검색하다
이글을 보게 되었는데요..
MCI DEVICE나 DirectShow로 동영상을 출력하게 되면
조금 다른 방법으로 랜더링 되어 지게 됩니다.
즉 우리가 정해주는 폼위에 랜더링 하는 것 처럼 보이지만
절대 그런것이 아니라.. Video Renderer에 위에 기본적으로 랜더링
되게 되어 있습니다. 또 이런 Renderer에 위에 다시 Overlay 해주기 위해서는
Renderer 의 핸들을 얻어서 그위에 드로우 해주어야 합니다.
하지만 이런 방법은 어느정도 한계점을 가지고 있습니다. 즉
Handle를 얻어 윈도우 프로시저를 교체한후 WM_PAINT에서 처리하게 되면
24Bit이상의 TrueColor처리는 힘들어 집니다. 즉 랜더링 해주는 Overlay화면이
깜빡거리는 현상이 발생하니까요..
즉 사사미 같은 자막 랜더링 프로그램은 이런 식으로 제작된게 아닐 겁니다.
다시말해 DirectShow와 DirectDraw를 함께 적용해서 해야 합니다.
IDirectDrawVideo라는 인터페이스 가있는데요.. DirectDraw를 통해 Phoihos님이 말씀하신 방법으로
처리하신후 DirectDrawVideo를 통해서 랜더링 표면을 처리해주셔야합니다.
이런 방법으로 아마도 사사미는 제작 되었을 겁니다..
또 팁한가지...
사사미가 윈도우 98에서 돌아가는 걸로아는데..
래이어드 폼을 사용하지 않고 어케 투명함을 구현 했냐는 질문을 할시는 분들이 있더군요.. ㅡㅡ;
그건 AlphaBlend()라는 API함수를 통해서 처리가 가능합니다... 래이어드 폼보다는 부드럽지 않지만
랜더링 속도가 빠르고 사사미정도의 투명함을 표현하기에는 적당합니다...
|