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回答。
| |
|
|
| |
|
|