hur.cn - 华软网

 热门搜索

动态创建ListBox出错

  作者:未知    来源:网络    更新时间:2011/10/2
在OnInitDialog中


m_listBox.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD,CRect(10,10,300,300),this,IDC_LISTBOX);

m_listBox.ShowWindow(SW_SHOW);

int i;  CString tmp;

for(i=0;i<100;i++)
{

m_listBox.AddString(NULL);
m_listBox.SetItemData(i,i);

tmp.Format("第ssss%d行", i);

        m_listBox.StoreData(tmp);

}

运行到 AddString 的时候程序挂了,提示访问Violation




之所以改动态创建,是因为  <mfc window程序设计》书上提到制定了风格 LBS_STANDARD,

就可以由于滚动条了,,,由于我刚开始采用ddx/ddv机制,变量绑定控件的方法,  但是没有滚动条的出现。。。

所以,我改成 动态创建, 在Create函数中指定 LBS_STANDARD 这个风格, 结果出错了。。。。。

注意: 这个ListBox是自绘的!!!






---华软 网友回答---
up up
---华软网友回复---
up up
---华软网友回复---
m_listBox.AddString(NULL);
NULL 为0指针,所以出错
改为
m_listBox.AddString("");
---华软网友回复---
不是吧  ,我把控件与变量关联, 在这种情况下 ,从来不出错。。。。

为什么对于 动态创建的情况出错呢???

引用 3 楼 gameslq 的回复:
m_listBox.AddString(NULL);
NULL 为0指针,所以出错
改为
m_listBox.AddString("");

---华软网友回复---
改成""  果然没有问题,但是 问题来了


如何将 动态动态创建的 ListBox 的风格设置成自绘型的呢??

我们知道 对于 非动态的 ,可以 在属性里面修改。。但是对于动态的就无法修改啊??

mfc window程序一书里面基本上把所有的风格都提到了。。

单独没有提到如何手动 来修改 为自绘风格







引用 4 楼 caddor2011 的回复:
不是吧  ,我把控件与变量关联, 在这种情况下 ,从来不出错。。。。

为什么对于 动态创建的情况出错呢???

引用 3 楼 gameslq 的回复:

m_listBox.AddString(NULL);
NULL 为0指针,所以出错
改为
m_listBox.AddString("");

---华软网友回复---
LBS_DISABLENOSCROLL   

LBS_EXTENDEDSEL   

LBS_HASSTRINGS   Specifies an owner-draw list box that contains items consisting of strings. The list box maintains the memory and pointers for the strings so the application can use the GetText member function to retrieve the text for a particular item.

LBS_MULTICOLUMN   Specifies a multicolumn list box that is scrolled horizontally. The SetColumnWidth member function sets the width of the columns.

LBS_MULTIPLESEL   

LBS_NODATA   Specifies a no-data list box. Specify this style when the count of items in the list box will exceed one thousand. A no-data list box must also have the LBS_OWNERDRAWFIXED style, but must not have the LBS_SORT or LBS_HASSTRINGS style.

A no-data list box resembles an owner-drawn list box except that it contains no string or bitmap data for an item. Commands to add, insert, or delete an item always ignore any given item data; requests to find a string within the list box always fail. The system sends the WM_DRAWITEM message to the owner window when an item must be drawn. The itemID member of the DRAWITEMSTRUCT structure passed with the WM_DRAWITEM message specifies the line number of the item to be drawn. A no-data list box does not send a WM_DELETEITEM message.

LBS_NOINTEGRALHEIGHT   The size of the list box is exactly the size specified by the application when it created the list box. Usually, Windows sizes a list box so that the list box does not display partial items.

LBS_NOREDRAW   List-box display is not updated when changes are made. This style can be changed at any time by sending a WM_SETREDRAW message.

LBS_NOSEL   

LBS_NOTIFY   

LBS_OWNERDRAWFIXED   The owner of the list box is responsible for drawing its contents; the items in the list box are the same height.

LBS_OWNERDRAWVARIABLE   

LBS_SORT   Strings in the list box are sorted alphabetically.

LBS_STANDARD   

LBS_USETABSTOPS  

LBS_WANTKEYBOARDINPUT   


msdn  就这几个风格




---华软网友回复---
自绘的?
m_listBox.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD,CRect(10,10,300,300),this,IDC_LISTBOX);

这里面没有LBS_OWNERDRAWFIXED样式呀?
---华软网友回复---
没有这个样式,不是自绘,所以AddString必须要指定串地址。
有了这个样式,就不必指定串地址了
---华软网友回复---
这么说吧, 对于动态创建的ListBox 如何指定其 是自绘的风格,我发现无法做到。。

我在msdn查询了 所有风格,见6 楼。。。。

基本上无法指定其风格为自绘的。。


另外一个问题:我没有听懂你的意思, 对于非动态的创建,  可以AddString(NULL)

为什么对于动态的 AddString(NULL)就出错,而要改成:AddString("")




引用 8 楼 firefly3233 的回复:
没有这个样式,不是自绘,所以AddString必须要指定串地址。
有了这个样式,就不必指定串地址了

---华软网友回复---
这样不就自绘了?
m_listBox.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|LBS_OWNERDRAWFIXED,CRect(10,10,300,300),this,IDC_LISTBOX);

---华软网友回复---
我一直这样用,没发现问题呀?
BOOL CMyListBox::Create(CWnd* pParentWnd, const RECT& rect, UINT nID) 
{
DWORD dwStyle = WS_VSCROLL|WS_HSCROLL|WS_CHILD|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED;
return CWnd::CreateEx(WS_EX_CLIENTEDGE,"LISTBOX",NULL,dwStyle,rect,pParentWnd,nID,NULL);
}

int CMyListBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CListBox::OnCreate(lpCreateStruct) == -1)
return -1;
//设置字体
SetFont(GetParent()->GetFont());
//增加项
for (int i = 0; i < sizeof(m_idlist) / sizeof(DWORD); i ++)
{
AddString(NULL);
SetItemData(i, m_idlist[i]);
}

return 0;
}
C++">

---华软网友回复---
还不是不行 ,很奇怪,一运行到


BOOL CExampleDlg::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



m_listBox.Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|LBS_OWNERDRAWFIXED   ,CRect(10,10,300,300),this,IDC_LISTBOX);

m_listBox.ShowWindow(SW_SHOW);

int i;  CString tmp;

for(i=0;i<100;i++)
{

m_listBox.AddString("");
m_listBox.SetItemData(i,i);

tmp.Format("第ssss%d行", i);

        m_listBox.StoreData(tmp);

}




// m_listBox.SetHorizontalExtent(500);
return TRUE;  // return TRUE  unless you set the focus to a control
}

一旦运行到Create这里程序就提示:

winctrl1.cpp Line:107 
出错 



---华软网友回复---
m_listBox.Create(WS_VSCROLL|WS_HSCROLL|WS_CHILD|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED ,CRect(10,10,300,300),this,IDC_LISTBOX);

这样应该行吧?


---华软网友回复---
大哥,我彻底崩溃了 。。。。


我开始怀疑自己了。。。。

改成你那样,还是程序挂了。。。


你今晚方便嘛, 我打包发到你邮箱,帮忙看一下,不知道是怎么回事,好奇怪,




引用 13 楼 firefly3233 的回复:
m_listBox.Create(WS_VSCROLL|WS_HSCROLL|WS_CHILD|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED ,CRect(10,10,300,300),this,IDC_LISTBOX);

这样应该行吧?

---华软网友回复---
在,发吧

---华软网友回复---
已发 ,劳烦你了。(注意:查收)

引用 15 楼 firefly3233 的回复:
在,发吧

---华软网友回复---
一旦运行到Create这里程序就提示:

winctrl1.cpp Line:107  
出错  

原因如下:加上自绘属性(LBS_OWNERDRAWFIXED或者LBS_OWNERDRAWVARIABLE)之后,需要实现
MeasureItem 和 DrawItem 函数功能(也就是需要子类化)
解决方法:
1。从CListBox类继承,建立一子类MyListBox 并设变量 MyListBox  m_listBox;(你的代码错在从
CListBox 建立变量 m_listBox)
2。在 MyListBox 类中实现 MeasureItem  和 DrawItem  函数接口(在这两个函数自绘)
3。你原来写的代码即可运行

---华软网友回复---
重载MeasureItem虚函数就好了,结帖吧?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。