begin process at 2012 05 27 15:52:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > DROPDOWN LISTBOX (WIN32)

DROPDOWN LISTBOX (WIN32)


 Information sur la source

Note :
Aucune note
Catégorie :Astuces Classé sous :dropdown, listbox, subclassing, focus, popup Niveau :Débutant Date de création :04/05/2006 Date de mise à jour :04/05/2006 14:49:10 Vu / téléchargé :6 561 / 243

Auteur : vecchio56

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

Petit exemple d'une solution trouvée suite à cette discussion sur le forum:
http://www.cppfrance.com/infomsg/WS_POPUP-F OCUS-0_730993.aspx
Le but est de créer une listbox dans une autre fenêtre, sans que le fenêtre mère ne perde le focus, en vue d'avoir le même comportement que les bouton annuler/refaire de Office ou Visual Studio
Il y a une fenêtre edit qui permet d'entrer le nombre d'items qui seront présent dans la listbox

Source

  • #define _WIN32_WINNT 0x0501
  • #define _WIN32_IE 0x0501
  • #include <windows.h>
  • HINSTANCE g_hInst;
  • HWND g_hWnd, g_hListbox;
  • char g_szAppName[] = "DropDown";
  • BOOL g_bCapture = FALSE;
  • WNDPROC defListboxProc;
  • #define MAX_ITEMS 10
  • int __fastcall bnatoi(const char* psz)
  • {
  • __asm
  • {
  • xor eax, eax
  • push ebx
  • xor edx, edx
  • xor ebx, ebx
  • cmp byte ptr[ecx], '-'
  • jne short L1
  • inc ecx
  • mov edx, 0xFFFFFFFF
  • L1:
  • mov bl, byte ptr[ecx]
  • cmp bl, '0'
  • jb short L2
  • cmp bl, '9'
  • ja short L2
  • lea eax, dword ptr[eax + 4 * eax]
  • sub bl, '0'
  • add eax, eax
  • inc ecx
  • add eax, ebx
  • jmp short L1
  • L2:
  • add eax, edx
  • pop ebx
  • xor eax, edx
  • }
  • }
  • LRESULT ListBox_OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
  • {
  • POINT pt = {LOWORD(lParam), HIWORD(lParam)};
  • RECT clientRect, screenRect;
  • POINT screenMousePos;
  • GetCursorPos(&screenMousePos);
  • GetWindowRect(hWnd, &screenRect);
  • GetClientRect(hWnd, &clientRect);
  • LRESULT l = 0;
  • if(PtInRect(&screenRect, screenMousePos))
  • {
  • if(pt.x > clientRect.right)
  • {
  • // Clic dans la fenêtre, mais en dehors de la zone client
  • // Donc sur la scollbar
  • g_bCapture = TRUE; // Car la ListBox va recevoir WM_CAPTURECHANGED, mais il ne faut pas la fermer
  • // On enlève temporairement la capture
  • ReleaseCapture();
  • l = CallWindowProc((WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC),
  • hWnd,
  • WM_NCLBUTTONDOWN,
  • HTVSCROLL,
  • MAKELPARAM(screenMousePos.x, screenMousePos.y));
  • SetCapture(hWnd);
  • g_bCapture = FALSE;
  • }
  • return l;
  • }
  • else DestroyWindow(hWnd); // Clic à coté de la fenêtre
  • return 0;
  • }
  • LRESULT ListBox_OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
  • {
  • int sel, count;
  • POINT pt;
  • RECT rect;
  • pt.x = (short)LOWORD(lParam);
  • pt.y = (short)HIWORD(lParam);
  • GetClientRect(hWnd, &rect);
  • if(PtInRect(&rect, pt) || (wParam & MK_LBUTTON))
  • {
  • // On prend les mouvements de la souris quand on est au dessus de la listBox,
  • // ou quand le bouton gauche de la souris est enfoncé
  • if(pt.y < 0)
  • PostMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
  • if(pt.y > rect.bottom)
  • PostMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
  • sel = LOWORD(SendMessage(hWnd, LB_ITEMFROMPOINT, 0, lParam));
  • SendMessage(hWnd, LB_SELITEMRANGE, TRUE, MAKELPARAM(0, sel));
  • count = (int)SendMessage(hWnd, LB_GETCOUNT, 0, 0);
  • if(sel != count - 1)
  • SendMessage(hWnd, LB_SELITEMRANGE, FALSE, MAKELPARAM(sel + 1, count - 1));
  • }
  • return 0;
  • }
  • LRESULT CALLBACK ListboxProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • int sel;
  • switch(uMsg)
  • {
  • case WM_MOUSEMOVE:
  • return ListBox_OnMouseMove(hWnd, wParam, lParam);
  • case WM_LBUTTONDOWN:
  • return ListBox_OnLButtonDown(hWnd, wParam, lParam);
  • case WM_KEYDOWN:
  • switch(wParam)
  • {
  • case VK_DOWN:
  • sel = (int)SendMessage(hWnd, LB_GETSELCOUNT, 0, 0);
  • SendMessage(hWnd, LB_SETSEL, 1, sel);
  • break;
  • case VK_UP:
  • sel = (int)SendMessage(hWnd, LB_GETSELCOUNT, 0, 0);
  • SendMessage(hWnd, LB_SETSEL, 1, sel - 1);
  • SendMessage(hWnd, LB_SETSEL, 0, sel - 1);
  • break;
  • case VK_RETURN:
  • goto ok;
  • case VK_ESCAPE:
  • DestroyWindow(hWnd);
  • break;
  • }
  • break;
  • case WM_LBUTTONUP:
  • ok:
  • case WM_CAPTURECHANGED:
  • if(!g_bCapture)
  • {
  • DestroyWindow(hWnd);
  • g_hListbox = 0;
  • }
  • }
  • return CallWindowProc(defListboxProc, hWnd, uMsg, wParam, lParam);
  • }
  • LRESULT CALLBACK AppWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • static HWND hEdit;
  • switch(uMsg)
  • {
  • case WM_KEYDOWN:
  • case WM_MOUSEWHEEL:
  • if(g_hListbox) PostMessage(g_hListbox, uMsg, wParam, lParam);
  • break;
  • case WM_CREATE:
  • hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", 0, WS_VISIBLE | WS_CHILD, 0, 0, 200, 25,
  • hWnd, (HMENU)1000, g_hInst, 0);
  • CreateWindowEx(0, "Button", "Test", WS_VISIBLE | WS_CHILD, 200, 0, 100, 25,
  • hWnd, (HMENU)1001, g_hInst, 0);
  • break;
  • case WM_COMMAND:
  • if(LOWORD(wParam) == 1001)
  • {
  • char szitems[32];
  • GetWindowText(hEdit, szitems, 32);
  • int nItems = bnatoi(szitems);
  • if(nItems < 1) return 0;
  • POINT pt = {200, 25}; // Coordonnées dans la fenêtre mère
  • // Comme on va mettre le bureau en fenêtre mère, il faut transformer les coordonnées
  • MapWindowPoints(hWnd, HWND_DESKTOP, &pt, 1);
  • g_hListbox = CreateWindowEx(WS_EX_TOOLWINDOW, "Listbox", 0,
  • WS_VSCROLL | WS_BORDER | LBS_HASSTRINGS | LBS_MULTIPLESEL |WS_VISIBLE | WS_CHILD,
  • pt.x, pt.y, 100, 100, hWnd, 0, g_hInst, 0);
  • int height = (int)SendMessage(g_hListbox, LB_GETITEMHEIGHT, 0, 0);
  • if(nItems > MAX_ITEMS) height *= MAX_ITEMS;
  • else height *= nItems;
  • SetWindowPos(g_hListbox, 0, 0, 0, 100, height, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
  • SetParent(g_hListbox, HWND_DESKTOP);
  • for(int i = 0; i < nItems; i++)
  • SendMessage(g_hListbox, LB_ADDSTRING, 0, (LPARAM)"Chaine d'exemple");
  • // Donne le focus à la fenêtre principale, pour qu'elle puisse rediriger les
  • // message vers la listbox (WM_KEYDOWN, WM_WOUSEWHEEL...)
  • SetFocus(hWnd);
  • SetCapture(g_hListbox);
  • defListboxProc = (WNDPROC)SetWindowLongPtr(g_hListbox, GWL_WNDPROC, (LONG_PTR)ListboxProc);
  • }
  • break;
  • case WM_DESTROY:
  • PostQuitMessage(0);
  • return 0;
  • }
  • return DefWindowProc(hWnd, uMsg, wParam, lParam);
  • }
  • #ifdef _DEBUG
  • int main()
  • #else
  • #pragma comment(linker, "/entry:myWinMain")
  • int __stdcall myWinMain()
  • #endif
  • {
  • MSG msg;
  • g_hInst = GetModuleHandle(0);
  • WNDCLASSEX wcex;
  • memset(&wcex, 0, sizeof wcex);
  • wcex.cbSize = sizeof wcex;
  • wcex.lpfnWndProc = AppWndProc;
  • wcex.style = CS_HREDRAW | CS_VREDRAW;
  • wcex.hInstance = g_hInst;
  • wcex.lpszClassName = g_szAppName;
  • wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
  • wcex.hCursor = LoadCursor(0, IDC_ARROW);
  • if(!RegisterClassEx(&wcex)) return 1;
  • g_hWnd = CreateWindowEx(0, g_szAppName, g_szAppName, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU,
  • CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, g_hInst, 0);
  • if(!g_hWnd) return 1;
  • ShowWindow(g_hWnd, SW_NORMAL);
  • while(GetMessage(&msg, NULL, 0, 0))
  • {
  • TranslateMessage(&msg);
  • DispatchMessage(&msg);
  • }
  • #ifdef _DEBUG
  • return (int)msg.wParam;
  • #else
  • ExitProcess(msg.wParam);
  • #endif
  • }
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#include <windows.h>

