GUI y eventos

Iniciado por fary, 16 Marzo 2013, 15:32 PM

0 Miembros y 1 Visitante están viendo este tema.

fary

Hola, estoy creando una ventana con un litview y quiero detectar cuando se pulsa un boton sobre uno de los item del listview y sabe rque item es, tengo la ventana así:



Pero no consigo saber como hacer eso...

un saludo!
Un byte a la izquierda.

Eternal Idol

Proba con:
LVN_ITEMACTIVATE notification code (Windows)

Remarks
To obtain the items being activated, the receiving application should use the LVM_GETSELECTEDCOUNT message to retrieve the number of items that are selected and then send the LVM_GETNEXTITEM message with LVNI_SELECTED until all of the items have been retrieved.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

fary

#2
Creo que tengo mal la constante LVN_ITEMACTIVATE porque no me funciona... No he encontrado su valor en la msdn y la he tenido que obtener así:

#include <windows.h>
#include <stdio.h>
#include <commctrl.h>

#define LVN_ITEMACTIVATE (LVN_FIRST-14)

int main()
{
   printf("0x%x",LVN_ITEMACTIVATE);
   return 0;
}


Y la uso así:

Código (asm) [Seleccionar]
miWM_NOTIFY:
          mov eax,[lparam]
          add eax,0x8
          mov eax,[eax]  ; EAX = lparam->code


          .if eax = 0xFFFFFF8E ; LVN_ITEMACTIVATE
              invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
          .endif

          jmp salirWPROC


saludos!
Un byte a la izquierda.

x64core

Item,Subitem:

WM_NOTIFY->NM_RCLICK

fary

Cita de: x64Core en 16 Marzo 2013, 20:54 PM
Item,Subitem:

WM_NOTIFY->NM_RCLICK

Código (asm) [Seleccionar]

miWM_NOTIFY:
           mov eax,[lparam]
           add eax,0x8
           mov eax,[eax]  ; EAX = lparam->code


           .if eax = 0xFFFFFFFB ; NM_RCLICK
               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
           .endif

           jmp salirWPROC


Ahí me lo detecta bien el clic derecho pero no se me seleciona el item :S

Un byte a la izquierda.

x64core

Cita de: mDrinky en 16 Marzo 2013, 21:06 PM
Código (asm) [Seleccionar]

miWM_NOTIFY:
           mov eax,[lparam]
           add eax,0x8
           mov eax,[eax]  ; EAX = lparam->code


           .if eax = 0xFFFFFFFB ; NM_RCLICK
               invoke MessageBoxA,0,0,0,0   ; comprobamos que funciona.
           .endif

           jmp salirWPROC


Ahí me lo detecta bien el clic derecho pero no se me seleciona el item :S



Y si llamas a Beep en lugar de Messagebox debido a que Windows da el foco inmediatamente al box de mensaje?  :silbar:

fary

Tampoco le da el foco con Beep@Kernel32.dll  :-\
Un byte a la izquierda.

x64core

#7
Cita de: mDrinky en 16 Marzo 2013, 23:33 PM
Tampoco le da el foco con Beep@Kernel32.dll  :-\

En realidad me referia que usando MessageBox window le da el foco al cuadro de texto no que Beep le daria el foco, Beep se usaria solo para saber que el EIP pasa por ahi. un winproc en C no tengo ningun problema, o talvez puedes explicar mejor lo que buscas o talvez lo encuentres en el winproc, nitemact tiene toda la information que estas pidiendo:


// test only
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  static   char           szColumnHeader[][12] = {" col1", "col2", "col3"};
  static   Item           ListItem[3];
  static   HWND           hWndListView;
  static   LV_ITEM        lv;
  int                     index;
  int                     iiWidth[3];
  LV_COLUMN               lvC;
  RECT                    rect;

  LV_DISPINFO             *Lvinfo;
  NMITEMACTIVATE          *nitemact;

  switch (iMsg)
  {
  case WM_CREATE :
     hWndListView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW,"", WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SHOWSELALWAYS,0, 0, 0, 0, hwnd,(HMENU)ID_LISTVIEW, NULL, NULL);
     ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

     iiWidth[0] = 100;
     iiWidth[1] = 100;
     iiWidth[2] = 100;

     lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
     lvC.fmt = LVCFMT_LEFT;

     for(index = 0; index < 3; index++)
     {
        lvC.iSubItem = index;
        lvC.cx = iiWidth[index];
        lvC.pszText = szColumnHeader[index];
        ListView_InsertColumn(hWndListView,index,&lvC);
     }

     strcpy(ListItem[0].szItemNr, "item1");
     strcpy(ListItem[0].szItem, "subitem1");
     strcpy(ListItem[0].szItemDescription, "subitem1");

     strcpy(ListItem[1].szItemNr, "item2");
     strcpy(ListItem[1].szItem, "subitem2");
     strcpy(ListItem[1].szItemDescription, "subitem2");

     AdjustListView(hWndListView, &lv, index);
     break;

  case WM_SIZE :
     GetClientRect(hwnd, &rect);
     MoveWindow(hWndListView, 3, 3, rect.right - 6, rect.bottom - 6, 1);
     break;

  case WM_NOTIFY :
     switch(((LPNMnitemact)lParam)->code)
     {
     case NM_RCLICK :
         
        nitemact = (NMITEMACTIVATE *)lParam;
        break;
     case LVN_GETDISPINFO :
        Lvinfo = (LV_DISPINFO FAR*)lParam;
        if((((LPNMnitemact)lParam)->hwndFrom == hWndListView))
        {
           switch(Lvinfo->item.iSubItem)
           {
           case 0:
              Lvinfo->item.pszText =  ListItem[Lvinfo->item.iItem].szItemNr;
              break;
           case 1:
              Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItem;
              break;
           case 2:
              Lvinfo->item.pszText = ListItem[Lvinfo->item.iItem].szItemDescription;
              break;
           }
           break;
        }
     }
     
     break;
     
  case WM_CLOSE :
     DestroyWindow(hwnd);
     break;

  case WM_DESTROY :
     PostQuitMessage(0);
     break;
  }
  return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

fary

@x64Core ya se que Beep no le da el foco  :rolleyes:. Lo que busco es saber cuando se ha clicado en el ListView y que item se a seleccionado.

un saludo.
Un byte a la izquierda.

x64core

Cita de: mDrinky en 24 Marzo 2013, 15:38 PM
@x64Core ya se que Beep no le da el foco  :rolleyes:. Lo que busco es saber cuando se ha clicado en el ListView y que item se a seleccionado.

un saludo.

Lee el codigo de arriba