Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Design de fenêtre et autre.

4 views
Skip to first unread message

Maxime

unread,
Nov 13, 2009, 3:08:31 PM11/13/09
to
Bonjour à tous,

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 ;).

Christian ASTOR

unread,
Nov 13, 2009, 3:43:35 PM11/13/09
to
On 13 nov, 21:08, Maxime <maximeou...@laposte.net> wrote:

> 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

Maxime

unread,
Nov 13, 2009, 4:20:36 PM11/13/09
to

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.

Maxime

unread,
Nov 13, 2009, 4:23:37 PM11/13/09
to
P.S. : Je suis sous Vista.

Christian ASTOR

unread,
Nov 14, 2009, 6:49:06 AM11/14/09
to
On 13 nov, 22:20, Maxime <maximeou...@laposte.net> wrote:

> 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)
{
//....
}

Maxime

unread,
Nov 14, 2009, 10:55:22 AM11/14/09
to
On 14 nov, 12:49, Christian ASTOR <casto...@club-internet.fr> wrote:
> On 13 nov, 22:20, Maxime <maximeou...@laposte.net> wrote:
>
> > 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


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;
}

Christian ASTOR

unread,
Nov 14, 2009, 1:03:48 PM11/14/09
to
On 14 nov, 16:55, Maxime <maximeou...@laposte.net> wrote:
> Hum... comment linker à la librairie et utiliser InitCommonControls()?
> De plus, j'utilise ImageList, mais il me renvoie le problème susdit

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)


Maxime

unread,
Nov 15, 2009, 9:21:47 AM11/15/09
to
Je n'arrive pas à utliser le manifest, il dit qu'il y a une erreur
avant LPSTR :

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é...

Christian ASTOR

unread,
Nov 15, 2009, 1:19:31 PM11/15/09
to
On 15 nov, 15:21, Maxime <maximeou...@laposte.net> wrote:
> Je n'arrive pas à utliser le manifest, il dit qu'il y a une erreur
> avant LPSTR :

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."

Maxime

unread,
Nov 15, 2009, 3:15:35 PM11/15/09
to

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.

Maxime

unread,
Nov 15, 2009, 3:27:09 PM11/15/09
to
Qui plus est, il me dit que le bouton de type BS_SPLITBUTTON lui est
inconnu. Un include particulier?

Christian ASTOR

unread,
Nov 15, 2009, 3:31:25 PM11/15/09
to
On 15 nov, 21:15, Maxime <maximeou...@laposte.net> wrote:

> 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);
}

Maxime

unread,
Nov 15, 2009, 4:21:29 PM11/15/09
to
On 15 nov, 21:31, Christian ASTOR <casto...@club-internet.fr> wrote:
> On 15 nov, 21:15, Maxime <maximeou...@laposte.net> wrote:
>
> > 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      = .....
>

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?

Christian ASTOR

unread,
Nov 16, 2009, 6:03:54 AM11/16/09
to
On 15 nov, 22:21, Maxime <maximeou...@laposte.net> wrote:

> 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)

Maxime

unread,
Nov 16, 2009, 1:24:20 PM11/16/09
to

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]

Christian ASTOR

unread,
Nov 17, 2009, 7:06:29 AM11/17/09
to
On 16 nov, 19:24, Maxime <maximeou...@laposte.net> wrote:

> 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...

Maxime

unread,
Nov 18, 2009, 5:59:21 PM11/18/09
to

> > 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...

Maxime

unread,
Nov 23, 2009, 11:57:16 AM11/23/09
to

Up?

Christian ASTOR

unread,
Nov 23, 2009, 5:37:04 PM11/23/09
to
On 23 nov, 17:57, Maxime <maximeou...@laposte.net> wrote:
> > 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?

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);

Maxime

unread,
Nov 24, 2009, 1:14:07 PM11/24/09
to

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 ;)!

Christian ASTOR

unread,
Nov 25, 2009, 12:46:09 PM11/25/09
to
On 24 nov, 19:14, Maxime <maximeou...@laposte.net> wrote:

> 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)

Maxime

unread,
Nov 25, 2009, 2:39:57 PM11/25/09
to

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?

Christian ASTOR

unread,
Nov 25, 2009, 3:41:56 PM11/25/09
to
On 25 nov, 20:39, Maxime <maximeou...@laposte.net> wrote:

> 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)

Maxime

unread,
Nov 25, 2009, 4:14:26 PM11/25/09
to

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?

Christian ASTOR

unread,
Nov 27, 2009, 2:40:45 AM11/27/09
to
On 25 nov, 22:14, Maxime <maximeou...@laposte.net> wrote:

> 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

Maxime

unread,
Nov 28, 2009, 12:28:56 PM11/28/09
to

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).

Alain

unread,
Nov 29, 2009, 1:18:47 AM11/29/09
to

"Maxime" <maxim...@laposte.net> a �crit dans le message de news:
209c5b94-ab33-4e04...@k19g2000yqc.googlegroups.com...

On 27 nov, 08:40, Christian ASTOR <casto...@club-internet.fr> wrote:
> 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...

Chez Microsoft, forc�ment :
http://msdn.microsoft.com/en-us/windows/dd146047.aspx

Maxime

unread,
Nov 29, 2009, 10:17:00 AM11/29/09
to
On 29 nov, 07:18, "Alain" <al...@distrib.fr> wrote:
> "Maxime" <maximeou...@laposte.net> a écrit dans le message de news:
> 209c5b94-ab33-4e04-a481-e7ef83d6d...@k19g2000yqc.googlegroups.com...

> On 27 nov, 08:40, Christian ASTOR <casto...@club-internet.fr> wrote:
>
> > 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...
>
> 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;

Maxime

unread,
Dec 1, 2009, 2:09:04 PM12/1/09
to

Up?

Message has been deleted

nico

unread,
Dec 2, 2009, 2:00:21 AM12/2/09
to
Maxime wrote:

>> 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

0 new messages