Problème avec CreateDC et wglMakeCurrent

PIXELFORMATDESCRIPTOR pfd = { /* otherwise fine for a window with 32-bit color */ }; HDC hDC = CreateDC(TEXT("Display"),NULL,NULL,NULL); // always OK int ipf = ChoosePixelFormat(hDC,&pfd); // always OK SetPixelFormat(hDC,ipf,&pfd); // always OK HGLRC hRC = wglCreateContext(hDC); // always OK wglMakeCurrent(hDC,hRC); // ! read error: 0xbaadf039 (debug, obviously) 

Mais ce qui suit fonctionne avec le même hRC:

 wglMakeCurrent(hSomeWindowDC,hRC); 

Ce qui précède fait partie d’un système d’initialisation OpenGL 3.0+ pour Windows.

J’essaie d’éviter de créer une fenêtre factice pour l’esthétique.

Je n’ai jamais utilisé CreateDC auparavant, alors j’ai peut-être raté quelque chose.

edit: hSomeWindowDC pointe vers une fenêtre DC avec un format de pixel approprié.

Plus d’informations:

Je souhaite créer un contexte de rendu OpenGL indépendant de la fenêtre.

En raison de la réponse choisie, il semble que je doive utiliser une fenêtre fictive (pas vraiment un gros problème, juste une poignée pour passer tout autour).

Pourquoi je voudrais faire ceci: Puisqu’il est possible d’utiliser le même contexte de rendu pour plusieurs fenêtres avec le même format de pixels dans le même thread, il est possible de créer un contexte de rendu (juste un conteneur pour les objects liés à gl ) indépendant d’une fenêtre particulière. De cette manière, il est possible de créer une séparation nette entre les initialisations graphiques et de l’interface utilisateur.

Le but initial du contexte n’est pas de rendre (même si je pense que l’on pourrait le rendre en textures). Si l’on voulait changer le contenu d’un tampon dans un contexte particulier, l’object de contexte souhaité lui-même aurait simplement besoin d’être mis à jour (puisqu’il transporte la fenêtre fictive avec elle, c’est possible). Le rendu dans une fenêtre est simple: comme indiqué ci-dessus, le contrôleur de domaine de la fenêtre doit uniquement avoir le même format de pixel. Simplement rendre le contexte de rendu et le courant continu de la fenêtre, et rendre.

S’il vous plaît noter que, au moment de cette écriture, cette idée est encore en test. Je vais mettre à jour ce post si ce changement (ou si je me souviens bien: P).

J’ai eu une cellule cérébrale inactive en lisant Petzold il y a 15 ans, qui revenait à la vie. Le contrôleur de domaine de CreateDC () est restreint. Bon pour obtenir des informations sur le périphérique d’affichage, la mesure, ce genre de choses. Pas bon à utiliser comme peinture régulière DC. Vous avez certainement besoin de GetDC ().

Ma routine d’initialisation OpenGL 3+ actuelle ne nécessite pas de fenêtre factice. Vous pouvez simplement essayer de créer un second RC et le rendre actuel en utilisant le DC de la fenêtre réelle. Jetez un coup d’oeil au didacticiel wiki OpenGL : OpenGL 3.1 Le premier sortingangle (C ++ / Win)