RT,有两个问题:
1,自己做了个TreeView窗口,但是鼠标右击消息死活不响应,WM_CONTEXTMENU和NM_RCLICK都试过,都不行。是不是建立窗口creatwindow的时候要加入支持右击的窗口风格或者其他原因?
2,已经添加了TVS_EDITLABELS,在notifyTV中也添加了TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT,问题是,什么时候可以修改原有项,感觉有时候鼠标点着点着,突然就可以修改了。
1,自己做了个TreeView窗口,但是鼠标右击消息死活不响应,WM_CONTEXTMENU和NM_RCLICK都试过,都不行。是不是建立窗口creatwindow的时候要加入支持右击的窗口风格或者其他原因?
2,已经添加了TVS_EDITLABELS,在notifyTV中也添加了TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT,问题是,什么时候可以修改原有项,感觉有时候鼠标点着点着,突然就可以修改了。
WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_EDITLABELS,
prect->left(), prect->top(),
prect->right(), prect->bottom(),
hwnd, (HMENU)ID_TREEV, app->instance(), NULL);
其中,WC_TREEVIEW在wince中定义为#define WC_TREEVIEWW L"SysTreeView32"
Sent by a list-view control when the user clicks an item with the right mouse button. This notification message is sent in the form of a WM_NOTIFY message.SyntaxNM_RCLICK lpnmitem = (LPNMITEMACTIVATE) lParam;
{
NMHDR* lpnmh = (NMHDR*)lParam;
switch(lpnmh->code)
{
case NM_RCLICK:
break; default:
break;
}
}
break;
pnmh = (LPNMHDR)lParam;
switch (pnmh->code) {
case NM_CLICK:
break;
case NM_DBLCLK:
break;
case NM_RCLICK:
idItem = idItem;
break;
左击和双击都可以,右击响应不了
//子类化tree view过程
WNDPROC TVoldProc;
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
HWND hwndTreeView = GetDlgItem(hWnd, IDC_TREEVIEW);
LPNMTREEVIEW pnmv=(LPNMTREEVIEW)lParam;
LPNMHDR lpnmh = (LPNMHDR) lParam;
switch(Msg)
{
case WM_LBUTTONDOWN:
OutputDebugString("WM_LBUTTONDOWN\n");
break;
case WM_LBUTTONDBLCLK:
OutputDebugString("WM_LBUTTONDBLCLK\n");
break;
}
return CallWindowProc(TVoldProc, hWnd, Msg, wParam, lParam);
}
//
LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{...
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
// TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
//
#define TV_WIDTH 200
#define TV_HEIGHT 200
//VLISTVW.C
HWND CreateTreeView(HINSTANCE hInstance, HWND hwndParent)
{
DWORD dwStyle;
HWND hwndTreeView;
BOOL bSuccess = TRUE;dwStyle = WS_TABSTOP | WS_CHILD | WS_BORDER | WS_VISIBLE ;//
hwndTreeView = CreateWindowEx( WS_EX_WINDOWEDGE,//WS_EX_CLIENTEDGE,// ex style
WC_TREEVIEW, // class name defined in commctrl.h
NULL, // window text
dwStyle, // style
300, // x position
120, // y position
TV_WIDTH, // width
TV_HEIGHT, // height
hwndParent, // parent
(HMENU)IDC_TREEVIEW, // ID
(HINSTANCE)GetWindowLong(hwndParent, GWL_HINSTANCE), // instance
NULL); // no extra data
//
if(hwndTreeView)
{
InitTreeView(hwndTreeView);
return hwndTreeView;
}
else
{
return NULL;
}
}
WNDPROC TVoldProc;
...
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
{
BOOL bl;
HDC hdc;
HPEN hPen;
HPEN hOldPen; HINSTANCE hInstance=(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
switch(message)
{
case WM_CREATE:
MessageBeep(48);
m_hMain=hwnd;
//
m_hStatic=CreateStatic(hInstance,m_hMain);
//Animate_Create ACS_AUTOPLAY m_hStatic
m_hAnimate=Animate_Create(m_hStatic,IDC_AVI,WS_CHILD | WS_VISIBLE | WS_BORDER | ACS_AUTOPLAY |
ACS_TRANSPARENT,// | ACS_CENTER=0
hInstance);
if(m_hAnimate)
bl=Animate_Open(m_hAnimate, MAKEINTRESOURCE(ID_AVI));
// CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc) ; DialogBox((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc);
//
m_hListView=CreateListView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd) ;
// LVoldProc = (WNDPROC)SetWindowLong(m_hListView, GWL_WNDPROC, (LONG)LVProc);
//
m_hListBox = CreateLB(hwnd);
LBoldProc = (WNDPROC)SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)LBProc);
//
m_hComboBox=CreateCB(hwnd);
//
m_hToolTip=CreateTT(m_hListView);
LvAddTools();
//
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
...
break;
BOOL InitTreeView(HWND hwndTreeView)
{
// set tree style
LONG NewStyle=GetWindowLong(hwndTreeView,GWL_STYLE);
NewStyle=NewStyle|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|
TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_EDITLABELS;
SetWindowLong(hwndTreeView,GWL_STYLE,NewStyle);
//
HIMAGELIST hImageList;
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",0,&sfi,sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
if (hImageList)
{// Attach ImageList to TreeView
TreeView_SetImageList(hwndTreeView,hImageList,TVSIL_NORMAL);
}// draw tree "My Computer"
TV_INSERTSTRUCT TreeCtrlItem;
TreeCtrlItem.hParent = TVI_ROOT;
TreeCtrlItem.hInsertAfter = TVI_LAST;// don't use TVI_SORT;
TreeCtrlItem.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_CHILDREN;//|TVIF_STATE;
TreeCtrlItem.item.pszText= m_MyComputer;//
TreeCtrlItem.item.cchTextMax = MAX_PATH;
TreeCtrlItem.item.cChildren=1;// has child show "+"
//
HRESULT hr;
LPMALLOC lpMalloc;
hr=::SHGetMalloc(&lpMalloc);
if (FAILED(hr)) return TRUE;
// get pidl of "My Computer"
LPITEMIDLIST lpidl=NULL; // pidl of "My Computer"
hr=SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&lpidl);
if (FAILED(hr)) return TRUE;
// icons and "My Computer"
SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO), SHGFI_PIDL |
SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
TreeCtrlItem.item.iImage = sfi.iIcon;
strcpy(m_MyComputer,sfi.szDisplayName);
//
SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL |
SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
// insert root
HTREEITEM hTreeItem1 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
TreeCtrlItem.hParent = hTreeItem1;
// Free
lpMalloc->Free(lpidl);
lpMalloc->Release();
// under "My Computer"
char buf[MAX_PATH];
char *pDrv=buf;
char drive[40];
if(GetLogicalDriveStrings(260,buf))
{// try all drive
while(*pDrv)
{
strcpy(drive,pDrv);
pDrv+=strlen(drive)+1;
// no A:
if(stricmp(drive,"A:\\")==0) continue;
SHGetFileInfo(drive,FILE_ATTRIBUTE_DIRECTORY,&sfi,sizeof(sfi),
SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
TreeCtrlItem.hParent = hTreeItem1;
TreeCtrlItem.item.pszText = sfi.szDisplayName;
TreeCtrlItem.item.iImage=sfi.iIcon;
TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
TreeCtrlItem.item.cChildren=1;// child show "+"
// add in
HTREEITEM hTreeItem2 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
// TreeCtrlItem.hParent = hTreeItem2;
}
}
// expand "My Computer"
// TreeView_SelectItem(hwndTreeView,hTreeItem1);//m_Tree.SelectItem();// root
TreeView_Expand(hwndTreeView,hTreeItem1,TVE_EXPAND);// root return TRUE;
}
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
这两句怎么编译通不过呢,说GWL_HINSTANCE未定义,还有SetWindowLong()里的第3个参数,TVProc这个函数不能转换为LONG型?
#define GetWindowLong GetWindowLongW
#define SetWindowLong SetWindowLongW
有关
我想试下WM_NOTIFY消息里的NM_RCLICK,但是在switch(msg)里,捕捉不到WM_NOTIFY消息
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
的,
你调试一下看看
case WM_NOTIFY:
OutputDebugString("WM_NOTIFY\n");
break;
// 比click多!
case WM_NOTIFY:
OutputDebugString("WM_NOTIFY\n");
break;
在:
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
中!
LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
case WM_NOTIFY:
if(wParam==IDC_LISTVIEW)
{
return (ListViewNotify(hwnd, lParam));
}
else if (wParam==IDC_TREEVIEW)
{
return (TreeViewNotify(hwnd, lParam));
}
break;
hwndTV = CreateWindowEx(0, WC_TREEVIE, TEXT(""),
WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_EDITLABE, prect->left(), prect->top(),
prect->right(), prect->bottom(),
hwnd, (HMENU)ID_TREEV, app->instance()
, NULL);
// Create image list control for tree view icons.
himl = ImageList_Create(16, 16, ILC_COLOR, 4, 0);
// Load first two images from one bitmap.
hBmp = LoadBitmap(app->instance(), MAKEINTRESOURCE(ID_BMPTV)); ImageList_Add(himl, hBmp, NULL);
DeleteObject(hBmp); TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL);
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
中直接:
case WM_RBUTTONDOWN:
OutputDebugString("WM_RBUTTONDOWN\n");
break;
就可以了
中只找到一个:
case WM_NOTIFY:
{
char prom[80];
NMHDR *lpnmh = (LPNMHDR)lParam;
sprintf(prom,"%d\n",lpnmh->code);
OutputDebugString(prom);//-530
//
switch(lpnmh->code)
{
case TTN_NEEDTEXTW:
OutputDebugString("TTN_NEEDTEXTW \n");
break; case NM_HOVER:
OutputDebugString("NM_HOVER \n");
break;
case NM_NCHITTEST:
OutputDebugString("NM_NCHITTEST \n");
break;
}
}
break;
//剩下的要在 LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
中找。都有的
LRESULT TreeViewNotify (HWND hWnd, LPARAM lParam)
{
LPNMHDR lpnmh = (LPNMHDR) lParam; // Contains data from a notification
switch (lpnmh->code)
{
case NM_CLICK:
OutputDebugString("NM_CLICK\n");
break;
case NM_DBLCLK:
OutputDebugString("NM_DBLCLK\n");
break;
case NM_RETURN:
OutputDebugString("NM_RETURN\n");
break;
case NM_RCLICK:
OutputDebugString("NM_RCLICK\n");
break;
case NM_RDBLCLK:
OutputDebugString("NM_RDBLCLK\n");
break;
case NM_SETFOCUS:
OutputDebugString("NM_RCLICK\n");
break;
case NM_KILLFOCUS:
OutputDebugString("NM_KILLFOCUS\n");
break;
case NM_HOVER:
OutputDebugString("NM_HOVER\n");
break;
case NM_CUSTOMDRAW:
OutputDebugString("NM_CUSTOMDRAW\n");
break;
}
...