IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Problème avec CreateCompatibleDC


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut Problème avec CreateCompatibleDC
    Bonjour à tous,

    j'ai un petit soucis d'utilisation de DC.
    J'utilise un composant d'impression qui me fournit un HDC pour une fenetre de prévisualisation.
    Lorsque j'y accède directement avec les fonctions de l'API, tout va bien. (par exemple, avec un FillRect, avec un brush rouge).

    Mais j'aimerais d'abord travailler sur un DC temporaire et après, faire un BitBlt sur le HDC qui m'est fourni.
    Donc
    CreateCompatibleDC
    CreateCompatibleBitmap
    SelectObject
    CreateBrushIndirect et FillRect
    BitBlt

    Et bien, ... le résultat est noir ! pas de rouge, et si j'affiche un texte, il est très dégradé par rapport à l'original en prévisualisation (meme si à l'impression, il est nickel)

    Info bonus : Sur les deux DC,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (GetDeviceCaps (hdc_,TECHNOLOGY) == DT_RASPRINTER)
    me retourne vrai


    Si quelqu'un a une explication sur le fait que le HDC ne soit pas si compatible que ca ... je suis preneur


    Merci de votre aide

    Nico

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Serait-ce une piste ?
    http://support.microsoft.com/default.aspx?scid=kb;en-us;195830

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Salut Aurélien, c'est effectivement une piste interessante,
    mais si je fais un CreateCompatibleDC, est-ce qu'on peut quand meme parler de 2 devices différents ?

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    En fait j'ai pas bien compris tes DC : y'a un bitmap, une imprimante et une fenêtre ?
    Comment tu les utilises ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    attention si tu utilises un bitmap DDB et que tu essayes de l'imprimer c'st normal ....
    si c'est le cas voir la faq (pour infos) , il te faudra utiliser un DIB
    http://c.developpez.com/faq/vc/?page...PrintDialgoBox

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    En fait, j'ai pas de Bitmap. J'ai juste à ma dispo un OCX qui me fournit un HDC qui est une fenetre de prévisualisation pour impression (ce qui fait qu'elle est en mode imprimante, comme GetDeviceCaps me le dit).

    Donc, depuis ce DC, je peux faire toutes les opérations GDI que je veux, ca marche très bien.

    Ce que je veux faire, c'est continuer à faire mes opérations GDI mais dans un DC "temporaire", afin de pouvoir faire d'autres traitements et puis après ces traitements, rebalancer tout dans le HDC fournit par mon OCX.

    Donc, je crée un DC compatible à partir du DC de l'OCX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mem_dc = CreateCompatibleDC(ocx.hdc);
    Puis je créé un bitmap compatible à partir du nouveau DC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mem_bmp = CreateCompatibleBitmap(mem_dc, height, width);
    Puis je le selectionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    old_bmp = SelectObject(mem_dc, mem_bmp);
    Je fais mes opérations GDI, pour l'exemple, un FillRect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FillRect(mem_dc, r, myBrush);
    Et ensuite, je fais un bitblt vers le HDC de mon OCX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BitBlt(ocx.hdc, 0, 0, height, width, mem_dc, 0, 0, SRCCOPY);
    C'est ainsi que j'obtiens les altérations et les problèmes de couleurs.
    Dois-je alors passer par GetDIBits et SetDIBits comme le dit le support microsoft ?

    Déplacé vers le forum Développement Windows --> Modération de modérateur

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    a mon avis le probleme viens quand meme du bitmap vu que ton dc est un dc d'impression...

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    alors, moi j'utilise un bitmap vu que je sais pas faire autrement (et que sans CreateCompatibleBitmap et sans SelectObject ca marche pas)

    Si on peut faire autrement, je veux bien ...

    Mais, je ne pourrais pas utiliser GetDIBits sans bitmap

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Bon, j'ai tenté la méthode avec GetDIBits ... mais soit j'ai rien compris, soit ca marche pas ... et vu que ca marche pas, j'ai peut-etre rien compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    		HDC memHDC = CreateCompatibleDC((HDC)Hdc);
    		HBITMAP memBmp = CreateCompatibleBitmap(memHDC, r.right, r.bottom);
    		HBITMAP oldBmp = (HBITMAP) SelectObject(memHDC, memBmp);
    		DrawOn(memHDC);
    		SIZE sizeBmp = GetBmpSize(memBmp);
    		if&#40;sizeBmp.cy < 0&#41;
    			return;
    		LPVOID lpMem = VirtualAlloc&#40;NULL, 4*sizeBmp.cx*sizeBmp.cy, MEM_COMMIT, PAGE_READWRITE&#41;;
    		if&#40;lpMem == NULL&#41;
    			return;
    		BITMAPINFO bi;
    		ZeroMemory&#40;&bi, sizeof&#40;BITMAPINFO&#41;&#41;;
    		bi.bmiHeader.biSize			= sizeof&#40;BITMAPINFOHEADER&#41;;
    		bi.bmiHeader.biPlanes		= 1;
    		bi.bmiHeader.biBitCount		= 32;
    		bi.bmiHeader.biWidth		= sizeBmp.cx;
    		bi.bmiHeader.biHeight		= sizeBmp.cy;
    		bi.bmiHeader.biCompression	= BI_RGB;
    		int nResult = GetDIBits&#40;memHDC, memBmp, 0, sizeBmp.cy, lpMem, &bi, DIB_RGB_COLORS&#41;;
    		if&#40;nResult == 0&#41;
    		&#123;
    			VirtualFree&#40;lpMem, 0, MEM_RELEASE&#41;;
    			return;
    		&#125;
    		HBITMAP bmp = CreateCompatibleBitmap&#40;&#40;HDC&#41;Hdc, r.right, r.bottom&#41;;
    		if &#40;!SetDIBits&#40;&#40;HDC&#41;Hdc, bmp, 0, sizeBmp.cy, lpMem, &bi, DIB_RGB_COLORS&#41;&#41;
    			return;
    		VirtualFree&#40;lpMem, 0, MEM_RELEASE&#41;;
    Pas d'erreur dans les retours d'API, pas de handles à NULL, mais ... pas de recopie !

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    bon ...

    finalement, je vais faire autrement ...
    Je vais agir directement sur l'affichage, et tant pis, pas de DC temporaire.

    Merci de vous etre penché sur mon cas


    A+

    Nico

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    L'appel à CreateCompatibleBitmap() doit se faire sur le DC d'origine et non sur le nouveau DC. (Et ça, c'est marqué dans MSDN...)

    Ensuite, tu sélectionnes le nouveau bitmap dans le nouveau DC avec SelectObject()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo