Visual C++编程技巧之12
1:问如何在Tree空件上实现点右健选中Item并下拉出菜单,如同VC5中的Workspce窗口.
注:已测试通过
void CMyTreeView::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint point;
GetCursorPos(&point); // 当前鼠标坐标
CPoint PointInTree = point;
m_tree.ScreenToClient( &PointInTree);
CMenu menu;
CMenu *ptrMenu;
HTREEITEM Item;
UINT nFlag = TVHT_ONITEM; // 当在 Item 上右击时
Item = m_tree.HitTest( PointInTree, &nFlag );
if ( Item != NULL)
{ m_tree.SelectItem(Item);
menu.LoadMenu(IDR_MENU1);
ptrMenu=menu.GetSubMenu(0);
ptrMenu->TrackPopupMenu
(
TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x,
point.y,
this,
NULL);
}
*pResult = 0;
}
2:我想在CDialog类中的树控件中响应右键弹起这一消息
我做一个回答,不过不保证是最好的,因为我没有很细的研究过
CTREEVIEW 和CTREEBOX,但是肯定能实现。
第一,ctreebox 不响应WM_RBUTTONDOWN,而你的程序肯定是要
让他响应这个消息的,可以用窗口子类化的方法,具体我就不多
说了,如果用API的化,是setwindowlong,第一个参数是hwnd,
第二个是GWL_WNDPROC,第三个是你的新PROC函数的地址,就是
函数名.如果用宏,就是subclass,宏定义在WINDOWSX。H里。
如果用MFC,CWND:SUBCLASS。注意新的PROC定义:
LRESULT(or LPVOID) CALLBACK SubclassPROC(HWND hwnd,UINT uMsg,WPARAM
wParam,LPARAM lParam)
第二,在新的消息PROC里,对WM_RBUTTONDOWN响应后,可以创建
一个浮动菜单,
if ((UINT)lParam==(UINT)WM_RBUTTONDOWN)
{
CPoint pt;
GetCursorPos(&pt);
char buf[40];
strcpy(buf, "fucking");
CMenu menu, *pMenu;
if (menu.LoadMenu(IDR_MENU_POPNEDDLE))
pMenu = menu.GetSubMenu(0);
pMenu->ModifyMenu(0 , MF_BYPOSITION, IDR_FUCK,//menuID buf);
}
然后定位菜单
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x,
pt.y, this, NULL);
3:怎样在程序中启动缺省浏览器,并进入某一网址
用API函数:ShellExecute 具体用法看VC的MSDN,
Example:
ShellExcute(hWnd,"open","http://club.netease.com",NULL,NULL,SW_MAXIMIZE
);