在对话框中嵌入了一个CScrollView对象A,A可以响应鼠标按下操作,就是无法响应鼠标双击消息。请大侠帮忙看看为什么。

zm1824 2010-07-30 04:53:52
.h文件中
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

DECLARE_MESSAGE_MAP()

afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
afx_msg void OnSize(UINT nType, int cx, int cy);
// afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);


.cpp文件中


BEGIN_MESSAGE_MAP(CFcModelView, CScrollView)
ON_WM_MOUSEACTIVATE()
ON_WM_SIZE()
// ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()

END_MESSAGE_MAP()

.....


void CFcModelView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
int flag = 0;
CFcModel * pFcModel = gRtu.m_pFcModel;
NODE_INFO * pNodeInfo;
LINE_INFO * pLineInfo;

for(int i=0; i<pFcModel->m_nodeArray.GetCount(); i++)
{
pNodeInfo = (NODE_INFO *)pFcModel->m_nodeArray.GetAt(i);
if(pNodeInfo->rect.PtInRect(point))
{
if(pNodeInfo->nodeType == WTG_TYPE)
{
WTG *wtg = pFcModel->GetWtgByNo(pNodeInfo->nodeNo);
CInsertWtgDlg dlg(true, *wtg);
if(dlg.DoModal() == IDOK)
{
wtg->m_componentName = dlg.m_wtgName;
wtg->m_no = dlg.m_wConNodeNo;
wtg->m_ratingPower = dlg.m_nRatingPower;
m_pDoc->SetModified(TRUE);
}
}
else if(pNodeInfo->nodeType == SVC_TYPE)
{
SVC* svc = pFcModel->GetSvcByNo(pNodeInfo->nodeNo);
CInsertSvcDlg dlg(true, *svc);
if(dlg.DoModal() == IDOK)
{
svc->m_componentName = dlg.m_svcName;
svc->m_no = dlg.m_wSvcNo;
m_pDoc->SetModified(TRUE);
}
}
}

}

for(int i=0; i<pFcModel->m_lineArray.GetCount(); i++)
{
pLineInfo = (LINE_INFO *)pFcModel->m_lineArray.GetAt(i);
if(pLineInfo->rect.PtInRect(point))
{
if(pLineInfo->lineType == TRANS_TYPE)
{
TRANSFORM* pTrans = pFcModel->GetTransformByNo(pLineInfo->lineNo);
CInsertTransformDlg dlg(true, *pTrans);
if(dlg.DoModal() == IDOK)
{
pTrans->m_componentName = dlg.m_transName;
pTrans->m_iNo = dlg.m_wINodeNo;
m_pDoc->SetModified(TRUE);
}
}
else if(pLineInfo->lineType == ORDY_LINE_TYPE)
{
ORDYLINE* pOrdyLine = pFcModel->GetOrdyLineByNo(pLineInfo->lineNo);
CInsertOrdyLineDlg dlg(true, *pOrdyLine);
if(dlg.DoModal() == IDOK)
{
pOrdyLine->m_componentName = dlg.m_lineName;
pOrdyLine->m_iNo = dlg.m_wINodeNo;
m_pDoc->SetModified(TRUE);
}
}
}
}

CScrollView::OnLButtonDblClk( nFlags, point );
}

/*
void CFcModelView::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("鼠标按下");
}
*/
...全文
193 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2010-08-02
  • 打赏
  • 举报
回复
我要看"FcModelView.h"
zm1824 2010-08-02
  • 打赏
  • 举报
回复
这个是头文件的情况。
FcModelView.h

#include <cmath>
#include "FR1AdminDoc.h"
#include "FcModel.h"

class CFcModelingNewDlg;

FcModelView.cpp

#include "stdafx.h"
#include "afxdlgs.h"
#include "FR1Admin.h"
#include "FcModelView.h"
#include "FcModelingNewDlg.h"

FcModelingNewDlg.h

#include "FcModelView.h"

CFcModelView * m_pModelView;

Eleven 2010-08-02
  • 打赏
  • 举报
回复
WM_LBUTTONDDBLCLK消息
Double-clicking the left mouse button actually generates four events: WM_LBUTTONDOWN, WM_LBUTTONUP messages, the WM_LBUTTONDBLCLK call, and another WM_LBUTTONUP message when the button is released.
删除你WM_LBUTTONDOWN里的AfxMessageBox就可以了
schlafenhamster 2010-08-02
  • 打赏
  • 举报
回复
看看你的CFcModelView::的头文件行吗?
zm1824 2010-08-02
  • 打赏
  • 举报
回复
谢谢schlafenhamster,不过我按你的方法试了,还是不行,依然没有响应。
zm1824 2010-08-02
  • 打赏
  • 举报
回复
谢谢各位,特别是schlafenhamster...
zm1824 2010-08-02
  • 打赏
  • 举报
回复
恩,是自己加的。问题解决了,谢谢各位。
原因如下:
BOOL CFcModelView::PreCreateWindow(CREATESTRUCT& cs)
{

HBRUSH hbkbrush = CreateSolidBrush(RGB(0, 0, 0));
LPCSTR lpMyOwnClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_OWNDC, 0, hbkbrush);
cs.lpszClass = lpMyOwnClass;
return CView::PreCreateWindow( cs );
}

应该为:AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_OWNDC|CS_DBLCLKS, 0, hbkbrush);
schlafenhamster 2010-08-02
  • 打赏
  • 举报
回复
没看出问题,OnMouseActivate()是你加进去的吧。
zm1824 2010-08-02
  • 打赏
  • 举报
回复
#pragma once
#include <cmath>
#include "FR1AdminDoc.h"
#include "FcModel.h"

class CFcModelingNewDlg;

class CFcModelView : public CScrollView
{
DECLARE_DYNCREATE(CFcModelView)

public:
CFcModelView(); // protected constructor used by dynamic creation
virtual ~CFcModelView();

public:

public:
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif

private:
CFR1AdminDoc * m_pDoc;

public:
bool beUpdated;

private:
int m_lastWinWidth;
int m_lastWinHeight;
int m_viewWidth;
int m_viewHeight;

public:
void SetDocument(CFR1AdminDoc *pDoc)
{
m_pDoc = pDoc;
}

public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual void OnInitialUpdate(); // first time after construct
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

DECLARE_MESSAGE_MAP()

afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
afx_msg void OnSize(UINT nType, int cx, int cy);
// afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
// afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);

};


schlafenhamster 2010-08-01
  • 打赏
  • 举报
回复
我试了试:
// TODO: Add extra initialization here
m_pScrollView=new CMyScrollView;// 从CScrollView来
CRect rc;
GetClientRect(&rc);
rc.bottom -= 60;//保留OK CANCEL
m_pScrollView->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rc, this, 1000);

CSize sizeTotal;
sizeTotal.cx=800;
sizeTotal.cy=1000;
m_pScrollView->SetScrollSizes(MM_TEXT, sizeTotal);
m_pScrollView->ShowWindow(SW_SHOW);
//
void CMyScrollView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
afxDump << "LButtonDown\n";
CScrollView::OnLButtonDown(nFlags, point);
}

void CMyScrollView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
afxDump << "?????\n";

CScrollView::OnLButtonDblClk(nFlags, point);
}
//没问题
schlafenhamster 2010-07-30
  • 打赏
  • 举报
回复
AfxMessageBox("鼠标按下");
改为:
afxDump << "鼠标按下\n";

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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