Je suis actuellement en train de développer une GUI à base de l'API
WIN32. Et je suis confronté à plusieurs problèmes :
1-Je n'arrive pas à trouver une bibliothèque permettant d'afficher les
bmp ET les jpgs, tga, gif (éventuellement les lire) et images de ce
genre;
2-Je n'arrive pas à faire fonctionner l'implémentation des fonctions
de retournement d'images, ... en bref, de modifications d'images;
3-Je n'arrive pas à trouver une fonction permettant de changer le
design d'une fenêtre, à savoir par exemple son fond, actuellement elle
ressemble à une fenêtre Windows95;
4-Je n'arrive pas non plus à trouver de fonction permettant de changer
le design d'un bouton, ils font plus du type de Windows95
actuellement;
5-Dans mon switch qui analyse les messages provenant de l'utilisateur,
lorsque je fais plusieurs if pour savoir -via le lParam- de quel
bouton vient le message, il ne se passe rien;
6-Je n'arrive pas non plus à faire fonctionner les TreeView, notamment
à cause de ressources manquantes pour les images (plus, moins,
dossier...).
Je sais que je demande beaucoup et qu'une seule personne ne saura pas
nécessairement répondre à toutes mes questions, mais merci à tous ceux
qui voudront bien apporter leur pierre ;).
> 1-Je n'arrive pas à trouver une bibliothèque permettant d'afficher les
> bmp ET les jpgs, tga, gif (éventuellement les lire) et images de ce
> genre;
GDI+ gère tout.
Il y a d'autres méthodes classiques comme OleLoadPicture() (KB218972)
ou par le Shell
> 3-Je n'arrive pas à trouver une fonction permettant de changer le
> design d'une fenêtre, à savoir par exemple son fond, actuellement elle
> ressemble à une fenêtre Windows95;
> 4-Je n'arrive pas non plus à trouver de fonction permettant de changer
> le design d'un bouton, ils font plus du type de Windows95
> actuellement;
Il faut utiliser un Manifest :
http://msdn.microsoft.com/en-us/library/ms997646.aspx
> 6-Je n'arrive pas non plus à faire fonctionner les TreeView, notamment
> à cause de ressources manquantes pour les images (plus, moins,
> dossier...).
Pas très clair, comme la 5....
Les TreeViews sont bien détaillés dans MSDN :
http://msdn.microsoft.com/en-us/library/bb773409(VS.85).aspx
ou Control Spy pour tous les C.Controls
1-Mais GDI+ est quelque chose d'en dehors de l'API WIN32, non?
3- et 4-Celà me parait un peu compliqué.... saurais-tu me l'expliquer?
6-Les ressources manquantes sont les images de plus et de moins lors
de la navigation les dossiers, de même que l'image de dossier est pour
représenter les dossiers lors de la navigation dans le TreeView, il
manque ces images et il faudrait faire un fichier resources, mais je
ne sais pas comment le faire. De plus, je me suis initié aux TreeView
avec msdn, et je n'y ai donc pas trouvé mon bonheur, même en copiant/
collant leur code.
5-Il s'agit de :
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM
wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the
message queue */
break;
case WM_COMMAND:
if (BN_CLICKED && (GET_LPARAM(BN_CLICKED, lParam) ==
HwndButtonUpdate))
{
miseajour();
}
if (BN_CLICKED && (GET_LPARAM(BN_CLICKED, lParam) ==
HwndButtonEmpty))
{
printf("You crazy!");
}
if (BN_CLICKED && (GET_LPARAM(BN_CLICKED, lParam) ==
HwndButtonCredits))
{
// CreateWindowEx(0, szClassName, "Familly Shorter",
WS_OVERLAPPEDWINDOW, 50, 50, 50, 200, HWND_DESKTOP, NULL,
hThisInstance, NULL);
}
if (BN_CLICKED && (GET_LPARAM(BN_CLICKED, lParam) ==
HwndButtonExit))
{
PostQuitMessage (0);
}
break;
default: /* for messages that we don't
deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Merci pour les réponses que tu m'a déjà données.
> 1-Mais GDI+ est quelque chose d'en dehors de l'API WIN32, non?
Non, c'est inclus en natif (l'Explorer l'utilise souvent..)
http://msdn.microsoft.com/en-us/library/ms533802(VS.85).aspx
> 3- et 4-Celà me parait un peu compliqué.... saurais-tu me l'expliquer?
Il n'y a quasiment rien à faire : juste les étapes 1, 2 et 3 de
"To create a manifest and enable your application to use visual
styles."
pour créer le fichier NomApp.exe.manifest comme indiqué, dans le
répertoire de l'exécutable, si on ne veut pas le mettre en ressources.
> 6-Les ressources manquantes sont les images de plus et de moins lors de la navigation les dossiers, de même que l'image de dossier est pour représenter les dossiers lors de la navigation
Toutes ces ressources sont incluses dans Windows, notamment par
l'ImageList Système qu'on récupère par SHGetFileInfo()
Mais pour le +/-, c'est automatique par le style TVS_HASBUTTONS
> 5-Il s'agit de :
> case WM_COMMAND:
> if (BN_CLICKED && (GET_LPARAM(BN_CLICKED, lParam)
Il faut faire :
if (HIWORD (wParam) == BN_CLICKED)
{
//....
}
Hum... comment linker à la librairie et utiliser InitCommonControls()?
De plus, j'utilise ImageList, mais il me renvoie le problème susdit :
/*BOOL InitTreeViewImageLists(HWND hwndTV)
{
HIMAGELIST himl; // handle to image list
HBITMAP hbmp; // handle to bitmap
// Create the image list.
if ((himl = ImageList_Create(CX_BITMAP,
CY_BITMAP,
FALSE,
NUM_BITMAPS, 0)) == NULL)
return FALSE;
// Add the open file, closed file, and document bitmaps.
hbmp = LoadBitmap(hinst, MAKEINTRESOURCE(IDB_OPEN_FILE));
g_nOpen = ImageList_Add(himl, hbmp, (HBITMAP)NULL);
DeleteObject(hbmp);
hbmp = LoadBitmap(hinst, MAKEINTRESOURCE(IDB_CLOSED_FILE));
g_nClosed = ImageList_Add(himl, hbmp, (HBITMAP)NULL);
DeleteObject(hbmp);
hbmp = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_DOCUMENT));
g_nDocument = ImageList_Add(himl, hbmp, (HBITMAP)NULL);
DeleteObject(hbmp);
// Fail if not all of the images were added.
if (ImageList_GetImageCount(himl) < 3)
return FALSE;
// Associate the image list with the tree-view control.
TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL);
return TRUE;
}
Non, c'est la System ImageList, récupérée par SHGetFileInfo()
Voir l'exemple du SDK EnumDesk.cpp (..\Samples\WinUI\Shell\EnumDesk)
qui fait exactement ça (un Explorer avec TreeView et ListView)
InitCommonControlsEx();
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "Familly
Shorter.exe.manifest";
HWND HwndButtonUpdate, HwndButtonEmpty, HwndButtonHelp,
HwndButtonExit, HwndButtonCredits, HwndButtonReload, HwndButtonCreate,
HwndButtonSuppress, HwndButtonBackup;
HWND HwndTreeView;
HINSTANCE hinst;
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
//La fonction créant la fenêtre principale vient après... Dois-je
mettre la déclaration de manifest dedans? Qui plus est, est-il
nécessaire de remplir les champs dans le manifest? A savoir nom de
l'application et autre...
De plus, que dois-je mettre dans ce cas-là dans InitCommonControlsEx
()? Rien n'est précisé...
Mais il ne faut rien mettre dans le code, à part appeler
InitCommonControls(), qui de toute façon devrait déjà y être si l'on
utilise un des C. Controls.
(RT_MANIFEST , c'est dans le .rc !)
Et comme c'est écrit, on n'a pas besoin de le mettre en ressource :"
Alternatively, you can place the XML manifest file in the same
directory as your application's executable file."
Merci, le manifest marche parfaitement maintenant!
Néanmoins, j'aurais besoin de changer la couleur de fond de la
fenêtre. Sais-tu comment faire?
De plus, je n'ai pas bien compris ce que tu m'a dit au sujet des
messages avec le HIWORD; comment saurais-je qui plus est de quel
bouton vient le message? Mon code marchais bien avec un bouton, il
exécutait les instructions, mais avec plusieurs boutons rien ne se
passe.
> Néanmoins, j'aurais besoin de changer la couleur de fond de la
> fenêtre. Sais-tu comment faire?
Il y a diverses méthodes.
Le plus simple est dans le RegisterClassEx() :
wcex.hbrBackground = .....
> De plus, je n'ai pas bien compris ce que tu m'a dit au sujet des
> messages avec le HIWORD; comment saurais-je qui plus est de quel
> bouton vient le message?
Par exemple :
if (HIWORD (wParam) == BN_CLICKED)
{
if (lParam == (LPARAM)hButton1)
MessageBox(NULL, "Button 1", "Message", MB_OK);
}
Merci beaucoup (les messages marchent aussi!) mais à présent j'ai le
problème de changer la couleur de fond de la zone texte des
groupbox... Il y a-t-il une fonction ou est-ce dans le manifest?
> Merci beaucoup (les messages marchent aussi!) mais à présent j'ai le
> problème de changer la couleur de fond de la zone texte des
> groupbox... Il y a-t-il une fonction ou est-ce dans le manifest?
Pour le background du texte, avec WM_CTLCOLORSTATIC (retourner un
Brush handle)
Hum... je ne comprends pas trop comment on se sert de la fonction
WM_COLORSTATIC... Je croyais qu'il n'y avait plus de HDC?
De plus, lorsque j'utilise les BS_SPLITBUTTON et son homonyme avec une
flèche du type commandlink, il me dit que ces boutons sont inconnus...
Enfin, comment faire pour que mon interface actuelle ressemble plus à
celle de Windoce :
[url=http://images.imagehotel.net/?syhjt0ov7i.jpg][img]http://
images.imagehotel.net/syhjt0ov7i_tn.jpg[/img][/url]
> Hum... je ne comprends pas trop comment on se sert de la fonction
> WM_COLORSTATIC... Je croyais qu'il n'y avait plus de HDC?
C'est WM_CTLCOLORSTATIC et c'est un message, pas une fonction
Comme c'est écrit dans la doc, retourner un Brush handle, custom ou
system (GetStockObject() par exemple)
> De plus, lorsque j'utilise les BS_SPLITBUTTON et son homonyme avec une
> flèche du type commandlink, il me dit que ces boutons sont inconnus...
Voir le source pour BS_SPLITBUTTON :
#if _WIN32_WINNT >= 0x0600
donc rajouter s'il n'y est pas un #define suffisant...
Dans quel header dois-je trouver celà?
De plus, pourrais-tu me donner un exemple de code pour la couleur de
fond? J'ai du mal à trouver ces que nécessite chaque fonctions/
message...
Up?
> Up?
Si tu fais clic droit dans VS sur BS_SPLITBUTTON, ça donne
commctrl.h
Et il n'y a rien à faire à part retourner un brush handle sur
WM_CTLCOLORSTATIC. comme
return (LRESULT) GetStockObject(DKGRAY_BRUSH);
Merci beaucoup, j'arrive à changer le background, mais ne trouve pas
comment changer la couleur du texte... Par ailleurs, je ne trouve
l'endroit de la modification à apporter dans commctrl.h pour le
SPLITBUTTON?
De plus, saurais-tu où se trouve le ID_LISTVIEW? Mon compilateur me
dit qu'il ne le connaît pas... Il s'agit de Code::Blocks.
Merci beaucoup ;)!
> Merci beaucoup, j'arrive à changer le background, mais ne trouve pas
> comment changer la couleur du texte... Par ailleurs, je ne trouve
> l'endroit de la modification à apporter dans commctrl.h pour le
> SPLITBUTTON?
> De plus, saurais-tu où se trouve le ID_LISTVIEW? Mon compilateur me
> dit qu'il ne le connaît pas... Il s'agit de Code::Blocks.
Il ne faut pas modifier commctrl.h (!), mais comme il y a :
#if _WIN32_WINNT >= 0x0600
il faut rajouter un #define _WIN32_WINNT qui doit être >= 0x0600 au
début du programme.
Pour le texte d'un Group Box avec Theme, une solution est de poster un
WM_USER dans WM_CTLCOLORSTATIC, où l'on re-dessine par dessus
(SetTextColor()-DrawText())
(sans Theme, SetTextColor() dans WM_CTLCOLORSTATIC suffit)
ID_LISTVIEW n'existe pas par défaut, c'est un ID que tu as créé (dans
un resource.h ou autre)
Dans un autre code source, j'ai trouvé un #define ID_LISTVIEW 1001;
mon programme ne bug plus à la compilation lorsque je fais ce define,
mais rien ne s'affiche, et je vois mal devoir créer quelle que
ressource que ce soit pour créer une listview.
De plus, j'ai fais - à force d'échec - des #define _WIN32_WINNT 0x0600
un peu partout dans mon code source, mais il me dit toujours que
BS_SPLITBUTTON n'est pas défini.
Une idée?
> Dans un autre code source, j'ai trouvé un #define ID_LISTVIEW 1001;
> mon programme ne bug plus à la compilation lorsque je fais ce define,
> mais rien ne s'affiche, et je vois mal devoir créer quelle que
> ressource que ce soit pour créer une listview.
Tu appelles bien InitCommonControls() ?
> De plus, j'ai fais - à force d'échec - des #define _WIN32_WINNT 0x0600
> un peu partout dans mon code source, mais il me dit toujours que
> BS_SPLITBUTTON n'est pas défini.
> Une idée?-
Es-tu bien sûr que BS_SPLITBUTTON est défini dans ta version de
commctrl.h ?
(#define BS_SPLITBUTTON 0x0000000CL)
Il me dit que InitCommonControls() est une fonction inconnue, de même
que InitCommonControlsEx. Par ailleurs, SPLITBUTTON n'est pas défini
dans commctrl.h. Dois-je l'y inclure ou dans mon fichier source? Est-
ce normal qu'il n'y soit pas?
> Il me dit que InitCommonControls() est une fonction inconnue, de même
> que InitCommonControlsEx.
MSDN =>
Header commctrl.h
Import library comctl32.lib
Donc, il faut inclure commctrl.h et linker avec comctl32.lib
> Par ailleurs, SPLITBUTTON n'est pas défini
> dans commctrl.h.
C'est qu'il est trop vieux.
Il faut mettre à jour le SDK Windows
Comment faire? J'ai cherché sur internet mais n'ai rien trouvé pour
une maj... de plus, j'ai copié les headers de visual c++ express, et
il manque plein de header (BS_SPLITBUTTON est bien défini ici, mais la
compilation plante, manque de headers).
>Comment faire? J'ai cherch� sur internet mais n'ai rien trouv� pour
>une maj...
Chez Microsoft, forc�ment :
http://msdn.microsoft.com/en-us/windows/dd146047.aspx
Cela me donne les mêmes fichiers que ceux que j'avais pris dans Visual
C++ Express... et ils datent au plus jeune de 2007. De plus,
specstrings.h inclue un fichier header "sal.h" que le compilateur ne
trouve pas (le fichiers n'est effectivement nul part), et dans le
premier header, il me dit qu'il y a des syntax errors avant les
définitions des tyoes char, unsigned short, ... :
typedef __$compname_props char* ValidCompNameA;
typedef __$compname_props unsigned short* ValidCompNameW;
typedef __$compname_props const unsigned short* ConstValidCompNameW;
typedef __$compname_props __$TCHAR* SAL_ValidCompNameT;
typedef __$compname_props const __$TCHAR* SAL_ConstValidCompNameT;
Up?
>> Cela me donne les m�mes fichiers que ceux que j'avais pris dans Visual
>> C++ Express... et ils datent au plus jeune de 2007. De plus,
>> specstrings.h inclue un fichier header "sal.h" que le compilateur ne
>> trouve pas (le fichiers n'est effectivement nul part), et dans le
>> premier header, il me dit qu'il y a des syntax errors avant les
>> d�finitions des tyoes char, unsigned short, ... :
Ca ne peut pas �tre les m�mes fichiers, sinon �a veut dire que tes
anciens fichiers �taient bons or tu disais que BS_SPLITBUTTON n'y �tait
pas dans commctrl.h (c'est celui-l� l'essentiel)
(Sous VS, il faut aussi changer les r�pertoires au niveau ds options
pour lib et include)
sal.h, tu peux le mettre en commentaire ou alors n'inclus pas specstrings.h