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 :

[GDI] dessin qui s'affiche en couleur puis en noir et blanc


Sujet :

Windows

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut [GDI] dessin qui s'affiche en couleur puis en noir et blanc
    Bonjour,

    J'ai une application qui doit dessiner à intervalles très réguliers dans un DC.

    Je ne souhaite pas gérer pas les messages WM_PAINT, mais lancer directement mes fonctions de dessins sur le DC de la fenetre active.

    ceci marche bien pendant environ les 30 premiers affichage de mon dessin, tout s'affiche en couleur,
    Au delà les fonds en couleur (FillRect) deviennent blanc, et mes traits en couleur deviennent noir, en on voir une sorte de scintillement du haut vers le bas.

    (le fait de ralentir la boucle par des sleep ne change rien)

    Que se passe-t-il, comment y remédier ?

    D'avance merci pour votre réponse

  2. #2
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Dur de se prononser sans code. Libères-tu bien tes objets ? Comment t'y prends-tu ?

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    voici un code qui résume le problème :

    je m'attend à ce que j'ai une fenetre avec un fond vert, ce que j'ai pendant une trentaine d'itération du while, puis tout devient blanc et je ne vois meme plus la barre du haut de la fenetre...

    What's happen Doc ?

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    LRESULT CALLBACK privateEvent(HWND _handle, UINT _message, WPARAM _wParam, LPARAM _lParam)
    {
            return DefWindowProc(_handle, _message, _wParam, _lParam);
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    
            HWND handle = 0;
    
            HINSTANCE instance = GetModuleHandle(NULL);
    
            WNDCLASSEX l_windowClass;
            l_windowClass.cbSize            = sizeof(WNDCLASSEX);
            l_windowClass.style             = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   // Redraw On Move, And Own DC For Window
            l_windowClass.lpfnWndProc       = privateEvent;
            l_windowClass.cbClsExtra        = 0;
            l_windowClass.cbWndExtra        = 0;
            l_windowClass.hInstance         = instance;
            l_windowClass.hIcon             = LoadIcon(NULL, IDI_WINLOGO); //IDI_APPLICATION
            l_windowClass.hCursor           = LoadCursor(NULL, IDC_ARROW);
            l_windowClass.hbrBackground     = reinterpret_cast<HBRUSH>&#40;COLOR_WINDOW+1&#41;;
            l_windowClass.lpszMenuName      = NULL;
            l_windowClass.lpszClassName     = "Render2D";
            l_windowClass.hIconSm=LoadIcon&#40;NULL, IDI_APPLICATION&#41;;
    
            if &#40;RegisterClassEx&#40;&l_windowClass&#41;&#41;
            &#123;
                    DWORD l_windowStyle             = WS_OVERLAPPEDWINDOW;
                    DWORD l_windowExtendedStyle     = WS_EX_APPWINDOW;
    
                    l_windowStyle           = WS_POPUP;										// Set The WindowStyle To WS_POPUP &#40;Popup Window&#41;
                    l_windowExtendedStyle   = WS_EX_APPWINDOW;						// Set The                           Extended Window Style To WS_EX_TOPMOST
    
                    RECT l_windowRect;
                    l_windowRect.top        = 0;
                    l_windowRect.left       = 0;
                    l_windowRect.right      = 800;
                    l_windowRect.bottom     = 600;
    
                    AdjustWindowRectEx&#40;&l_windowRect, l_windowStyle, 0, l_windowExtendedStyle&#41;;
    
                    handle = CreateWindowEx&#40;
                            l_windowExtendedStyle,
                            "Render2D",
                            "test",
                            l_windowStyle | WS_CLIPCHILDREN | WS_VISIBLE,
                            0, 0,
                            l_windowRect.right  - l_windowRect.left,
                            l_windowRect.bottom - l_windowRect.top,
                            NULL, NULL,
                            l_windowClass.hInstance,
                            NULL
                    &#41;;
            &#125;
    
    
            HDC dc = GetDC&#40;handle&#41;; //BeginPaint&#40;handle, &ps&#41;;
            HPEN winPen;
            HBRUSH winBrush;
            HRGN l_region; 
    
    
            while&#40;true&#41;
            &#123;		
                    static MSG l_message;
    
                    if &#40;PeekMessage&#40;&l_message, NULL, 0, 0, PM_REMOVE&#41;&#41;
                    &#123;
                            if &#40;l_message.message == WM_QUIT&#41;   break;
    
                            // Deal With Window Messages
                            TranslateMessage&#40;&l_message&#41;; // Translate The Message
                            DispatchMessage&#40;&l_message&#41;;  // Dispatch The Message
                    &#125;
          
    	        winPen   = CreatePen&#40;PS_SOLID, 1, RGB&#40;255, 0, 0&#41;&#41;;
                    winBrush = CreateSolidBrush&#40;RGB&#40;0, 255, 0&#41;&#41;;
    
                    SelectObject&#40;dc, winPen&#41;;
    
                    static RECT l_rect;
                    l_rect.left     = 0;
                    l_rect.right    = 800;
                    l_rect.top      = 0;
                    l_rect.bottom   = 600;
    
                    l_region = CreateRectRgn&#40;0, 0, 800, 600&#41;; 
                    SelectClipRgn&#40;dc, l_region&#41;; 
    
    	        FillRect&#40;dc, &l_rect, winBrush&#41;;
    
            &#125;
    
            DeleteObject&#40;winBrush&#41;;
            DeleteObject&#40;winPen&#41;;
           // etc...
    
            return 0;
    &#125;

  4. #4
    mat.M
    Invité(e)
    Par défaut
    HDC dc = GetDC(handle); //BeginPaint(handle, &ps);
    un GetDC()=un ReleaseDC() !!!!

    Si l'affichage s'effectue mal et donne n'importe quoi c'est que comme le suggère HW des objets graphiques du GDI sont crées et mal effacés ou non

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    le releaseDC est dans le mais ca ne gène en rien puisque le releaseDc est effectué à la fin du programme, donc après la boucle, donc ca ne peut pas être la cause de ce qui se passe à l'intérieur de la boucle

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2009, 08h16
  2. Réponses: 17
    Dernier message: 12/06/2007, 14h57
  3. Réponses: 3
    Dernier message: 05/10/2006, 13h16
  4. Transformer un jpg couleur en jpg noir et blanc
    Par bractar dans le forum Langage
    Réponses: 3
    Dernier message: 02/02/2006, 13h35
  5. diffirencier entre les images couleurs et les noir et blanc
    Par passion_info dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/05/2005, 14h15

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