2013-05-07 80 views
1

我的问题与纯Win32程序上的Listview 当我删除该项目,然后单击它的位置之前删除项目返回。 所以ListView中不能删除任何实际项目Listview项目返回后删除纯win32

这个程序和来源:

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 


#define BTN_DELETE 123 

static HWND resList=NULL; 
LVITEM LvItem; 
LVCOLUMN lvc; 
HINSTANCE MainInstance; 
HWND Test_FORM; 

LRESULT CALLBACK Test_FORM_WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) 
{ 
    switch(msg) 
    { 
    case WM_CREATE: 
     { 
      resList= CreateWindow(WC_LISTVIEW,"", WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT,0,0,700,420,hwnd,(HMENU)666,MainInstance,NULL); 
      CreateWindow("button", "Delete",WS_VISIBLE | WS_CHILD ,20, 430, 150, 30,hwnd, (HMENU) BTN_DELETE, MainInstance, NULL); 


      memset(&lvc,0,sizeof(lvc)); 
      lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ; 
      lvc.iSubItem = 0; 
      lvc.pszText = "Items"; 
      lvc.cx  = 200; 
      SendMessage(resList,LVM_INSERTCOLUMN,0,(LPARAM)&lvc); 

      memset(&LvItem,0,sizeof(LvItem)); 
      LvItem.mask=LVIF_TEXT; 
      LvItem.cchTextMax = 256; 
      LvItem.iItem=0; 
      LvItem.iSubItem=0; 
      LvItem.pszText="Item 0"; 
      SendMessage(resList,LVM_INSERTITEM,0,(LPARAM)&LvItem); 

     } 
     break; 

    case WM_COMMAND: { if(HIWORD(wParam) == BN_CLICKED) { switch(LOWORD(wParam)) { case BTN_DELETE: { ListView_DeleteAllItems(resList); } break; } } } break; 
    case WM_CLOSE: {DestroyWindow(hwnd); PostQuitMessage(0); } break; 

    } 
    return DefWindowProc(hwnd,msg,wParam,lParam); 
} 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 
{ 
    MSG Msg; 
    MainInstance=hInstance; 
    WNDCLASS ResClass; 
    ResClass.cbClsExtra = 0; 

    ResClass.cbWndExtra = 0; 
    ResClass.hbrBackground = CreateSolidBrush(RGB(45,45,45)); 
    ResClass.hCursor = LoadCursor(NULL,IDC_ARROW); 
    ResClass.hIcon = NULL; 
    ResClass.lpszMenuName = NULL; 
    ResClass.style = 0; 
    ResClass.hInstance = NULL; 

    ResClass.lpfnWndProc = Test_FORM_WndProc; 
    ResClass.lpszClassName = "RES_CL"; 
    RegisterClass(&ResClass); 
    Test_FORM = CreateWindow("RES_CL","Test",WS_DLGFRAME | WS_SYSMENU | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,700,500,NULL,0,NULL,NULL); 
    Test_FORM_WndProc(Test_FORM,WM_CREATE,NULL,NULL); 
    if(Test_FORM == NULL){return 1;} 
    while(GetMessage(&Msg,NULL,0,0) > 0) 
    { 
     TranslateMessage(&Msg); 
     DispatchMessage(&Msg); 
    } 
    return Msg.wParam; 
} 
+0

该链接不起作用。此外,你不能只在这里转储源并得到答案。详细解释*你做了什么以及如何不起作用。 – 2013-05-07 08:19:02

+0

不过,除非你改进它,否则你的问题将被关闭。它仅仅是开放的,因为还没有很多人看到它。耐心的人比我低。 – 2013-05-07 08:22:29

+0

我不明白。 ListView_DeleteAllItems宏删除所有项目不是单个项目。 – Xearinox 2013-05-07 09:23:01

回答

1

它看起来像你的主要问题是这行代码:

Test_FORM_WndProc(Test_FORM,WM_CREATE,NULL,NULL); 

这应该简单地不在那里。当您使用WM_CREATE调用窗口过程时,会创建第二个列表视图。只需从程序中删除这行代码即可。


一些其他意见:

你的WM_CLOSE处理是奇数。您不需要处理该消息,因为默认处理程序将调用DestroyWindow。你不应该从那里打电话PostQuitMessage。而是从WM_DESTROY调用它。因此,与此更换WM_CLOSE条款:填充需要值成员的少数前

case WM_DESTROY: 
    PostQuitMessage(0); 
    return 0; 

这可能是更清洁零初始化一个结构。例如:

WNDCLASS ResClass = {0}; 
ResClass.hbrBackground = CreateSolidBrush(RGB(45,45,45)); 
ResClass.hCursor = LoadCursor(NULL,IDC_ARROW); 
ResClass.lpfnWndProc = Test_FORM_WndProc; 
ResClass.lpszClassName = "RES_CL"; 

您使用在WM_CREATE处理这种方法太多,但上面的语法也许有点超过memset地道。

最后,我希望看到您的WM_CREATEWM_COMMAND处理程序使用return而不是让DefWindowProc被调用。