ListCtrl и Popup (Right Click) Menu
От: Viatcheslav G. Malakhov Россия http://www.slayeek.ru/
Дата: 23.10.03 18:21
Оценка:
Здравствуйте.

Я сделал программу АппВизардом на основе CListView. В этот View выбираются данные из базы. Выбираются ссылки на файлы локальных FTP серверов. Всё хорошо. Далее, сделал при клике на строчку с ссылкой добавление оной в буфер обмена. Потом решил, что нужно это реализовать через контекстное меню.

Сначала мучался с попап меню.

Таким образом:


void CFTPSrchView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
     CMenu menu;
     CPoint point;
     menu.LoadMenu(IDR_POPUP1);
     CMenu *popup=menu.GetSubMenu(0);
     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this);
}


Меню не вылезало вообще. Был варнинг: local variable 'point' used without having been initialized.

Потом ради интереса сделал так:

void CFTPSrchView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
     CMenu menu;
     CPoint point;
     menu.LoadMenu(IDR_POPUP1);
     CMenu *popup=menu.GetSubMenu(0);
     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,100,100, this);
}


Меню вылезло без варнингов, но, естевственно по координатам 100 100.

Решил эксперементировать дальше. Иду в редактор меню. Хочу, как обычно, выбрав нужный пункт меню и нажам Ctrl+W, задать обработчик этому пункту. Хотел бы, но вылезает предложение создать класс.

Так вот каким образом мне релизовать:
1) Появлению меню, там где щёлкнули мышью.
2) Как сделать обработчик на пукнт меню.

Заранее спасибо за помощь.
--------------------------
С уважением, Малахов В.Г.
Microsoft Certified Professional
Microsoft Certified Application Developer
Re: ListCtrl и Popup (Right Click) Menu
От: kolam http://www.linkedin.com/in/kolam
Дата: 24.10.03 05:19
Оценка:
Здравствуйте, Viatcheslav G. Malakhov, Вы писали:

VGM>Так вот каким образом мне релизовать:

VGM>1) Появлению меню, там где щёлкнули мышью.
WM_CONTEXTMENU

VGM>Хотел бы, но вылезает предложение создать класс.

Там не только новый класс можно создать, но и выбрать из уже существующих.

VGM>2) Как сделать обработчик на пукнт меню.

А можно и без wizard'а обойтись. Обработчик команды пишется вручную по аналогии с уже существующими. Или см. описание ON_COMMAND macro в MSDN.
kolam
Re[2]: ListCtrl и Popup (Right Click) Menu
От: Viatcheslav G. Malakhov Россия http://www.slayeek.ru/
Дата: 24.10.03 07:33
Оценка:
Спасибо, всё сделал.
--------------------------
С уважением, Малахов В.Г.
Microsoft Certified Professional
Microsoft Certified Application Developer
Re[3]: ListCtrl и Popup (Right Click) Menu
От: ZappaZ  
Дата: 18.11.05 00:53
Оценка:
Здравствуйте, Viatcheslav G. Malakhov, Вы писали:

VGM>Спасибо, всё сделал.


Да, ещё один момент. Есть замечательная такая функция ClientToScreen. Так вот ей можно передать то, что ты получил и на выходе координаты моника
Re: ListCtrl и Popup (Right Click) Menu
От: ekamaloff Великобритания  
Дата: 18.11.05 09:39
Оценка:
Здравствуйте, Viatcheslav G. Malakhov, Вы писали:

VGM>Здравствуйте.


VGM>Я сделал программу АппВизардом на основе CListView. В этот View выбираются данные из базы. Выбираются ссылки на файлы локальных FTP серверов. Всё хорошо. Далее, сделал при клике на строчку с ссылкой добавление оной в буфер обмена. Потом решил, что нужно это реализовать через контекстное меню.


VGM>Сначала мучался с попап меню.


VGM>Таким образом:



VGM>
VGM>void CFTPSrchView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
VGM>{
VGM>     CMenu menu;
VGM>     CPoint point;
VGM>     menu.LoadMenu(IDR_POPUP1);
VGM>     CMenu *popup=menu.GetSubMenu(0);
VGM>     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this);
VGM>}
VGM>


VGM>Меню не вылезало вообще. Был варнинг: local variable 'point' used without having been initialized.


Еще бы — ты не проинициализировал переменную point. В ней был мусор, который ты не мудрствуя лукаво передавал в метод TrackPopupMenu. А нужно было так:

>
void CFTPSrchView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
     CMenu menu;
     CPoint point;
     GetCursorPos(&point);
     menu.LoadMenu(IDR_POPUP1);
     CMenu *popup=menu.GetSubMenu(0);
     popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this);
}
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.