Autor
|
Tema: GUI y eventos (Leído 5,367 veces)
|
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!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
|
En línea
|
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
|
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í: 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!
|
|
« Última modificación: 16 Marzo 2013, 21:05 pm por mDrinky »
|
En línea
|
Un byte a la izquierda.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Item,Subitem:
WM_NOTIFY->NM_RCLICK
|
|
|
En línea
|
|
|
|
fary
|
Item,Subitem:
WM_NOTIFY->NM_RCLICK
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
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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?
|
|
|
En línea
|
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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); }
|
|
« Última modificación: 17 Marzo 2013, 01:11 am por x64Core »
|
En línea
|
|
|
|
fary
|
@x64Core ya se que Beep no le da el foco . Lo que busco es saber cuando se ha clicado en el ListView y que item se a seleccionado. un saludo.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
@x64Core ya se que Beep no le da el foco . 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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Capturar eventos en Vb
Ingeniería Inversa
|
shoulck
|
3
|
2,985
|
11 Julio 2006, 20:13 pm
por frankener1986
|
|
|
eventos
Programación Visual Basic
|
abel_xtnt
|
8
|
3,844
|
14 Octubre 2005, 21:12 pm
por abel_xtnt
|
|
|
Eventos Ratón C#
.NET (C#, VB.NET, ASP)
|
kargarof
|
7
|
12,740
|
4 Julio 2008, 11:22 am
por kargarof
|
|
|
Eventos en C++
Programación C/C++
|
HaX991
|
6
|
7,981
|
2 Agosto 2010, 10:51 am
por HaX991
|
|
|
Eventos
« 1 2 »
.NET (C#, VB.NET, ASP)
|
TheGhost(Z)
|
11
|
6,527
|
19 Enero 2011, 12:59 pm
por [D4N93R]
|
|