2011-05-20 2 views
0

J'ai utilisé Visual Basic 6 dans le passé (LOONG il y a), et il y avait un contrôle appelé PictureBox où vous pouviez dessiner des choses, obtenir un contexte de périphérique si vous le vouliez, etc. J'essaie maintenant de savoir comment avoir un "contrôle" similaire en GDI/WinApi pur (pas de MFC, .net, atl, gdi +, etc). J'utilisais un contrôle de bouton owner-draw, mais vous ne pouvez pas (facilement) obtenir les coordonnées de la souris quand on clique dessus, donc j'ai pensé que j'avais besoin d'un autre contrôle. J'ai essayé un contrôle statique, mais celui-ci n'a pas de support propriétaire. J'ai essayé de manipuler WM_PAINT, mais, autant que je sache (après googling pendant des heures), il n'y a aucun moyen de l'utiliser pour mettre à jour juste une zone du client ou juste un seul HWND. Donc, ce que je demande, c'est comment les gens animent ou sélectionnent certaines zones d'une fenêtre, que ce soit un contrôle ou autre, en utilisant l'API GDI et Windows pure? Je sais que MFC a quelque chose appelé sous-classement, mais comme MFC n'est qu'un wrapper pour l'API Windows, il DOIT ÊTRE un moyen de le faire sans cela (comme je l'ai déjà dit, MFC n'est pas une option).Contrôle pour dessiner dans une fenêtre gdi

+0

Créez simplement une fenêtre enfant et effectuez sa peinture dans son WM_PAINT. Appelez 'InvalidateRect()' lorsque vous voulez forcer un re-paint. –

+0

Je suis désolé, mais je ne connais pas grand-chose à GDI. Comment gérer WM_PAINT juste pour une seule fenêtre enfant? – stelonix

+0

Vous gérez le message WM_PAINT dans votre procédure de fenêtre. –

Répondre

2

Créez une fenêtre enfant et effectuez sa peinture dans WM_PAINT. Appelez InvalidateRect() lorsque vous souhaitez forcer une nouvelle peinture.

1

En toute honnêteté, je pense que cela peut être un gros projet pour vous. Vous voudrez peut-être essayer quelques projets plus simples en utilisant l'API Windows avant d'essayer cela, mais je vais quand même vous donner quelques explications.

Vous allez avoir besoin de créer un contrôle personnalisé. L'utilisation d'un contrôle existant pour cela est une mauvaise pratique, car ce n'est pas la manière dont ils ont été conçus pour être utilisés. Pour créer un contrôle personnalisé, vous devez d'abord créer une classe de fenêtre avec WNDCLASSEX ou WNDCLASS.

WNDCLASS: http://msdn.microsoft.com/en-us/library/ms633576
WNDCLASSEX: http://msdn.microsoft.com/en-us/library/ms633577

Une fois que vous faites cela et définissez toutes les valeurs membres que vous devez, vous devez vous enregistrer la classe avec soit RegisterClass ou RegisterClassEx.

L'un des membres des objets WNDCLASS (EX) prend un pointeur de fonction de procédure de fenêtre. Toute fenêtre créée avec cette classe de fenêtre utilisera cette procédure de fenêtre.

Une fois que vous avez enregistré votre classe de fenêtre, vous pouvez créer une fenêtre en utilisant la classe de fenêtre que vous avez créée. Faites simplement CreateWindow (..., "VOTRE CLASSE WINDOW ICI", ...);

Maintenant, votre procédure de fenêtre devrait ressembler à ceci:

LRESULT CALLBACK MyDrawProcedure(HWND hwnd, UMSG uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_PAINT: 
     { 
     // Handle painting your control here. 
     } 
     break; 

     default: 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 

    return 0; 
} 

Eh bien, j'espère que cela aide un peu.

Questions connexes