Bonjour,
Je participe - à temps partiel - à la construction d'un programme qui reproduira un peux l'explorateur windows, en mieux, en utilisant les ressources de la carte vidéo.
Ceci dit, MÊME les icônes seront dessinés avec une fonction utilisant des algorithmes d'anti-aliasing, genre supersampling - oui c'est lent mais on est encore au stade alpha.
Pour l'instant, j'essaie de reproduire le comportement de NtUserDrawIconEX() - alias DrawIconEx(). Ensuite, j'implémenterai similaire, maiss utilisant des fonctions extraites de bibliothèques spécialisées.
Mais... je désire ne pas dépenser trop de temps sur ce travail. Voilà pourquoi je m'essaie ici.
Mon problème est qu'avec ma fonction actuelle, la qualité est plus que médiocre. Ce n'est rien comparé au travail fait par NtUserDrawIconEx().
DrawIconEx utilise sûrement d'autres fonctions comme MaskBlt, TransparentBlt, etc. Je me débrouille, mais je ne connais pas bien GDI32.
J'aimerais qu'on m'aide à raffiner mon code.
Voici ladite fonction:
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 void __stdcall EXPERIMENTAL_DrawIcon(const HDC hDC, const int x, const int y, const HICON hIcon, const HBRUSH hbrBackground) { // // Note: On travaille avec des icones 48x48 seulement. // ICONINFO icon_info; HDC hdcmem, hdctmp; HBITMAP hbm_mem, hbm_old_1, hbm_old_2; hdcmem = CreateCompatibleDC(hDC); hdctmp = CreateCompatibleDC(hDC); hbm_mem = CreateCompatibleBitmap(hDC, 48, 48); hbm_old_1 = SelectObject(hdcmem, hbm_mem); GetIconInfo(hIcon, &icon_info); if (hbrBackground) { HBRUSH hbrOld; hbrOld = SelectObject(hdcmem, hbrBackground); PatBlt(hdcmem, 0x0, 0x0, 48, 48, PATCOPY); SelectObject(hdcmem, hbrOld); } hbm_old_2 = SelectObject(hdctmp, icon_info.hbmMask); BitBlt(hdcmem, 0x0, 0x0, 48, 48, hdctmp, 0x0, 0x0, SRCAND); if (icon_info.hbmColor) { SelectObject(hdctmp, icon_info.hbmColor); BitBlt(hdcmem, 0x0, 0x0, 48, 48, hdctmp, 0x0, 0x0, SRCINVERT); } BitBlt(hDC, x, y, 48, 48, hdcmem, 0, 0, SRCCOPY); SelectObject(hdctmp, hbm_old_2); SelectObject(hdcmem, hbm_old_1); DeleteObject(hbm_mem); DeleteDC(hdctmp); DeleteDC(hdcmem); }
Voici des icônes dessinés avec NtUserDrawIconEx():
Voici des icônes dessinés avec la fct expérimentale:
Comme vous voyez, la différence est très choquante...
Il y a du noir aux contours...
Merci,
Sincèrement,
Array
Partager