我在用visual 2005建立一个C++的应用程序,在编辑完对话框,添加控件后,发现双击控件不能进入对应得代码处,而是弹出“当前页面的脚本发生错误。对象不支持此属性和方法.”然后弹出“欢迎使用MFC类向导”我该如何解决这个问题。
答案:
是你程序中的MFC向导发生了改变,而向导没有识别到,可以尝试一下把里面的*.ncb文件删除掉。因为*.ncb文件记录了类的提示信息,如果类的成员函数和变量的提示不见了,重新生成一下该文件。
打开文件,弹出浏览框,找到指定的文件路径
答案:
CStringregFilePathName;
CFileDialogDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT, _T("REGFiles(*.reg)|*.reg|All Files(*.*)|*.*"));
//打开文件
if(Dlg.DoModal() == IDOK)//是否打开成功
{
regFilePathName = Dlg.GetPathName();//取得文件路径及文件名
}
else//取消打开
{
//取消打开
//MessageBox(_T("open .regFile error"),NULL,MB_OK);
}
创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:
CStringCFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c: est est1.txt
CStringCFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
CStringCFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
CStringCFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
POSITIONCFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
CStringCFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITIONCFileDialog::GetStartPosition( )来得到最初的POSITION变量。
查找正在启用的驱动
答案:
nIndex = 0;
HANDLEhDriver;
//DeviceSearchType DeviceSearch = DeviceSearchByLegacyName;
DeviceSearchTypeDeviceSearch = DeviceSearchByDeviceName;
DEVMGR_DEVICE_INFORMATIONDeviceInfo;
DeviceInfo.dwSize = sizeof(DEVMGR_DEVICE_INFORMATION );
hDriver = FindFirstDevice(DeviceSearch, L"*", &DeviceInfo);
if (hDriver == INVALID_HANDLE_VALUE)
{
//error
}
else
{
do
{
CStringstr;
str.Format(_T("%02d"),nIndex);
m_pListCtrl.InsertItem(nIndex,str);
m_pListCtrl.SetItemText(nIndex,1, DeviceInfo.szDeviceName);
m_pListCtrl.SetItemText(nIndex,2, _T("启用"));
nIndex ++;
} while (FindNextDevice(hDriver, &DeviceInfo));
//fclose(hFile);
FindClose( hDriver );//关句柄
}
列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:
· 首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList,LVSIL_NORMAL);
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList,LVSIL_SMALL);
· 通过调用int InsertItem( int nItem, LPCTSTRlpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用 InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。
· 通过调用int InsertColumn( int nCol, LPCTSTRlpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式, nWidth为显示宽度,nSubItem为分配给该列的列索引。
· 在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符,通过调用
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。下面的代码演示了如何设置多列并插入数据:
LVS_ICON: 为每个item显示大图标
LVS_SMALLICON: 为每个item显示小图标
LVS_LIST: 显示一列带有小图标的item
LVS_REPORT: 显示item详细资料
直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
LONG lStyle;
lStyle. = GetWindowLong(m_list.m_hWnd,GWL_STYLE);//获取当前窗口style
lStyle. &= ~LVS_TYPEMASK; //清除显示方式位
lStyle.|= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE,lStyle);//设置style
DWORD dwStyle. = m_list.GetExtendedStyle();
dwStyle.|= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle.|= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle.|= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格
m_list.InsertColumn( 0,"ID", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "NAME",LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, “11”);//插入行
m_list.SetItemText(nRow, 1, “jacky”);//设置数据
选中style中的Showselection always,或者在上面第2点中设置LVS_SHOWSELALWAYS
int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if(m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("第%d行的checkbox为选中状态"),i);
AfxMessageBox(str);
}
}
方法一:
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if(m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("选中了第%d行"),i);
AfxMessageBox(str);
}
}
方法二:
POSITION pos =m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("Noitems were selected!\n");
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[4];//假如有4列
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
m_list.EnsureVisible(i, FALSE);
int nHeadNum =m_list.GetHeaderCtrl()->GetItemCount();
方法一:
while ( m_list.DeleteColumn (0))
因为你删除了第一列后,后面的列会依次向上移动。
方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR,LRESULT* pResult)
{
// 方法一:
/*
DWORD dwPos =GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFOlvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem =m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d行第%d列",lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/
// 方法二:
/*
NM_LISTVIEW*pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("单击的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
添加listctrl控件的NM_CLICK消息相应函数
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR,LRESULT* pResult)
{
DWORD dwPos =GetMessagePos();
CPoint point(LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFOlvinfo;
lvinfo.pt = point;
lvinfo.flags =LVHT_ABOVE;
UINT nFlag;
int nItem =m_list.HitTest(point, &nFlag);
//判断是否点在checkbox上
if(nFlag ==LVHT_ONITEMSTATEICON)
{
AfxMessageBox("点在listctrl的checkbox上");
}
*pResult = 0;
}
添加listctrl控件的NM_RCLICK消息相应函数
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR,LRESULT* pResult)
{
NM_LISTVIEW*pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this );
}
*pResult = 0;
}
添加listctrl控件的LVN_ITEMCHANGED消息相应函数
void CTest6Dlg::OnItemchangedList1(NMHDR*pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW*pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add yourcontrol notification handler code here
CString sTemp;
if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
(pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
elseif((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState& LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
elseif((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
(pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult = 0;
}