Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

EditText dans Ceate Dialog

4 réponses
Avatar
m.B
bonjour à toutes et à tous.

j'espère être dans le bon groupe !
c'est celui qu'on m'a conseillé "ailleurs"
merci de me redirigé si nécessaire.

windows xp, avec Code::Blocks

je ne me sors pas d'un CreateDialog
où je voudrais réagir au click sur un edittext
( excusez le débutant c++ que je suis ! )

1° un .rc :
optFen DIALOGEX 30, 40, 340, 180
STYLE WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
{ EDITTEXT edt, 80, 130, 130, 11, NOT WS_BORDER | ES_CENTER
}

2° l'appel :
CreateDialog( hinstance, MAKEINTRESOURCE(optFen),
hwnd, (DLGPROC)synProcedure );

3° la procedure :
LRESULT CALLBACK synProcedure
( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{ switch (message)
{ case WM_INITDIALOG:
return TRUE;
break;
case WM_CLOSE:
DestroyWindow( hwnd );
break;
case WM_NOTIFY:
switch ( LOWORD (wParam) )
{ case edt:
MessageBox( hwnd,
"c'est ok",
"",
MB_OK );
}
break;
}
break;
}
return 0;
}


on ne passe jamais (?) sur le MessageBox,

si je met la séquence dans case WM_COMMAND: c'est déclenché "trop souvent"
j'ai tenté de tester if ( HIWORD(wParam)==EN_SETFOCUS )
mais ça n'arrange rien en fait.

j'ai beau regarder des exemples, tourner et retourner
la source... je ne vois pas où je fais une ( des ! ) erreurs ( s )
ridicule comme question je crois, mais je ne m'en sors pas !

vous pouvez m'aiguiller ?
merci d'avance.

4 réponses

Avatar
Christian ASTOR
On 25 août, 17:09, wrote:

je ne me sors pas d'un CreateDialog
        où je voudrais réagir au click sur un edittext



Par ex, Subclassing + WM_LBUTTONDOWN
Avatar
m.B
> Par ex, Subclassing + WM_LBUTTONDOWN


c'est gentil Christian,
mais navré : j'ai n'ai pas compris !
Subclassing ? mais encore ?
Avatar
Christian ASTOR
On 26 août, 09:50, wrote:
> Par ex, Subclassing + WM_LBUTTONDOWN

c'est gentil Christian,
mais navré : j'ai n'ai pas compris !
Subclassing ? mais encore ?



Il faut subclasser, car un contrôle Edit n'envoie pas de notification
au contrôle parent sur un click.
Subclasser, donc changer sa procédure (http://msdn.microsoft.com/en-
us/library/ms997565.aspx)

Donc, par exemple :
LRESULT OldEditProc;
LRESULT CALLBACK EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam);

Dans le WM_INITDIALOG :
OldEditProc = SetWindowLong(GetDlgItem(hwnd, edt), GWL_WNDPROC,
(LONG) (WNDPROC) EditProc);

La nouvelle proc :
LRESULT CALLBACK EditProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
switch (uMsg)
{
case WM_LBUTTONDOWN:
{
Beep(300,200);
}
break;
}
return(CallWindowProc((WNDPROC)OldEditProc, hWnd, uMsg, wParam,
lParam));
}
Avatar
m.B
> Il faut subclasser, car un contrôle Edit n'envoie pas de notification...
Donc, par exemple....


je commence à comprendre.
il ne me reste plus qu'à appliquer ton exemple !
pas sûr que j'y arrive sans revenir poser d'autres
questions débiles, mais pas simple quand on débarque.
surtout que quasi toutes les infos sont en américain,
autant lire / regarder / et comprendre parfois, avec un exemple,
j'y parviens ( difficilement ), autant faire une recherche
j'en suis bien incapable.
là nickel, à priori je n'ai qu'à adapter ( et encore )
merci beaucoup, je reviendrais ( c'est une menace ).
Cordialement.