热情软件屋

 

InsertItem时出现错误


编号:QA000618
建立日期: 1999年3月11日 最后修改日期:1999年3月11日
所属类别:

孤独万里:
    我编写了如下程序代码:
    
    BOOL CMyComputer::OnInitDialog()
    {
     CPropertyPage::OnInitDialog();
    
     DrivesIcon.Create(16,16,ILC_COLOR16|ILC_MASK,0,0);
     m_cDriveList.SetImageList(&DrivesIcon,LVSIL_SMALL);
     //设置列表视图扩展风格--带检查框
    
    ListView_SetExtendedListViewStyle(m_cDriveList.GetSafeHwnd(),LVS_EX_CHECKBOX
    ES);
    
     DrivesIcon.Add(AfxGetApp()->LoadIcon(IDI_NODRIVEICON));
    
     RegEdit Reg;
     DWORD NoDrives;
     Reg.RootKey=HKEY_CURRENT_USER;
     if
    (Reg.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explor
    er"))
     {
     if (Reg.ReadBinary("NoDrives",NoDrives)==0)
     NoDrives=0;
     }
    
    
     SHFILEINFO FileInfo;
     for (int i=0;i<26;i++)
    
    
     char Str[]={"X:\\"},Str1[]={"X:"};
     Str[0]=Str1[0]='A'+i;
    
    
    ::SHGetFileInfo(Str,0,&FileInfo,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_SMALLICO
    N);
     DrivesIcon.Add(FileInfo.hIcon);
     通过调试我发现,程序执行到这一步时,系统就提示"非法操作"
     m_cDriveList.InsertItem(i, Str1,i+1 );
    
     DWORD State=NoDrives>>i;
     State&=1;
     State=!State;
     //设置列表视图检查框选择状态--State
     ListView_SetItemState (m_cDriveList.GetSafeHwnd(), i,
    UINT((int(State) + 1) << 12), LVIS_STATEIMAGEMASK);
     }
     return TRUE;
    }

回答:

    由于你的程序给的不是很全,所以,我无法知道你的CLISTCTRL控件到底是什么风格, 是"大图标","小图标","列表",还是"报告"的样式,我都不清楚,所以我只能写一个程序让他出错,结果发现当你使用"大图标"时,m_cDriveList.SetImageList(&DrivesIcon,LVSIL_SMALL); 语句将会出现"非法操作",另外,如果你的CIMAGELIST类如果不采用指针,程序将不会有意料的结果。我给你一段程序代码,是可以用的,采用的是"大图标"的方式:
    BOOL CTest1Dlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
    
     // Add "About..." menu item to system menu.
    
     // IDM_ABOUTBOX must be in the system command range.
     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
     ASSERT(IDM_ABOUTBOX < 0xF000);
    
     CMenu* pSysMenu = GetSystemMenu(FALSE);
     if (pSysMenu != NULL)
     {
     CString strAboutMenu;
     strAboutMenu.LoadString(IDS_ABOUTBOX);
     if (!strAboutMenu.IsEmpty())
     {
     pSysMenu->AppendMenu(MF_SEPARATOR);
     pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
     }
     }
    
     // Set the icon for this dialog. The framework does this automatically
     // when the application's main window is not a dialog
     SetIcon(m_hIcon, TRUE); // Set big icon
     SetIcon(m_hIcon, FALSE); // Set small icon
    
     // TODO: Add extra initialization here
    
    
     CImageList *DrivesIcon=new CImageList();
     DrivesIcon->Create(16,16,ILC_COLOR16|ILC_MASK,0,0);
     ASSERT(DrivesIcon!= NULL);
     DrivesIcon->Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
    
     m_cDriveList.SetImageList(DrivesIcon,LVSIL_NORMAL);
     DrivesIcon->Add(AfxGetApp()->LoadIcon(IDI_ICON1));
     m_cDriveList.InsertItem(0, "test",0);
     m_cDriveList.InsertItem(1,"Hello",1);
     m_cDriveList.InsertColumn(1,"a");
     return TRUE;
    }

此问题由ChenTao回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio