为什么LISTCTRL不听使唤?该怎么解决
为什么LISTCTRL不听使唤?
新建一个MFC工程->Single Document
没有Document/View 支持
于是系统自动生成一个APP类,一个CChildView:public CWnd类和一个CMainFrame类。
1问、为什么在PreSubclassWindow调用GetParent()得到的不是CChildView的指针,而是一个CTempWnd?
2问、为什么LVS_REPORT风格没有切换过来 (见下图)?
3问、我把LVS_REPORT写在m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,...)这里就OK,这是为什么?
------解决方案--------------------
新建一个MFC工程->Single Document
没有Document/View 支持
于是系统自动生成一个APP类,一个CChildView:public CWnd类和一个CMainFrame类。
- C/C++ code
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd ::OnCreate(lpCreateStruct) == -1) return -1; m_list.SetNotifyTarget(this); m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,0,0),this,1000); m_img.Create(16,16,ILC_MASK,2,0); m_img.Add(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ONLINE))); m_img.Add(LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_OFFLINE))); m_list.SetImageList(&m_img,LVSIL_SMALL); m_list.InsertColumn(0,TEXT("Sign Number"),LVCFMT_LEFT,100); m_list.InsertColumnWithEditBox(1,TEXT("Location"),LVCFMT_LEFT,120,-1,NULL,TRUE,TRUE,16); m_list.InsertColumnWithEditBox(2,TEXT("Description"),LVCFMT_LEFT,135,-1,NULL,FALSE,FALSE,14); m_list.InsertColumnWithDecimalEdit(3,TEXT("Price"),LVCFMT_LEFT,60,-1,NULL,FALSE,0.01f,999.99f,2); m_list.InsertColumnWithDecimalEdit(4,TEXT("Save"),LVCFMT_LEFT,60,-1,NULL,FALSE,0.01f,999.99f,2); m_list.InsertColumnWithDropdownList(5,TEXT("Product Type"),LVCFMT_LEFT,100,-1,NULL,TEXT("EA\nKG")); m_list.InsertColumnWithDecimalEdit(6,TEXT("Unit Price"),LVCFMT_LEFT,80,-1,NULL,FALSE,0.01f,999.99f,2); m_list.InsertColumnWithEditBox(7,TEXT("Unit of Measure"),LVCFMT_LEFT,120,-1,NULL,FALSE,FALSE,5); m_list.InsertColumnWithDropdownList(8,TEXT("Border Scroll"),LVCFMT_LEFT,100,-1,NULL,TEXT("ON\nOFF\nRUN")); m_list.InsertItem(0,TEXT("001"),1); m_list.SetItemText(0,1,TEXT("HALL")); m_list.SetItemText(0,2,TEXT("DESCRIPTION")); m_list.SetItemText(0,3,TEXT("18.60")); m_list.SetItemText(0,4,TEXT("0.40")); m_list.SetItemText(0,5,TEXT("KG")); m_list.SetItemText(0,6,TEXT("1.86")); m_list.SetItemText(0,7,TEXT("LITRE")); m_list.SetItemText(0,8,TEXT("RUN")); m_list.InsertItem(1,TEXT("001"),0); m_list.SetItemText(1,1,TEXT("HALL")); m_list.SetItemText(1,2,TEXT("DESCRIPTION")); m_list.SetItemText(1,3,TEXT("18.60")); m_list.SetItemText(1,4,TEXT("0.40")); m_list.SetItemText(1,5,TEXT("KG")); m_list.SetItemText(1,6,TEXT("1.86")); m_list.SetItemText(1,7,TEXT("LITRE")); m_list.SetItemText(1,8,TEXT("RUN")); return 0; }
- C/C++ code
void CEditableList::PreSubclassWindow() { CListCtrl::PreSubclassWindow(); if(m_nMaxColumnsCount == 0) { m_nMaxColumnsCount = (UINT32)(GetNotifyTarget()->SendMessage(WM_REQUEST_COLUMN_COUNT,(WPARAM)GetSafeHwnd(),0)); if(m_nMaxColumnsCount > 0xFFFF0000) m_nMaxColumnsCount &= 0xFFFF; else m_nMaxColumnsCount = 0; } m_hBrushBackground = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); if(m_nMaxColumnsCount > 0) { m_pConfigurations = new COLUMN_CONFIGURATION[m_nMaxColumnsCount]; ModifyStyle(LVS_ICON|LVS_SMALLICON|LVS_LIST,LVS_REPORT,SWP_FRAMECHANGED); SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); } else { throw(TEXT("Parent must process WM_REQUEST_COLUMNS_COUNT,and return 0xFFFF0000|(max_columns_count).")); } }
1问、为什么在PreSubclassWindow调用GetParent()得到的不是CChildView的指针,而是一个CTempWnd?
2问、为什么LVS_REPORT风格没有切换过来 (见下图)?
3问、我把LVS_REPORT写在m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,...)这里就OK,这是为什么?
------解决方案--------------------