HINSTANCE g_hInst;
HWND g_hWnd, g_hListbox;
char g_szAppName[] = "DropDown";
BOOL g_bCapture = FALSE;

WNDPROC defListboxProc;

#define MAX_ITEMS  10

int __fastcall bnatoi(const char* psz)
{
  __asm
  {
    xor   eax, eax
    push  ebx
    xor   edx, edx
    xor   ebx, ebx
    cmp   byte ptr[ecx], '-'
    jne   short L1
    inc   ecx
    mov   edx, 0xFFFFFFFF
L1:
    mov   bl, byte ptr[ecx]
    cmp   bl, '0'
    jb    short L2
    cmp   bl, '9'
    ja    short L2
    lea   eax, dword ptr[eax + 4 * eax]
    sub   bl, '0'
    add   eax, eax
    inc   ecx
    add   eax, ebx
    jmp   short L1
L2:
    add   eax, edx
    pop   ebx
    xor   eax, edx
  }
}

LRESULT ListBox_OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  POINT pt = {LOWORD(lParam), HIWORD(lParam)};
  RECT clientRect, screenRect;
  POINT screenMousePos;
  GetCursorPos(&screenMousePos);
  GetWindowRect(hWnd, &screenRect);
  GetClientRect(hWnd, &clientRect);
  LRESULT l = 0;
  if(PtInRect(&screenRect, screenMousePos))
  {
    if(pt.x > clientRect.right)
    {
      // Clic dans la fenêtre, mais en dehors de la zone client
      // Donc sur la scollbar
      g_bCapture = TRUE; // Car la ListBox va recevoir WM_CAPTURECHANGED, mais il ne faut pas la fermer
      // On enlève temporairement la capture
      ReleaseCapture();
      l = CallWindowProc((WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC),
        hWnd,
        WM_NCLBUTTONDOWN,
        HTVSCROLL,
        MAKELPARAM(screenMousePos.x, screenMousePos.y));
      SetCapture(hWnd);
      g_bCapture = FALSE;
    }
    return l;
  }
  else DestroyWindow(hWnd); // Clic à coté de la fenêtre
  return 0;
}

