[VC++/MFC] Doorsturen berichten met DirectShow

Pagina: 1
Acties:

  • Harmakhet
  • Registratie: Februari 2002
  • Laatst online: 19-02 14:06

Harmakhet

Keeper of wisdom

Topicstarter
We zijn op school met een project bezig waarbij we een software DVD-speler (à la PowerDVD) aan het maken zijn als SDI. We zijn bezig in VC++ met MFC en DirectShow. We gebruiken de DVDSample uit de DirectX SDK als voorbeeld. De sample is echter in gewone C++ code geschreven, niet MFC.

We hebben hem zover af dat hij een DVD-film afdraait in een apart venster. Dit doet de applicatie automatisch door de IVideoInterface. Dit aparte venster vangt echter geen berichten af. Of misschien doet ie dit wel maar stuurt ze niet door naar de view-klasse. De sample registreert eerst een apart window en creëert er een. Dit doen ze als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// register playback window
    WNDCLASSEX wndclass = {
        sizeof(WNDCLASSEX),
        CS_HREDRAW | CS_VREDRAW,
        CDvdCore::WndProc,
        0,
        0,
        m_hInstance,
        LoadIcon(m_hInstance, MAKEINTRESOURCE(IDI_APPICON)),
        LoadCursor(NULL, IDC_ARROW),
        HBRUSH(COLOR_WINDOW+1),
        NULL,
        TEXT("EventWindow"),
        NULL
    };

    RegisterClassEx(&wndclass);

    // create the playback window

    RECT rPlayback = GetPlaybackWindowRect();

    m_hWnd = CreateWindow(
        TEXT("EventWindow"),
        TEXT("Video Window"),
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        rPlayback.left, 
        rPlayback.top, 
        rPlayback.right - rPlayback.left, 
        rPlayback.bottom - rPlayback.top,
        NULL,
        NULL,
        m_hInstance,
        this); // we send the this pointer here so we can retrieve it from WM_CREATE later



Dat lukt ons niet met MFC.

Hoe kunnen we ervoor zorgen dat berichten van het 'afspeelscherm' doorgestuurd worden naar de view-klasse?

hard ware - The part of the computer that can be kicked


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is je probleem nu? Wil je die native win32 code naar MFC omzetten?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Harmakhet
  • Registratie: Februari 2002
  • Laatst online: 19-02 14:06

Harmakhet

Keeper of wisdom

Topicstarter
Ons probleem is dat het afspeelscherm geen berichten afvangt. Dit scherm komt zo uit de lucht vallen. Dit regelt DirectShow helemaal zelf.

De native WIN32 code kan misschien omgezet worden maar wij weten niet hoe dit moet. Als iemand dit wel kan, horen wij dit graag. Maar misschien moet dit in MFC wel op een heel andere manier. Ook dat weten wij niet. Als iemand dit kan, horen wij ook dit graag.

hard ware - The part of the computer that can be kicked


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
wat bedoel je met geen berichten ontvangt? (je bedoelt Message naar de WindowProc?).

Het enige wat me een beetje opvalt is dat je als Message Proc een Method doorgeeft in de Window Class - dit kan niet (toch niet echt). Die method moet dan echt wel als static (and _stdcall) zijn doorgeven. De beste oplossing is een static friend met de MsgProc van je window dus in de globale gevallen... MFC lost dit ook zo op al zul je dat niet zien (Message_Maps etc...). Dus:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Class CDVDCore
{
public:
  friend void CDVDCORE_MessageProc(); 

  void init()
  {
     WNDCLASS.msgproc = CDVDCORE_MessageProc(); 
//dan met CreateWindow Ex idd die THIS doorgeven want die zit dan in de
//Long Extra Data en dan je msgproc weten tot welk object hij behoort
//aangezien ie aangeroepen kan worden door meerdere instances van je
//Classe (alhoewel zoals je al schreef dit eigenlijk een Singleton zou zijn ivm SDI...)

  }
}

static _stdcall void (of int)  CDVDCORE_MessageProc(...)
{
  WM_CREATE: instCDVDCore* = GetWindowUserData();
                        instCDVDCore->DoStuff(); 

}


dit is geen productie code maar gewoon de structuur die je moet toepassen... het heeft allemaal te maken dat een CDVDCore::MSgProc niet echt bestaat aangezien die afhangt van de instancce(new) die je hebt gedaan. Bovendien is dit niet zomaar een function pointer maar een pointer in de Virtual Function Table... MAW je static msgproc vraagt eerst met welk object / instance hij nu bezig is. Zo werkt Windows aangezien dit allemaal pure C is en MFC maar een simpel wrapper rond de API (en werkt met de PREPROCessor die al die code voor jouw maakt ;).