如何避免在列表头分隔线位置上普通光标变为调整光标,列表在CDialogBar上???等。。。。。

school 2006-08-14 12:42:28
如何避免在列表头分隔线位置上普通光标变为调整光标,列表在CDialogBar上。
主要为了和禁止调整列宽的行为保持一致。

我在CMainFrame中重载WM_SETCURSOR消息的函数
BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CListCtrl *pQualeList = (CListCtrl*)m_wndQualePanel.GetDlgItem(IDC_QUALE_LIST);

if(pQualeList->GetHeaderCtrl() == pWnd) // 当光标移到CListCtrl控件列表头中时未执行
MessageBox(_T("HeaderCtrl"));

if(pQualeList == pWnd)
MessageBox(_T("ListCtrl")); // 当光标移到CListCtrl控件中时执行

//return TRUE;

return CFrameWnd::OnSetCursor(pWnd, nHitTest, message);
}

为什么无法监测到光标是否移动到了CListCtrl控件列表头中???
如何解决???
...全文
229 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹雪 2006-08-15
  • 打赏
  • 举报
回复
CLockableHeader::CLockableHeader()
{
m_bLocked = TRUE;
}

CLockableHeader::~CLockableHeader()
{
}


BEGIN_MESSAGE_MAP(CLockableHeader, CHeaderCtrl)
//{{AFX_MSG_MAP(CLockableHeader)
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLockableHeader message handlers

BOOL CLockableHeader::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
// TODO: Add your specialized code here and/or call the base class
if( m_bLocked )
{
NMHDR& nmh = *( NMHDR* )lParam;
if( nmh.code == HDN_BEGINTRACKW || nmh.code == HDN_BEGINTRACKA )
{
return *pLResult = TRUE;
}

}

return CHeaderCtrl::OnChildNotify(message, wParam, lParam, pLResult);
}

BOOL CLockableHeader::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
return m_bLocked ? TRUE : CHeaderCtrl::OnSetCursor( pWnd, nHitTest, message );
}
吹雪 2006-08-15
  • 打赏
  • 举报
回复
class CLockableHeader : public CHeaderCtrl
{
// Construction
public:
CLockableHeader();

// Attributes
public:
private:
BOOL m_bLocked;
// Operations
public:
inline BOOL SetLocked( BOOL bLocked ){return m_bLocked = bLocked;};
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CLockableHeader)
public:
virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult);
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CLockableHeader();

// Generated message map functions
protected:
//{{AFX_MSG(CLockableHeader)
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};
school 2006-08-15
  • 打赏
  • 举报
回复
Re : hailongxl(吹雪)

“在其OnSetCursor中直接return CWnd::OnSetCursor();”
好象不行呀!!!要“return TRUE;”才行。

m_cHeader.SubclassWindow( m_cList.GetDlgItem( 0 )->GetSafeHwnd());
m_cHeader.SubclassWindow( m_cList.GetHeaderCtrl()->GetSafeHwnd());
以上有什么区别吗???好象都可以。

本来想把原来在CMainFrame中的禁止通过表头调整列宽的HDN_BEGINTRACK消息映射也移到
CLockableHeader类中去,但在CLockableHeader类中添加的HDN_BEGINTRACK消息映射没被执行(所有HDN_好象都不行),为什么会这样???
吹雪 2006-08-14
  • 打赏
  • 举报
回复
class CLockableHeader : public CHeaderCtrl
{......};
CLockableHeader m_cHeader;
m_cHeader.SubclassWindow( m_cList.GetDlgItem( 0 )->GetSafeHwnd());
吹雪 2006-08-14
  • 打赏
  • 举报
回复
子类化列表头控件.在其OnSetCursor中直接return CWnd::OnSetCursor();
school 2006-08-14
  • 打赏
  • 举报
回复
Re : billy145533(努力升星)
我不是问如何禁止调整列宽,这我已经做了(禁止所有列的调整)。
通过重载HDN_BEGINTRACK消息处理函数做到。

但现在的问题是,虽然列宽不能调整了,但当鼠标光标停留在列分隔线上时光标会变成调整列宽状态的光标,我想避免这种光标的改变,以使其同已经实现的禁止调整列宽的行为保持一致。

如何避免这种光标的改变????
billy145533 2006-08-14
  • 打赏
  • 举报
回复
最简单把clistctrl disable掉就可以了
当然也可以从设置clistctrl 风格来禁止调整clistctrl的大小
或者重载clistctrl
从CListCtrl派生一个类CDontResize 为其增加一个函数
BOOL CDontResize::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{ HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;

{ if((pHDN->hdr.code == HDN_BEGINTRACKW || pHDN->hdr.code == HDN_BEGINTRACKA) && (pHDN->iItem == 2) || (pHDN->iItem == 3) || (pHDN->iItem == 4) || (pHDN->iItem == 5) || (pHDN->iItem == 6) || (pHDN->iItem == 7) || (pHDN->iItem == 8))

{ *pResult = TRUE; return TRUE; }

} return CListCtrl::OnNotify(wParam, lParam, pResult); }

上面代码禁止用户改变其2-8列的宽度

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