CListBox中SELCHANGE不响应,为什么?

烟袅许伊 2013-05-18 03:59:37
#include<afxwin.h>
#include"IconView.h"

#define IDC_LISTBOX 100

CMyApp IconView;

BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWnd;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWnd,CWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_SETFOCUS()
ON_WM_DROPFILES()
ON_CONTROL(LBN_SELCHANGE,IDC_LISTBOX,OnSelChange)
END_MESSAGE_MAP()

CMainWnd::CMainWnd()
{
CString strWndClass = AfxRegisterWndClass(
0,
IconView.LoadCursor(IDC_ARROW),
(HBRUSH)(COLOR_3DFACE +1),
IconView.LoadIcon(IDI_WINLOGO));
CreateEx(0,
strWndClass,
_T("Icon View"),
WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL);
CRect rect(0,0,m_cxChar * 84,m_cyChar * 21);
CalcWindowRect(&rect);
SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),SWP_NOZORDER|SWP_NOMOVE|SWP_NOREDRAW);
}
int CMainWnd::OnCreate(LPCREATESTRUCT lpcs)
{
if(CWnd::OnCreate(lpcs) == -1)
return -1;
m_font.CreatePointFont(80,_T("MS Sans Serif"));

CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(&m_font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
m_cxChar = tm.tmAveCharWidth;
m_cyChar = tm.tmHeight + tm.tmInternalLeading;

dc.SelectObject(pOldFont);
m_rcImage.SetRect(m_cxChar * 4,
m_cyChar * 3,
m_cxChar * 46,
m_cyChar * 19);
m_wndGroupBox.Create(_T("Detail"),
BS_GROUPBOX|WS_VISIBLE|WS_CHILD,
CRect(m_cxChar * 2,m_cyChar,m_cxChar* 48,m_cyChar * 20),
this,
UINT(-1));

m_wndLabel.Create(_T("Icons"),
WS_CHILD|WS_VISIBLE|SS_LEFT,
CRect(m_cxChar * 50,m_cyChar,m_cxChar* 82,m_cyChar * 2),
this);

m_wndIconListBox.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT,
CRect(m_cxChar* 50,m_cyChar* 2,m_cxChar*82,m_cyChar * 20),
this,
IDC_LISTBOX);

m_wndGroupBox.SetFont(&m_font);
m_wndLabel.SetFont(&m_font);
DragAcceptFiles();
return 0;
}

void CMainWnd::PostNcDestroy()
{
delete this;
}

void CMainWnd::OnPaint()
{
CPaintDC dc(this);
m_wndIconListBox.ProjectImage(&dc,m_rcImage,::GetSysColor(COLOR_3DFACE));
}

void CMainWnd::OnSetFocus(CWnd* pWnd)
{
m_wndIconListBox.SetFocus();
}
void CMainWnd::OnDropFiles(HDROP hDropInfo)
{
int nCount = ::DragQueryFile(hDropInfo,(UINT)-1,NULL,0);
if(nCount == 1)
{
m_wndIconListBox.ResetContent();
char szFile[MAX_PATH];
::DragQueryFile(hDropInfo,0,szFile,sizeof(szFile));
int nIcons = (int)::ExtractIcon(NULL,szFile,(UINT)-1);
if(nIcons)
{
HICON hIcon;
for(int i = 0;i<nIcons;i++)
{
hIcon = ::ExtractIcon(AfxGetInstanceHandle(),szFile,i);
m_wndIconListBox.AddIcon(hIcon);
}
}

CString strWndTitle = szFile;
strWndTitle += _T(" - Icon View");
SetWindowText(strWndTitle);

CClientDC dc(this);
m_wndIconListBox.SetCurSel(0);
m_wndIconListBox.ProjectImage(&dc,m_rcImage,::GetSysColor(COLOR_3DFACE));
}
::DragFinish(hDropInfo);
}
void CMainWnd::OnSelChange()
{
CClientDC dc(this);
m_wndIconListBox.ProjectImage(&dc,m_rcImage,::GetSysColor(COLOR_3DFACE));
}

BOOL CIconListBox::PreCreateWindow(CREATESTRUCT &cs)
{
if(!CListBox::PreCreateWindow(cs))
return FALSE;

cs.style &= -(LBS_OWNERDRAWVARIABLE|LBS_SORT);
cs.style |= LBS_OWNERDRAWFIXED;
return TRUE;
}
void CIconListBox::MeasureItem(LPMEASUREITEMSTRUCT lpmis)
{
lpmis->itemHeight = 36;
}
void CIconListBox::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
CDC dc;
dc.Attach(lpdis->hDC);
CRect rect = lpdis->rcItem;
int nIndex = lpdis->itemID;

CBrush* pBrush = new CBrush;
pBrush->CreateSolidBrush(::GetSysColor((lpdis->itemState&ODS_SELECTED)?COLOR_HIGHLIGHT:COLOR_WINDOW));
dc.FillRect(rect,pBrush);

delete pBrush;

if(lpdis->itemState & ODS_FOCUS)
dc.DrawFocusRect(rect);
if(nIndex!=(UINT)-1)
dc.DrawIcon(rect.left + 4,rect.top + 2,(HICON)GetItemData(nIndex));
dc.Detach();
}

int CIconListBox::AddIcon(HICON hIcon)
{
int nIndex = AddString(_T(""));
if((nIndex != LB_ERR)&&(nIndex != LB_ERRSPACE))
SetItemData(nIndex,(DWORD)hIcon);
return nIndex;
}

void CIconListBox::ProjectImage(CDC* pDC,
LPRECT pRect,
COLORREF clrBackColor)
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);

CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,32,32);
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

CBrush* pBrush = new CBrush(clrBackColor);
dcMem.FillRect(CRect(0,0,32,32),pBrush);
delete pBrush;

int nIndex = GetCurSel();
if(nIndex != LB_ERR)
dcMem.DrawIcon(0,0,(HICON)GetItemData(nIndex));

pDC->StretchBlt(pRect->left,pRect->top,pRect->right - pRect->left,pRect->bottom - pRect->top,
&dcMem,0,0,32,32,SRCCOPY);
dcMem.SelectObject(pOldBitmap);
}

class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CIconListBox:public CListBox
{
public:
virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpmis);
virtual void DrawItem(LPDRAWITEMSTRUCT lpdis);
int AddIcon(HICON hIcon);
void ProjectImage(CDC* pDC,LPRECT pRect,COLORREF clrBackColor);
};
class CMainWnd:public CWnd
{
protected:
int m_cxChar;
int m_cyChar;

CFont m_font;
CRect m_rcImage;
CButton m_wndGroupBox;
CIconListBox m_wndIconListBox;
CStatic m_wndLabel;
public:
CMainWnd();
protected:
virtual void PostNcDestroy();
afx_msg int OnCreate(LPCREATESTRUCT lpcs);
afx_msg void OnPaint();
afx_msg void OnSetFocus(CWnd* pWnd);
afx_msg void OnDropFiles(HDROP hDropInfo);
afx_msg void OnSelChange();

DECLARE_MESSAGE_MAP()
};

这是书上的原代码,不过控件改变选项的时候,不进响应函数,为什么?
...全文
180 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟袅许伊 2013-05-18
  • 打赏
  • 举报
回复
原因找到了。。。
BOOL COwnerDrawListBox::PreCreateWindow(CREATESTRUCT& cs)
{
	if(!CListBox::PreCreateWindow(cs))
		return FALSE;

	cs.style &= ~(LBS_OWNERDRAWVARIABLE|LBS_SORT);
	cs.style |= LBS_OWNERDRAWFIXED;
	return TRUE;
}
其中应该是取反,而不是负号。。。 这样就导致最后一位与正常结果是反的,而这意味着,这就是LBS_NOTIFY,ON_LBN_SELCHANGE 列表框中的选择可能改变。如果选择被CListBox::SetCurSel成员函数改变,则通知不发送。此通知只适用于LBS_NOTIFY风格的列表框。无论何时用户按下箭头键,即使选择未改变,LBN_SELCHANGE通知消息都被发送给多选列表框。
烟袅许伊 2013-05-18
  • 打赏
  • 举报
回复
我发现了一点问题,就是好像自绘的CListBox都是不响应这个消息的。。。寻找解决方案。。。
烟袅许伊 2013-05-18
  • 打赏
  • 举报
回复
引用 1 楼 yaozhiyong110 的回复:
IDC_LISTBOX在resource.h定义多少?
100啊,然后呢?
yaozhiyong110 2013-05-18
  • 打赏
  • 举报
回复
IDC_LISTBOX在resource.h定义多少?

16,472

社区成员

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

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

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