Re: Changing values in a list view column
- Posted by euman at bellsouth.net Apr 26, 2002
- 409 views
Hello Jonas, The easier way would be to only code in API and use a typical listbox and not the listview control at all. by using LBS_OWNERDRAWFIXED = 16, or LBS_OWNERDRAWVARIABLE = 32, you would have total control over your listbox and because earlier versions of windows dont have some of the great listview features you could code the listbox to act anyway a listview could and also work on the old Win O/S's. There may be other ways to do what you want other than what I present but this seemed easiest for me. the below code is in no way optimized for size or speed but should give a good idea how this all fits together. This code only adds bitmaps to listboxs but with very little change you could setup grids. if iMsg = WM_CREATE then <snip...> hList = CreateWindow(WS_EX_CLIENTEDGE,"listbox",0,or_all({WS_CHILD,WS_TABSTOP,LBS_OWNERDRAWFIXED,LBS_HASSTRINGS}), 230, 240, 290, 110, hwnd, ID_hList, hInst, 0) itemDC = c_func(xGetDC, {hList}) hListmem = c_func(xCreateCompatibleDC,{itemDC}) c_proc(xReleaseDC, {hList, itemDC}) junk = SendMessage(hList, WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), 0) -- you guess what Im doing here? AddItem(hList, "Core Files (Interpreter and Include files)", dacheck) AddItem(hList, "Documentation and Tutorials", checked) AddItem(hList, "Demonstration source code", checked) junk = SendMessage(hList, LB_SETCURSEL, 0, 0) elsif iMsg = WM_DRAWITEM then action = peek4u(lParam+12) itemDC = peek4u(lParam+24) if action = ODA_DRAWENTIRE then if peek4u(lParam+20) = hList then junk = SendMessage(hList, LB_GETITEMDATA, peek4u(lParam+8), 0) hListbmp = c_func(xSelectObject,{hListmem, junk}) rect_left = peek4u(lParam+28) rect_top = peek4u(lParam+32) rect_right = peek4u(lParam+36) rect_bottom= peek4u(lParam+40) junk = c_func(xBitBlt,{itemDC, 1, rect_top, 15,rect_top+16, hListmem, 0, 0, SRCCOPY}) if SendMessage(hList, LB_GETSEL, peek4u(lParam+8), 0) then poke4(lParam+28, rect_left + 20) c_proc(xDrawFocusRect,{itemDC, lParam+28}) FillRect(itemDC,{rect_left+20, rect_top, rect_right, rect_bottom}, hbrush) SetTextColor(itemDC, 16777215) junk = c_func(xSetBkColor,{itemDC, 3670016}) else SetTextColor(itemDC, 3670016) junk = c_func(xSetBkColor,{itemDC, 16777215}) end if txtbuff = allocate(256) junk = SendMessage(hList, LB_GETTEXT, peek4u(lParam+8), txtbuff) c_proc(xGetTextMetrics,{itemDC, txtmetrics}) y = floor(rect_top + 8 - peek4u(txtmetrics) / 2) c_proc(xTextOut,{itemDC,26,y,txtbuff,c_func(xlstrlen,{txtbuff})}) free(txtbuff) end if elsif action = ODA_SELECT then junk = SendMessage(hList, LB_GETCURSEL, 0, 0) if desel then rect_left = peek4u(lParam+28) rect_top = peek4u(lParam+32) rect_right = peek4u(lParam+36) rect_bottom= peek4u(lParam+40) FillRect(itemDC,{rect_left+20, rect_top, rect_right, rect_bottom}, wbrush) hListbmp = c_func(xSelectObject,{hListmem, uncheck}) junk = c_func(xBitBlt,{itemDC, 1, rect_top, 15,rect_top+16, hListmem, 0, 0, SRCCOPY}) txtbuff = allocate(256) junk = SendMessage(hList, LB_GETTEXT, peek4u(lParam+8), txtbuff) c_proc(xGetTextMetrics,{itemDC, txtmetrics}) y = floor(rect_top + 8 - peek4u(txtmetrics) / 2) c_proc(xTextOut,{itemDC,26,y,txtbuff,c_func(xlstrlen,{txtbuff})}) free(txtbuff) desel = 0 else rect_left = peek4u(lParam+28) rect_top = peek4u(lParam+32) rect_right = peek4u(lParam+36) rect_bottom= peek4u(lParam+40) FillRect(itemDC,{rect_left+20, rect_top, rect_right, rect_bottom}, hbrush) hListbmp = c_func(xSelectObject,{hListmem, uncheck}) junk = c_func(xBitBlt,{itemDC, 1, rect_top, 15,rect_top+16, hListmem, 0, 0, SRCCOPY}) txtbuff = allocate(256) junk = SendMessage(hList, LB_GETTEXT, peek4u(lParam+8), txtbuff) c_proc(xGetTextMetrics,{itemDC, txtmetrics}) y = floor(rect_top + 8 - peek4u(txtmetrics) / 2) SetTextColor(itemDC, 16777215) junk = c_func(xSetBkColor,{itemDC, 3670016}) c_proc(xTextOut,{itemDC,26,y,txtbuff,c_func(xlstrlen,{txtbuff})}) free(txtbuff) desel = 1 end if end if elsif iMsg = WM_MEASUREITEM then if peek4u(lParam) = ODT_LISTBOX then if peek4u(lParam+4) = ID_hList then junk = SendMessage(hList, LB_SETITEMHEIGHT, 0, 16) end if end if Maybe helpfull to someone. Euman ----- Original Message ----- From: "Jonas Temple" <jktemple at yhti.net> To: "EUforum" <EUforum at topica.com> Sent: Friday, April 26, 2002 1:44 PM Subject: Changing values in a list view column > > To anyone interested... > > The included code snippet lets you do in-place editing of a list view > column's contents. To change the contents, click ONCE on the first > column of each list view item. Wait a second and then an edit control > should appear. Type in some text and press Enter. The column data is > updated. There is a button on the bottom that SHOULD start editing of a > column but it doesn't work :( > > Anyway, has anyone else ever tried this? Is there any way to change the > contents of columns other than the first? How do I force editing of > another column/row with the LVM_EDITLABLE message? I guess what I'm > wondering is if you can, with a list view control, come up with a > primitive grid control? > > Jonas > > Here is the code! > > include win32lib.ew > without warning > with trace > atom void > global constant MainWin = create(Window, "Test Editable List Views", 0, > 0, 0, 500, 400, 0), > lv = create(ListView, {"Column1","Column2","Column3"}, > MainWin, 10, 10, 400, 300, > or_all({LVS_REPORT,LVS_EDITLABELS})), > pb = create( PushButton, "Test", MainWin, 10, 350, 90, > 30, 0) > > procedure MainWin_onEvent(atom event, atom wParam, atom lParam) > atom edit_ctl, iLength, buffer, id, msg > sequence text, selection > if event = WM_NOTIFY then > id = getId( fetch( lParam, NMHDR_hwndFrom )) > msg = fetch( lParam, NMHDR_code ) > if id = lv and (msg = LVN_ENDLABELEDITW or msg = > LVN_ENDLABELEDITA) then > edit_ctl = sendMessage(lv, LVM_GETEDITCONTROL, 0, 0) > if edit_ctl then > iLength = w32Func( xSendMessage, { edit_ctl, > WM_GETTEXTLENGTH, 0, 0 } ) > if iLength > 0 then > iLength += 1 > buffer = acquire_mem(0, iLength ) > iLength = w32Func( xSendMessage, { edit_ctl, > WM_GETTEXT, iLength, buffer } ) > text = peek( {buffer, iLength} ) > release_mem( buffer ) > selection = getLVSelected(lv) > setLVItemText(lv, selection[1], 0, text) > end if > end if > end if > end if > end procedure > onEvent[MainWin] = routine_id("MainWin_onEvent") > > procedure MainWin_onOpen() > atom index, mask, void > sequence data > mask = or_all({LVS_EX_HEADERDRAGDROP,LVS_EX_GRIDLINES, > LVS_EX_TRACKSELECT }) > void = sendMessage(lv, LVM_SETEXTENDEDLISTVIEWSTYLE, mask, mask) > > for i = 1 to 3 do > data = {"Row" & sprintf("%d", i) & "Col1", > "Row" & sprintf("%d", i) & "Col2", > "Row" & sprintf("%d", i) & "Col3"} > index = addLVItem(lv, 0, data) > end for > end procedure > onOpen[MainWin] = routine_id("MainWin_onOpen") > > procedure pb_onClick() > sequence selection > atom void > selection = getLVSelected(lv) > void = sendMessage(lv, LVM_EDITLABEL, 1, 0) > end procedure > onClick[pb] = routine_id("pb_onClick") > > > WinMain(MainWin, Normal) > > > >