That's pretty much how you have to do it. You can hook the ListView's edit procedure on the LVN_BEGINLABELEDIT notification and move the editbox it automatically creates where you want it. Don't forget to enable FULLROWSELECT if going this route.
Here's a sample that may or may not be helpful.
(declare WNDPROC oldEditProcedure; globally)
Code:
case LVN_BEGINLABELEDIT:
{
hEditBox = (HWND)SendDlgItemMessage(hwnd, LST_DATA, LVM_GETEDITCONTROL, 0, 0);
LV_ITEM lvItem = ( (NMLVDISPINFO*)lParam )->item;
DWORD dwPos = GetMessagePos();
POINT pLoc = { GET_X_LPARAM( dwPos ), GET_Y_LPARAM( dwPos ) };
ScreenToClient( hwnd, &pLoc );
LVHITTESTINFO lvHit;
lvHit.pt.x = pLoc.x;
lvHit.pt.y = pLoc.y;
lvHit.iItem = lvItem.iItem;
SendDlgItemMessage(hwnd, LST_DATA, LVM_SUBITEMHITTEST, 0, (LPARAM)&lvHit);
lvEditRect.top = lvHit.iSubItem;
lvEditRect.left = LVIR_LABEL;
SendDlgItemMessage(hwnd, LST_DATA, LVM_GETSUBITEMRECT, lvItem.iItem, (LPARAM)&lvEditRect);
oldEditProcedure = (WNDPROC)GetWindowLongPtr (hEditBox, GWLP_WNDPROC);
SetWindowLongPtr (hEditBox, GWLP_WNDPROC, (LONG_PTR)newEditProcedure);
if (lvHit.iSubItem < 2) { //value/address
SendMessage(hEditBox, EM_SETLIMITTEXT, 8, 0);
}
lvItem.iSubItem = lvHit.iSubItem;
lvItem.pszText=txtInput;
lvItem.cchTextMax=sizeof(txtInput);
SendDlgItemMessage(hwnd, LST_DATA, LVM_GETITEMTEXT, lvItem.iItem, (LPARAM)&lvItem);
SetWindowText(hEditBox,lvItem.pszText);
break;
}
Code:
/********************************
Listview editbox handler
*********************************/
LRESULT CALLBACK newEditProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// char testchar[56];
switch (message)
{
case WM_CHAR:
{
if ( (SendMessage(hwnd, EM_GETLIMITTEXT, 0, 0) == 8) && (FilterHexChar(wParam) == 0) ) {
wParam = 0;
}
break;
}
case WM_WINDOWPOSCHANGING:
{
WINDOWPOS* windowPos = (WINDOWPOS*)lParam;
windowPos->x = lvEditRect.left;
windowPos->y = lvEditRect.top - 2;
windowPos->cx = lvEditRect.right - lvEditRect.left;
return CallWindowProc (oldEditProcedure, hwnd, message, wParam, lParam);
}
default:
if (oldEditProcedure) {
return CallWindowProc (oldEditProcedure, hwnd, message, wParam, lParam);
}
else {
return DefWindowProc (hwnd, message, wParam, lParam);
}
}
return CallWindowProc (oldEditProcedure, hwnd, message, wParam, lParam);
}