2013-05-07 2 views
1

Моя проблема с Listview в чистой программе Win32 Когда я удаляю элемент, затем щелкните по нему, прежде чем удалять возвращаемый элемент. Так ListView не удается удалить какие-либо предметы на самом делеListview Возврат товара после удаления pure 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

Эта ссылка не работает. Кроме того, вы не можете просто сбрасывать источник здесь и получать ответ. Объясните * подробно *, что вы сделали и как оно не работает. –

+0

Тем не менее, вопрос будет закрыт, если вы его не улучшите. Это только открыто, потому что не так много людей его видели. Менее терпеливые люди, чем я. –

+0

Я не понимаю. Макрос ListView_DeleteAllItems удаляет все элементы, а не отдельные элементы. – Xearinox

ответ

1

Похоже, главной проблемой является эта строка кода:

Test_FORM_WndProc(Test_FORM,WM_CREATE,NULL,NULL); 

Это должно просто не быть там. Когда вы вызываете окно proc с 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_CREATE и WM_COMMAND обработчики использовали return, а не позволяли вызывать DefWindowProc.

Смежные вопросы