CListCtrl::SetItemCountEx
-
Hi Leute!
Ich habe ein großes Problem und weiß nicht wo der Fehler liegt. Vielleicht hatte mal jemand so ein ähnliches Problem wie ich. Ich verwende ein Virtuelles ListCtrl Steuerelement mit dem Parameter LVS_OWNERDATA. Wenn ich jetzt aber die Größe des Ctrls setzen will mit myList.SetItemCountEx(10) dann bleibt mir das Programm stecken. Wenn ich das ganze debugge kommt das Programm bis zu dieser Zeile und bleibt dann stecken. Ich hoffe es kann mir jemand sagen WARUM?
Danke für eure Hilfe!
-
zeig mal den Codeausschnitt von der Erstellung bis zu dem Aufruf!
Vielleicht musst Du auch InitCommonControls mit ICC_LISTVIEW_CLASSES aufrufen.
-
Das wäre der Abschnitt für OnInitDialog;
BOOL CProductListWindow::OnInitDialog()
{
CDialog::OnInitDialog();//m_pFile->printFunctionHeader("CMessageLog::OnInitDialog() ");
// Erlaube vollen Rowselect im Grid
DWORD dwStyle = m_cListProduct.GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES;
dwStyle |= LVS_OWNERDATA;
dwStyle |= LVS_REPORT;
m_cListProduct.SetExtendedStyle(dwStyle);
// Erzeugt die Spalten in der Liste
LV_COLUMN lvCol[6];
// int nItem;
for(int i=0; i<6; i++){
lvCol[i].mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvCol[i].fmt = LVCFMT_LEFT;
switch(i){
case 0:
lvCol[i].pszText="ProdTypID";
lvCol[i].cx = 80;
break;
case 1:
lvCol[i].pszText="ProdID";
lvCol[i].cx = 100;
break;
case 2:
lvCol[i].pszText="ProdShtName";
lvCol[i].cx = 80;
break;
case 3:
lvCol[i].pszText="CurrTypCod";
lvCol[i].cx = 100;
break;
case 4:
lvCol[i].pszText="ProdDispDcml";
lvCol[i].cx = 100;
break;
case 5:
lvCol[i].pszText="MtchTypCod";
lvCol[i].cx = 100;
break;
}// switchlvCol[i].iSubItem=0;
m_cListProduct.InsertColumn(i, &lvCol[i]);
}//m_pFile->printFunctionTrailer("CMessageLog::OnInitDialog()");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}Die Klass stellt auch noch eine doUpdate Funktion zur Verfügung:
void CProductListWindow::doUpdate(CArray<CLabelItemProduct, CLabelItemProduct> *pArray, int iSize){
m_pArray = pArray;
// Hiel bleibt er stecken
m_cListProduct.SetItemCountEx(iSize);// Muss aufgerufen werden um Windows zu sagen, dass es das Fenster neu zeichnen soll
m_cListProduct.Invalidate();
::AfxGetApp()->DoWaitCursor(0);
}Dass Array ist gefüllt und er kommt auch bis SetItemCountEx. Beim debuggen bleibt er mir dann stecken. Ich kann noch in die Funktion SetItemCountEx springen und bei SendMessage geht nichts mehr. Das Programm stürzt mir nicht ab, sondern bleibt einfach stehen.
Keine Ahnung warum!
-
Codetags benutzen!
2.
Schreib die Funktion mal folgendermassen (ist übersichtlicher):BOOL CProductListWindow::OnInitDialog() { CDialog::OnInitDialog(); //m_pFile->printFunctionHeader("CMessageLog::OnInitDialog() "); // Erlaube vollen Rowselect im Grid DWORD dwStyle = m_cListProduct.GetExtendedStyle(); dwStyle |= LVS_EX_GRIDLINES; m_cListProduct.SetExtendedStyle(dwStyle); m_cListProduct.ModifyStyle( 0, LVS_OWNERDATA|LVS_REPORT); // Erzeugt die Spalten in der Liste LV_COLUMN lvCol; lvCol.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvCol.fmt = LVCFMT_LEFT; lvCol.iSubItem = 0; LPCSTR szStrings[] = { "ProdTypID", "ProdID", "ProdShtName", "CurrTypCod", "ProdDispDcml", "MtchTypCod" }; int Widths[] = { 80, 100, 80, 100, 100, 100 }; for( int i=0; i<6; i++) { lvCol.pszText = szStrings[i]; lvCol.cx = Widths[i]; m_cListProduct.InsertColumn( i, &lvCol); } }
Achtung: Bei ModifyStyle musst Du im 1. Parameter den Stil angeben, den das ListCtrl vorher hatte, also LVS_ICON oder LVS_LIST oder LVS_SMALLICON !