LRESULT ListBox_OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  int sel, count;
  POINT pt;
  RECT rect;
  pt.x = (short)LOWORD(lParam);
  pt.y = (short)HIWORD(lParam);
  GetClientRect(hWnd, &rect);
  if(PtInRect(&rect, pt) || (wParam & MK_LBUTTON))
  {
    // On prend les mouvements de la souris quand on est au dessus de la listBox,
    // ou quand le bouton gauche de la souris est enfoncé
    if(pt.y < 0)
      PostMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
    if(pt.y > rect.bottom)
      PostMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
    sel = LOWORD(SendMessage(hWnd, LB_ITEMFROMPOINT, 0, lParam));
    SendMessage(hWnd, LB_SELITEMRANGE, TRUE, MAKELPARAM(0, sel));
    count = (int)SendMessage(hWnd, LB_GETCOUNT, 0, 0);
    if(sel != count - 1)
      SendMessage(hWnd, LB_SELITEMRANGE, FALSE, MAKELPARAM(sel + 1, count - 1));
  }
  return 0;
}

LRESULT CALLBACK ListboxProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  int sel;
  switch(uMsg)
  {
  case WM_MOUSEMOVE:
    return ListBox_OnMouseMove(hWnd, wParam, lParam);
  case WM_LBUTTONDOWN:
    return ListBox_OnLButtonDown(hWnd, wParam, lParam);
  case WM_KEYDOWN:
    switch(wParam)
    {
    case VK_DOWN:
      sel = (int)SendMessage(hWnd, LB_GETSELCOUNT, 0, 0);
      SendMessage(hWnd, LB_SETSEL, 1, sel);
      break;
    case VK_UP:
      sel = (int)SendMessage(hWnd, LB_GETSELCOUNT, 0, 0);
      SendMessage(hWnd, LB_SETSEL, 1, sel - 1);
      SendMessage(hWnd, LB_SETSEL, 0, sel - 1);
      break;
    case VK_RETURN:
      goto ok;
    case VK_ESCAPE:
      DestroyWindow(hWnd);
      break;
    }
    break;
  case WM_LBUTTONUP:
ok:
  case WM_CAPTURECHANGED:
    if(!g_bCapture)
    {
      DestroyWindow(hWnd);
      g_hListbox = 0;
    }
  }
  return CallWindowProc(defListboxProc, hWnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK AppWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  static HWND hEdit;
  switch(uMsg)
  {
  case WM_KEYDOWN:
  case WM_MOUSEWHEEL:
    if(g_hListbox) PostMessage(g_hListbox, uMsg, wParam, lParam);
    break;
  case WM_CREATE:
    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", 0, WS_VISIBLE | WS_CHILD, 0, 0, 200, 25,
      hWnd, (HMENU)1000, g_hInst, 0);
    CreateWindowEx(0, "Button", "Test", WS_VISIBLE | WS_CHILD, 200, 0, 100, 25,
      hWnd, (HMENU)1001, g_hInst, 0);
    break;
  case WM_COMMAND:
    if(LOWORD(wParam) == 1001)
    {
      char szitems[32];
      GetWindowText(hEdit, szitems, 32);
      int nItems = bnatoi(szitems);
      if(nItems < 1) return 0;

      POINT pt = {200, 25}; // Coordonnées dans la fenêtre mère
      // Comme on va mettre le bureau en fenêtre mère, il faut transformer les coordonnées
      MapWindowPoints(hWnd, HWND_DESKTOP, &pt, 1);
      g_hListbox = CreateWindowEx(WS_EX_TOOLWINDOW, "Listbox", 0, 
        WS_VSCROLL | WS_BORDER | LBS_HASSTRINGS | LBS_MULTIPLESEL |WS_VISIBLE | WS_CHILD,
        pt.x, pt.y, 100, 100, hWnd, 0, g_hInst, 0);
      int height = (int)SendMessage(g_hListbox, LB_GETITEMHEIGHT, 0, 0);
      if(nItems > MAX_ITEMS) height *= MAX_ITEMS;
      else height *= nItems;

      SetWindowPos(g_hListbox, 0, 0, 0, 100, height, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
      SetParent(g_hListbox, HWND_DESKTOP);
      for(int i = 0; i < nItems; i++)
        SendMessage(g_hListbox, LB_ADDSTRING, 0, (LPARAM)"Chaine d'exemple");

      // Donne le focus à la fenêtre principale, pour qu'elle puisse rediriger les
      // message vers la listbox (WM_KEYDOWN, WM_WOUSEWHEEL...)
      SetFocus(hWnd);
      SetCapture(g_hListbox);
      defListboxProc = (WNDPROC)SetWindowLongPtr(g_hListbox, GWL_WNDPROC, (LONG_PTR)ListboxProc);
    }
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

#ifdef _DEBUG
int main()
#else
#pragma comment(linker, "/entry:myWinMain")
int __stdcall myWinMain()
#endif
{
  MSG msg;
  g_hInst = GetModuleHandle(0);
  WNDCLASSEX wcex;

  memset(&wcex, 0, sizeof wcex);
  wcex.cbSize         = sizeof wcex;
  wcex.lpfnWndProc    = AppWndProc;
  wcex.style          = CS_HREDRAW | CS_VREDRAW;
  wcex.hInstance      = g_hInst;
  wcex.lpszClassName  = g_szAppName;
  wcex.hbrBackground  = GetSysColorBrush(COLOR_WINDOW);
  wcex.hCursor        = LoadCursor(0, IDC_ARROW);

  if(!RegisterClassEx(&wcex)) return 1;

  g_hWnd = CreateWindowEx(0, g_szAppName, g_szAppName, WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, g_hInst, 0);
  if(!g_hWnd) return 1;

  ShowWindow(g_hWnd, SW_NORMAL);
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
#ifdef _DEBUG
  return (int)msg.wParam;
#else
  ExitProcess(msg.wParam);
#endif
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

04 mai 2006 14:48:18 :
ExitProcess
04 mai 2006 14:49:11 :
Dans l'apercu aussi

 Sources du même auteur

Source avec Zip COLORATION DE CODE C/C++ POUR LE FORUM DE CPPFRANCE
Source avec Zip SUPPRIMER LES # AJOUTÉS LORS D'UN COPIER/COLLER
Source avec Zip Source avec une capture CRÉER UN FICHIER ISO À PARTIR D'UN RÉPERTOIRE (WIN32)
Source avec Zip Source avec une capture EXPLORATEUR DE FICHIERS ISO
Source avec Zip Source avec une capture CHARGER UNE POLICE DEPUIS UN FICHIER OU UNE RESSOURCE (WIN32...

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API) par racpp
Source avec Zip POPUP QT ANIMER (ANIMATION DU MEME STYLE QUE LES POPUP DE WI... par wyden
Source avec Zip Source avec une capture HMEDIAV2 LECTEUR (WIN32) par hattabking
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] SPLITALL GESTIONNAIRE DE DÉCOUPAGE / REC... par omnia
Source avec Zip MENU DANS UNE LISTBOX (WIN32) par vecchio56

Commentaires et avis

Commentaire de BruNews le 04/05/2006 14:31:03 administrateur CS

Gaffe si tu es en entrypoint perso, entoure le return final dans un #ifdef pour y mettre un ExitProcess() au lieu du return sinon deans de nombreuses situations ton exe ne déchargera pas.

Commentaire de vecchio56 le 04/05/2006 14:50:08 administrateur CS

Effectivement, c'est corrigé
Coup de bol (?), il se déchargeait quand même

Commentaire de Taron31 le 04/05/2006 16:38:07

Vecchio56 : pourquoi doit-on placer le bureau comme Parent (HWND_DESKTOP) à la ListBox ?

Commentaire de vecchio56 le 04/05/2006 16:42:32 administrateur CS

Si on ne le fait pas, ca pose des problèmes quand on a des fenêtres filles que se chevauchent (ici ca ne se voit pas car il n'y a pas déja de fenêtre fille à l'endroit ou on crée la listbox).
En gros si tu crée deux fenêtres filles au même endroit, elles vont se bagarrer pour être au premier plan et en général, on a des résultats étonnants

Commentaire de Joky le 04/05/2006 17:17:21

Bon allez dites moi si j'me trompe

xor eax, eax    //Mettre eax à 0, pourquoi pas mov eax, 0 ???
push ebx        //Placer ebx sur la pile. à quoi correspond ebx ?
xor edx, edx    //Mettre edx et ebx à 0
xor ebx, ebx    //...

cmp byte ptr[ecx], '-'    //On compare le ??? de ecx avec '-'
jne short L1    //On va à L1 si ce n'est pas égal
inc ecx    //On incrément ecx qui correspond au compteur je crois ?
mov edx, 0xFFFFFFFF //On place 0xFFFFFFFF dans edx ? pourquoi ?

L1:  //étiquette L1
mov bl, byte ptr[ecx]  //On place le premier bit de ecx ? dans bl
cmp bl, '0'   //On le compare à '0'
jb short L2   //On saute à L2 si en dessous de '0'
cmp bl, '9'   //On le compare à '9'
ja short L2   //On saute à L2 si au dessus de '0'
lea eax, dword ptr[eax + 4 * eax] //???
sub bl, '0'   //On soustrait '0' à bl
add eax, eax  //On ajoute eax dans eax
inc ecx       //Incrémente le compteur ?
add eax, ebx  //ajouter eax et ebx dans eax, pk ? que contient ebx
jmp short L1  //On fait en boucle

L2:
add eax, edx  //ajouter eax et edx placé dans eax
pop ebx       //On enlève de la pile et on met dan ebx
xor eax, edx  //???

Commentaire de Taron31 le 04/05/2006 17:21:41

OK merci, autre chose : en réalité tu fait passer les messages WM_KEYDOWN & WM_MOUSEWHEEL à la ListboxProc et les autres y sont capturés directement sans passer par la WndProc principale ?

Commentaire de vecchio56 le 04/05/2006 17:22:01 administrateur CS

Mon dieu, voila ce qui arrive quand on commente de l'assembleur!
Je me doute que ecx contient le param, qu'est ce que ca pourrait être d'autre...
Je précise que c'est BruNews qui a écrit cette fonction, pas moi
Maintenant que tu sais ce que contient ecx, tu va peut être mieux comprendre

Commentaire de vecchio56 le 04/05/2006 17:26:07 administrateur CS

WM_MOUSEMOVE et les autres messages de la souris sont effectivement recus automatiquement car la Listbox à la capture de la souris (je fais un SetCapture).
WM_KEYDOWN & WM_MOUSEWHEEL sont deux messages utiles qui ne sont pas envoyés à la ListBox car elle n'a pas le focus, et on ne peut pas le lui donner

Commentaire de BruNews le 04/05/2006 17:37:46 administrateur CS

Allez, pour Joky (quelques cycles en moins):

__declspec(naked) int __fastcall bnatoi(char *szsrc)
{ // ECX = szsrc
  __asm {
    xor     edx, edx
    mov     [esp-4], ebx
    mov     dl, [ecx]
    xor     eax, eax
    xor     ebx, ebx
    cmp     dl, '-'
    jb      short nbrEXIT
    jne     short noPOINT
    inc     ecx
    dec     ebx
nbrLOOP:
    mov     dl, [ecx]
noPOINT:
    cmp     dl, '0'
    jb      short nbrSTOP
    cmp     dl, '9'
    ja      short nbrSTOP
    lea     eax, [eax+eax*4]
    sub     dl, '0'
    add     eax, eax
    inc     ecx
    add     eax, edx
    jmp     short nbrLOOP
nbrSTOP:
    add     eax, ebx
    xor     eax, ebx
nbrEXIT:
    mov     ebx, [esp-4]
    ret     0
  }
}

lea peut faire addition, soustraction et multiplication en 1 passe.
donc: lea     eax, [eax+eax*4]
fait: eax = eax * 5;

Commentaire de Joky le 05/05/2006 00:28:43

Lol je veux bien mais bon je voulais juste savoir pourquoi ces registres et les réponses aux questions que j'ai posé dans les commentaires sur ta fonction lol :)

J'suis chiant je sais ;)

Commentaire de BruNews le 05/05/2006 10:38:16 administrateur CS

push ebx
met sa valeur sur la pile pour restituer en sortie de fonction.
Aller dur forum asmfr pour le reste, ça évitera de flooder cette source avec des questions sans rapport au sujet principal.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Focus et couleur... en C pour PocketPC [ par fredsor ] Bonjour a vousDans mon projet, je dois créer différents composant visuel pour Pocket PC : libellé, editbox,bouton et listbox (la aussi pa le choix)- C WS_POPUP et focus [ par vecchio56 ] C'est un problème assez compliqué a expliquer... J'ai remarqué que les menus (obtenus par exemple avec TrackPopupMenu) sont des fenêtre popup (avec le Pb de tableau et de listbox [ par sran_isback ] Bonjour ! j'ai un ptit probl&#233;me concernant un tableau a afficher dans une listbox! j'aimerais bien qu'il m'affiche les nombres de 1 &#224; cents Gestion dynamique des controles (button, listbox, static text ....etc) [ par SaNcOdeR ] Bonjour, je recherche une classe de gestion dynamique des controles tel que les bouttons, les check box, les tree ...etc... afin de pouvoir g&#233;r&# ListBox multiline [ par unrealgun ] Bonjour, Je cherche désespérément comment je peux mettre un texte avec retour a la ligne, donc sur plusieurs lignes dnas un seul item de la listbox ; transparence + focus + message entre apps [ par alphaone ] Bonours, 1)Voila je faire un exe qui rend les autre féntre plus ou moin transparente si elle sont selectionner ou non. 2)Et je veux aussi que si on l focus fenetre [ par darksoul07 ] existe il une fonction pour connaître la dernière fenêtre (item de menu...) a avoir eu le focus quand je clic sur une autre fenêtre du même programme imprimer le contenu d'une listBox [ par drcmomo ] Bonjour tout  le monde!!!Je cherche à imprimer des données dans une listBox avec le code ci-dessous quand je lance l'impression il m'imprime une page Messages au Listbox [Win32] [ par gbourgeois0019 ] Salut,Je voudrais intercepter le double-click dans un listbox. Je sais qu'il y a des dizaines de posts pour ca mais je les ai tous lus et ca ne marche Listbox [ par MadMarc ] Bonjour,j'ai un petit soucis avec une listbox :quand je fais mon SendMessage(Chan-&gt;getHwndListeConnectes(),LB_ADDSTRING,0,(LPARAM) buffer); la vale


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,201 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales