为什么DrawItem方法的我的所有者绘制列表框,不能被称为
-
25-09-2019 - |
题
我尝试写一个所有者绘制列表框,与维拓.我的代码看起来像这样
template<class T, class TBase = CListBox, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyListBoxImpl :
public CWindowImpl< T, TBase, TWinTraits >,
public COwnerDraw< T >
{
...
BEGIN_MSG_MAP(CMyListBoxImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
CHAIN_MSG_MAP(COwnerDraw< T >)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
...
void Init()
{
...
ModifyStyle(0, BS_OWNERDRAW | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
...
}
void DrawItem(LPDRAWITEMSTRUCT lpdis)
{
...
我也加入 REFLECT_NOTIFICATIONS
在父母的消息循环,并设置的所有者提请固定在酒店片。但我仍然不能接收的信息。然后我用间谍++审查的信息的列表框收到,我发现了一些消息,这是非常奇怪的(WM_USER+7211
).
我的操作系统是WinXp和使用VS2008.
解决方案
- BS_OWNERDRAW?这是一个按钮风格。
- 即使LBS_OWNERDRAWFIXED,你仍然需要处理WM_MEASUREITEM.
- 一些控制风格(喜欢)LBS_OWNERDRAWFIXED可以 只 被设置当的控制是创建(这就是你说的"和设置的所有者提请固定在酒店片"?, 如果是这样,为什么修改的风格在代码?)
这个论坛主题 也可能是有帮助...
不隶属于 StackOverflow