Pb affichage ComboBox dans Dialog

Résolu
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 15 mars 2006 à 04:48
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 18 mars 2006 à 02:10
Salut tout le monde,
j'ai un souci d'affichage de mon combo dans un dialog. Quand je click sur la fleche pour afficher la liste, il ne m'affiche rien!
Pour resumer mon prog, j'appele le dialog par
DialogBox(hInst, MAKEINTRESOURCE(IDD_DEVICEINFO), hWnd, DeviceInfo);
La methode DeviceInfo contient la gestion des evenements, du genre
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId)
{
case IDC_CB_DEVICE:
.....
et j'ajoute bien les elements au combo. Les elements sont bien presents parcequ'en envoyant un message pour selectionner le premier element, il me l'affiche bien.
Je pense qu'il faut que je fasse un truc du genre DefDialogProc(...) ou DefWindowProc(...), mais je sais pas trop comment my prendre.
Voici la partie interessante de mon code:

---- FICHIER RC ----

IDD_DEVICEINFO DIALOGEX 0, 0, 173, 103
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_STATICEDGE
CAPTION "Device Informations"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
COMBOBOX IDC_CB_DEVICE,7,7,159,14,CBS_DROPDOWN | CBS_SORT /*| CBS_HASSTRINGS*/ | WS_VSCROLL | WS_TABSTOP
LTEXT "Propriétaire",IDC_STATIC,7,30,37,8
CONTROL "",IDC_PB_BATTERY,"msctls_progress32",WS_BORDER,54,86,110,10
CONTROL "",IDC_DT_TIME,"SysDateTimePick32",DTS_RIGHTALIGN | DTS_UPDOWN | DTS_APPCANPARSE | WS_TABSTOP | 0x8,116,46,50,13
CONTROL "",IDC_PB_VOLUME,"msctls_progress32",WS_BORDER,54,68,110,10
LTEXT "Volume",IDC_STATIC,7,68,37,8
LTEXT "Batterie",IDC_STATIC,7,86,37,8
LTEXT "Date",IDC_STATIC,7,49,37,8
EDITTEXT IDC_EDIT_OWNER,54,29,112,12,ES_AUTOHSCROLL | NOT WS_BORDER
CONTROL "",IDC_DT_DATE,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,54,47,58,12
END

---- HANDLER DE LA FENETRE PRINCIPALE ----

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_DEVICEINFO:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DEVICEINFO), hWnd, DeviceInfo);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
...
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

---- HANDLER DU DIALOG EN QUESTION ----

INT_PTR CALLBACK DeviceInfo(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId, wmEvent;
HWND tmp;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
m_nomadTools->initDialogDeviceInfo(hDlg);
return (INT_PTR)TRUE;

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId)
{
case IDC_CB_DEVICE:
//TODO:gerer le changement de device
return (INT_PTR) TRUE;
...//traitement des autres elements
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
default:
return (INT_PTR) FALSE;
}
default:
return (INT_PTR) FALSE;
}
return (INT_PTR) FALSE;
}

--- LA FONCTION m_nomadTools->initDialogDeviceInfo ----

void initDialogDeviceInfo(HWND hDlg) {
//init the device list
HWND hCb = GetDlgItem(hDlg, IDC_CB_DEVICE);
SendMessage(hCb, CB_RESETCONTENT, 0, 0);
SendMessage(hCb,CB_ADDSTRING, 0, (LPARAM) "element 0");
SendMessage(hCb,CB_ADDSTRING, 0, (LPARAM) "element 1");
SendMessage(hCb,CB_SETCURSEL, 0, 0);
LRESULT x = SendMessage(hCb,CB_GETCOUNT, 0, 0); //retoure bien 2
}

Merci de vaotre aide :)

3 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
18 mars 2006 à 02:10
c bon j'ai trouve mon erreur :)
pour ceux que ca interesse l'erreur se trouve ici:

---- FICHIER RC ----

IDD_DEVICEINFO DIALOGEX 0, 0, 173, 103
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_STATICEDGE
CAPTION "Device Informations"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
COMBOBOX IDC_CB_DEVICE,7,7,159,14,CBS_DROPDOWN | CBS_SORT /*| CBS_HASSTRINGS*/ | WS_VSCROLL | WS_TABSTOP
LTEXT "Propriétaire",IDC_STATIC,7,30,37,8
CONTROL "",IDC_PB_BATTERY,"msctls_progress32",WS_BORDER,54,86,110,10

CONTROL "",IDC_DT_TIME,"SysDateTimePick32",DTS_RIGHTALIGN |
DTS_UPDOWN | DTS_APPCANPARSE | WS_TABSTOP | 0x8,116,46,50,13
CONTROL "",IDC_PB_VOLUME,"msctls_progress32",WS_BORDER,54,68,110,10
LTEXT "Volume",IDC_STATIC,7,68,37,8
LTEXT "Batterie",IDC_STATIC,7,86,37,8
LTEXT "Date",IDC_STATIC,7,49,37,8
EDITTEXT IDC_EDIT_OWNER,54,29,112,12,ES_AUTOHSCROLL | NOT WS_BORDER
CONTROL "",IDC_DT_DATE,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,54,47,58,12
END

qu'il faut remplacer par
COMBOBOX IDC_CB_DEVICE,7,7,159,200,CBS_DROPDOWN | CBS_SORT /*| CBS_HASSTRINGS*/ |

en fait ce que je ne savais pas c'est que quand on créé un combobox avec l'editeur graphique, il faut faire le rectangle de selection qui contient la taille du combo complet (ie. la taille du combo déroulé)
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 mars 2006 à 11:04
COMBOBOX IDC_CB_DEVICE,7,7,159,14,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
peut-etre ira mieux.

Dans la dialogProc les events de bouton devraient retourner 0.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
15 mars 2006 à 14:50
nan le pb vien pas de la. j'ai aussi essayer de retourner FALSE mais ca change rien.
en fait, dans ma fenetre principale, g une combo aussi que j'ai declare comme ca:
hCombo = CreateWindowEx(WS_EX_CLIENTEDGE , WC_COMBOBOX, "", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST , 10, 30, 200, 50, hWnd, NULL, hInst, NULL);

et la liste s'affiche bien quand je click dessus (meme vide ca m'affiche une liste vide). Mais la fenetre principale n'est pas un dialog, et je me demande si ca vien pas de la, parce que le handler de la fenetre contient des DefWindowProc(), et je n'ai pas créé de "case" pour ce combo.

Dans mon dialog, quand je click sur le combo, la liste ne saffiche pas, j'ai l'impression qu'il faut que je renvoie le message d'affichage.
j'ai essayer de mettre un messagebox pour l'evenement CBN_DROPDOWN dans le handler du dialog, et il m'affiche bien le messagebox.
0
Rejoignez-nous