OVH Cloud OVH Cloud

Combo Dropdown et subclassing

3 réponses
Avatar
Clément
Salut,

J'ai un petit problème avec une combo dropdown. Si je la subclasse, la
petite flèche ne fait plus apparaitre la liste. Meme avec une windows proc
"vide" (juste un return CallWindowProc ((WNDPROC)OldSubProcCombo, hWnd,
wMessage, wParam, lParam); ), ca ne marche pas. Alors que si je ne subclasse
pas, ca marche tres bien.

Une idée ?

Clément.

3 réponses

Avatar
Clément
"Clément" a écrit dans le message de news:
43034f69$0$19310$
Salut,

J'ai un petit problème avec une combo dropdown. Si je la subclasse, la
petite flèche ne fait plus apparaitre la liste. Meme avec une windows proc
"vide" (juste un return CallWindowProc ((WNDPROC)OldSubProcCombo, hWnd,
wMessage, wParam, lParam); ), ca ne marche pas. Alors que si je ne
subclasse pas, ca marche tres bien.



Quelques précisions :

1) Le subclassing (de la partie "edit" du combo) marche bien. Je parviens à
intercepter certaines touches.
2) J'ai bien réglé la hauteur de la liste déroulante. La preuve c'est que ca
marche bien sans subclassing.

Donc mon seul problème est que ca ne se déroule pas. Sauf si je ne subclasse
pas. Mon problème vient donc du subclassing (code : OldSubProcCombo =
SetWindowLong(GetDlgItem(hWnd, IDC_COMBO_APPLI), GWL_WNDPROC,
(LONG)(WNDPROC)SubProcCombo); ).

Mille Mercis d'avance pour vos réponses.
Clément.
Avatar
Christian ASTOR
Clément wrote:

1) Le subclassing (de la partie "edit" du combo) marche bien. Je parviens à
intercepter certaines touches.
2) J'ai bien réglé la hauteur de la liste déroulante. La preuve c'est que ca
marche bien sans subclassing.

Donc mon seul problème est que ca ne se déroule pas. Sauf si je ne subclasse
pas. Mon problème vient donc du subclassing (code : OldSubProcCombo =
SetWindowLong(GetDlgItem(hWnd, IDC_COMBO_APPLI), GWL_WNDPROC,
(LONG)(WNDPROC)SubProcCombo); ).



Je n'arrive pas à reproduire ton truc...
Par ex =>

LRESULT OldComboProc;
LRESULT CALLBACK NewComboProc(HWND, UINT, WPARAM, LPARAM);

// Dans le case WM_CREATE de hWnd :

// static HWND hCombo; auparavant...

char sBuffer[255];
hCombo = CreateWindow( "COMBOBOX", "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |
CBS_DROPDOWNLIST, 100,300,200,100, hWnd,
(HMENU)NULL, hInst, NULL );

for (int i= 0;i<10;i++)
{
wsprintf(sBuffer, "Item n°%d", i);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) sBuffer);
}
OldComboProc = SetWindowLong(hCombo, GWL_WNDPROC,(LONG) (WNDPROC)
NewComboProc);

// Proc

LRESULT CALLBACK NewComboProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_LBUTTONDOWN:
Beep(1000, 100);
break;

}
return(CallWindowProc((WNDPROC)OldComboProc, hWnd, uMsg, wParam, lParam));
}
Avatar
Clément
> Je n'arrive pas à reproduire ton truc...
Par ex =>

LRESULT OldComboProc;
LRESULT CALLBACK NewComboProc(HWND, UINT, WPARAM, LPARAM);

// Dans le case WM_CREATE de hWnd :

// static HWND hCombo; auparavant...

char sBuffer[255];
hCombo = CreateWindow( "COMBOBOX", "", WS_CHILD | WS_VISIBLE | WS_VSCROLL
| WS_TABSTOP | CBS_DROPDOWNLIST, 100,300,200,100, hWnd, (HMENU)NULL,
hInst, NULL );

for (int i= 0;i<10;i++)
{
wsprintf(sBuffer, "Item n°%d", i);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) sBuffer);
}
OldComboProc = SetWindowLong(hCombo, GWL_WNDPROC,(LONG) (WNDPROC)
NewComboProc);

// Proc

LRESULT CALLBACK NewComboProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
switch (uMsg)
{
case WM_LBUTTONDOWN:
Beep(1000, 100);
break;

}
return(CallWindowProc((WNDPROC)OldComboProc, hWnd, uMsg, wParam, lParam));
}




Merci beaucoup à toi. Grâce à ton exemple, j'ai pu comparer avec mon code,
et en fait mon prototype de NewComboProc était
LRESULT CALLBACK SubProcCombo(HWND hWnd, WORD wMessage, WORD wParam, WORD
lParam)
au lieu de
LRESULT CALLBACK SubProcCombo(HWND hWnd, UINT wMessage,WPARAM
wParam,LPARAM lParam)

(vous voyez, les WORD partout dans le 1er)
Erreur très très bête, j'en conviens. J'avais repris un vieux code, et voila
! Le pire c'est que la plupart du temps ca marche, j'imagine quand les
valeurs passées ne dépassent pas les valeurs possibles d'un WORD...

Merci encore à toi, et c'est pas la première fois que tu m'aides. Alors je
t'en prie, ne quitte jamais le NG ;o))