|
hi,
Need to create context menu in win32 ,in the list view control when I right click on the listitem .
It will open the popmenu or contextmenu and give the option "Delete" .
then it will remove the file from the listview.
|
|
|
|
|
1. overide the NM_RCLICK message of list control.
2. Inside it create a CMenu object and load menu from the resource.
3. Call TrackPopupMenu of the CMenu object.
nave
|
|
|
|
|
yes , i have doing the same thing from the help but how can i get the pt.x and pt.y.
if(((LPNMHDR)lParam)->code == NM_RCLICK)
{
HMENU hmenuTrackPopup;
POINT pt;
HMENU hMenu=LoadMenu(hInst,TEXT("IDR_MENU1"));
TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN | TPM_RIGHTBUTTON,<code>pt.x, pt.y</code>, 0, hList, NULL);
}
due to that application break this point so how can i handle?
Amit
|
|
|
|
|
|
That point is given to you when the user clicks the mouse.
|
|
|
|
|
use
CPoint pt = GetCurrentMessage()->pt;
nave
|
|
|
|
|
Catch WM_CONTEXTMENU, it gives you the mouse location as well.
Load the menu you want to show (usually load menu from resource id, then load sub menu).
Call TrackPopupMenu.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
Thank you all nice guys!
but still the application is not give me the "delete" popup/context menu.
the code is below.
if(((LPNMHDR)lParam)->code == NM_RCLICK)
{
HMENU hmenuTrackPopup; // shortcut menu
POINT pt;
GetCursorPos(&pt);
HMENU hMenu=LoadMenu(hInst,TEXT("IDR_MENU1"));
hmenuTrackPopup= GetSubMenu(hMenu, 0);
TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,0, hList, NULL);
}
Amit
|
|
|
|
|
i doubt the way you created the context menu in the resource. U must create the Delete menu as submenu.
eg:
Mainmenu
|
|->Delete
then u must specify the id of main menu in the LoadMenu() function
more over if u use CMenu, it will be a little easiler that the above
CMenu PopUpMenu;<br />
PopUpMenu.LoadMenu( IDR_MENU1 );<br />
CPoint pt;<br />
pt = GetCurrentMessage()->pt;<br />
PopUpMenu.GetSubMenu( 0 )->TrackPopupMenu( TPM_LEFTALIGN, pt.x, pt.y, this, 0 );
nave
|
|
|
|
|
which includes are necessary for CMenu because i am not working on MFC.
i have replace POINT with CPoint.but how menu ???
Amit
|
|
|
|
|
no pblm ...use sdk calls it self
POINT pt;
HMENU hMenu=LoadMenu(hInst,TEXT("IDR_MENU1"));
Point pt;
pt = GetCurrentMessage()->pt;
HMENU hSubmenu = GetSubMenu( hMenu,0 );
TrackPopupMenu( hSubmenu, TPM_LEFTALIGN, pt.x, pt.y, hList, 0 );
but dont forget to make the delete as submenu.
i found another ppblm in your code
HMENU hMenu=LoadMenu(hInst,TEXT("IDR_MENU1"));
TrackPopupMenu(hmenuTrackPopup,TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x, pt.y, 0, hList, NULL);
in the above code that you pasted earlier, you r loading the menu to hMenu. But your calling the TrackPopupMenu with handle hmenuTrackPopup
nave
|
|
|
|
|
yes thanks !
actually when I received your mail at the same time i have did it.
and when i have compare with your code its same.
Thanks once again.
|
|
|
|
|
hi nave ,
ask you one question how can i handle an event for the delete button
for that i have put my code in
<br />
case WM_COMMAND:<br />
<br />
switch(LOWORD(wParam))<br />
{ <br />
case ID_DELETE_DELETE: <br />
{<br />
int iSlected=0;<br />
iSlected=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);<br />
if(iSlected==-1)<br />
{<br />
MessageBox(hList,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);<br />
break;<br />
} <br />
ListView_DeleteItem(hList,iSlected); <br />
}<br />
<br />
break;<br />
<br />
}<br />
<br />
should it work or now i have to write somewhere else?
Amit
|
|
|
|
|
Did you run your code and what happens and also you can use of LVNI_SELECTED
|
|
|
|
|
amitmistry_petlad wrote: iSlected=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
better use LVNI_SELECTED
every thing else seems to be fine
nave
|
|
|
|
|
I have changed it but the "delete" is not working.
should i have to change anything else?
Amit
|
|
|
|
|
Whats the value of selected item?
nave
|
|
|
|
|
When i debug at the break point of the WM_COMMAND.
the control does not go there. then where should it goes ?
is it come in listview command ?
if it is call in listview notify command then how could i write ?
LOOK AT CODE:
case WM_PAINT:
hdc = BeginPaint(hDlg, &ps);
EndPaint(hDlg, &ps);
break;
case WM_NOTIFY:
{
switch(LOWORD(wParam))
{
case IDC_LIST4:
LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
if(pnm->hdr.hwndFrom == hList &&pnm->hdr.code == NM_CUSTOMDRAW)
{
return TRUE;
}
if(((LPNMHDR)lParam)->code == LVN_KEYDOWN)
{
{
int iSlected=0;
iSlected=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
if(iSlected==-1)
{
MessageBox(hList,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);
break;
}
ListView_DeleteItem(hList,iSlected);
}
}
if(((LPNMHDR)lParam)->code == NM_RCLICK)
{
HMENU hMenu = LoadMenu (NULL, MAKEINTRESOURCE (IDR_MENU1));
HMENU hPopupMenu = GetSubMenu (hMenu, 0);
POINT pt;
SetMenuDefaultItem (hPopupMenu, -1, TRUE);
GetCursorPos (&pt);
TrackPopupMenu (hPopupMenu,TPM_LEFTALIGN, pt.x, pt.y, 0, hList, NULL);
DestroyMenu (hPopupMenu);
DestroyMenu (hMenu);
}
if(((LPNMHDR)lParam)->code == NM_CLICK)
{
iSelect=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
if(iSelect==-1)
{
break;
}
index=iSelect;
ShowWindow(hWndinoutfiledir,SW_HIDE);
ShowWindow(hwndEncrypt,SW_HIDE);
ShowWindow(hwndSplit,SW_HIDE);
ShowWindow(hwndUpload,SW_HIDE);
ShowWindow(hwndTagEditorDlg ,SW_SHOW);
}
break;
}
}
break;
<code>
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_DELETE_DELETE:
{
int iSlected=0;
iSlected=SendMessage(hList,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
if(iSlected==-1)
{
MessageBox(hList,_T("No Items in ListView"),_T("Error"),MB_OK|MB_ICONINFORMATION);
break;
}
ListView_DeleteItem(hList,iSlected);
}
break;
}
break;
}
return FALSE;
}
</code>
Amit
|
|
|
|
|
amitmistry_petlad wrote: TrackPopupMenu (hPopupMenu,TPM_LEFTALIGN, pt.x, pt.y, 0, hList, NULL);
ok i found out the pblm.
u should not specify hList in the TrackPopupMenu function. Instead specify the handle of dialog
( in your case it hWnd ).
nave
|
|
|
|
|
yes ! thanks it done,
but one more, have you seen my code for LVN_KEYDOWN .
Now i want specify it for VK_DELETE only.
right now it works but for all key i want only for "Delete" key from "keyboard"
i had comment the code for VK_DELETE .
HOW ITS WORK FINE?
|
|
|
|
|
hmm. i checked it now. Modify the code as below
if(((LPNMHDR)lParam)->code == LVN_KEYDOWN) <br />
{<br />
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)lParam;<br />
if( pLVKeyDow->wVKey == VK_DELETE )<br />
{<br />
}<br />
}
nave
|
|
|
|
|
thank you very much
|
|
|
|
|
If i delect my file and it is in unicode then TCHAR should treat as WCHAR otherwise TCHAR as CHAR
Is it possible ?
|
|
|
|
|
TCHAR only affects the strings that are in your source code. When you read a data file, you need to know what encoding was used to create the file, and use the appropriate data type (char or wchar_t or an equivalent).
|
|
|
|
|
Actually i want TCHAR as WCHAR for unicode type file otherwise CHAR.
But if i enable unicode in project setting .TCHAR always be WCHAR.
But i want for ascii file it should be CHAR.
|
|
|
|
|