子类化列表视图以仅编辑其子项
发布时间:2020-12-16 07:28:20 所属栏目:百科 来源:网络整理
导读:我写了这个小程序,它显示了一个列表视图,并使项目和子项目可编辑. 我想改变它,只使子项可编辑.我想让列表视图窗口程序站立起来,我不必每次都转发WM_NOTIFY消息,就像我现在在WndProcMain中所做的那样.目的是我在程序中不使用一个带有可编辑子项的列表视图,我
我写了这个小程序,它显示了一个列表视图,并使项目和子项目可编辑.
我想改变它,只使子项可编辑.我想让列表视图窗口程序站立起来,我不必每次都转发WM_NOTIFY消息,就像我现在在WndProcMain中所做的那样.目的是我在程序中不使用一个带有可编辑子项的列表视图,我将在许多不同的窗口中使用它. LVN_ENDLABELEDIT通知由WndProcList处理,因为必须更改bEditing.必须编辑子项时,此标志用于WM_PAINT.这是一个修复,否则第一个子项中的文本会消失,因为它认为正在编辑第一个项目.但是,我还希望在列表视图所有者窗口(在本例中为WndProcMain)的窗口过程中收到类似LVN_ENDLABELEDIT的消息,因为我还想操纵用户输入. 如果您有任何疑问,请询问. 提前致谢 迈达斯 WNDPROC wpOrigEditProc; RECT rcSubItem; LRESULT CALLBACK WndProcEditList(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_WINDOWPOSCHANGING: { WINDOWPOS *pos = (WINDOWPOS*) lParam; pos->x = rcSubItem.left; pos->cx = rcSubItem.right; } break; default: return CallWindowProc(wpOrigEditProc,hWnd,uMsg,wParam,lParam); } return 1; } LRESULT CALLBACK WndProcList(HWND hWnd,LPARAM lParam) { static HWND hEdit; static RECT rc; static LVITEM lvI; static unsigned char bEditing = 0; switch (uMsg) { case WM_NOTIFY: switch (((NMHDR*) lParam)->code) { case NM_CLICK: lvI.iItem = ((NMITEMACTIVATE*) lParam)->iItem; lvI.iSubItem = ((NMITEMACTIVATE*) lParam)->iSubItem; break; case NM_DBLCLK: SendMessage(hWnd,LVM_EDITLABEL,lvI.iItem,0); break; case LVN_BEGINLABELEDIT: { char text[32]; bEditing = 1; hEdit = (HWND) SendMessage(hWnd,LVM_GETEDITCONTROL,0); rcSubItem.top = lvI.iSubItem; rcSubItem.left = LVIR_LABEL; SendMessage(hWnd,LVM_GETSUBITEMRECT,(long) &rcSubItem); rcSubItem.right = SendMessage(hWnd,LVM_GETCOLUMNWIDTH,lvI.iSubItem,0); wpOrigEditProc = (WNDPROC) SetWindowLong(hEdit,GWL_WNDPROC,(long) WndProcEditList); lvI.pszText = text; lvI.cchTextMax = 32; SendMessage(hWnd,LVM_GETITEMTEXT,(long) &lvI); SetWindowText(hEdit,lvI.pszText); } break; case LVN_ENDLABELEDIT: bEditing = 0; SetWindowLong(hEdit,(long) wpOrigEditProc); if (!lvI.iSubItem) return 1; lvI.pszText = ((NMLVDISPINFO*) lParam)->item.pszText; if (!lvI.pszText) return 1; SendMessage(hWnd,LVM_SETITEMTEXT,(long) &lvI); break; default: return CallWindowProc((WNDPROC) GetClassLong(hWnd,GCL_WNDPROC),lParam); } break; case WM_PAINT: if (bEditing) { RECT rcItem; if (lvI.iSubItem > 0) { rcItem.left = LVIR_LABEL; if (SendMessage(hWnd,LVM_GETITEMRECT,(long) &rcItem)) ValidateRect(hWnd,&rcItem); } } default: return CallWindowProc((WNDPROC) GetClassLong(hWnd,lParam); } return 0; } LRESULT CALLBACK WndProcMain(HWND hWnd,LPARAM lParam) { static HWND hList; static RECT rc; switch (uMsg) { case WM_NOTIFY: switch (((NMHDR*) lParam)->code) { case NM_CLICK: case NM_DBLCLK: case LVN_BEGINLABELEDIT: case LVN_ENDLABELEDIT: return CallWindowProc(WndProcList,((NMHDR*) lParam)->hwndFrom,lParam); } break; case WM_CREATE: { LVCOLUMN lvc; LVITEM lvI; unsigned int i; float vertex; char text[32]; hList = CreateWindow(WC_LISTVIEW,WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS,rc.left,rc.top,rc.right,rc.bottom,hInstance,0); SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); SetWindowLong(hList,(long) WndProcList); lvc.mask = LVCF_WIDTH; lvc.cx = 30; SendMessage(hList,LVM_INSERTCOLUMN,(LPARAM) &lvc); lvc.mask = LVCF_TEXT; lvc.pszText = "Vertex"; SendMessage(hList,1,(LPARAM) &lvc); SendMessage(hList,LVM_SETCOLUMNWIDTH,LVSCW_AUTOSIZE_USEHEADER); lvI.mask = LVIF_TEXT; lvI.pszText = text; for (i = 0; i < 10; i++) { vertex = (float) i; lvI.iItem = i; lvI.iSubItem = 0; sprintf(text,"%d",i); SendMessage(hList,LVM_INSERTITEM,(LPARAM) &lvI); lvI.iSubItem = 1; sprintf(text,"%f,%f,%f",vertex - 1,vertex,vertex + 1); SendMessage(hList,LVM_SETITEM,(LPARAM) &lvI); } } break; case WM_SIZE: GetClientRect(hWnd,&rc); MoveWindow(hList,1); SendMessage(hList,LVSCW_AUTOSIZE_USEHEADER); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd,lParam); } return 0; } 解决方法
我发布了与该问题相关的答案,但它是在C#中.从来没有在winapi有太多的专业知识,而不是很久以前作为业余爱好者玩它,这篇文章最后的答案看起来很有希望 –
http://cboard.cprogramming.com/windows-programming/122733-%5Bc%5D-editing-subitems-listview-win32-api.html
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – Lambda Func <>和Fluent
- ruby-on-rails – 如果config.cache_classes = true,Rails找
- LDR R1,= 0x12345678 和 LDR R1,0x12345678 区别??? (转)
- 一键打包并发布到Nuget平台
- c – 算术运算符返回类型
- SQLITE中原子提交的实现
- ruby-on-rails – 将OrientDB的JDBC驱动程序与ActiveRecord
- ios – 尝试在我的应用中集成Google登录时无法找到“Google
- 5 个免费的受欢迎的 SQLite 管理工具
- PostgreSQL学习第四篇--数据库启停