关于自定义控件发送自定义消息的问题

ckacka 2006-07-21 04:49:27
有一个SDI非Doc/View的工程。

我定义了一个类 CMyStatic : public CStatic

使用AfxBeginThread启动一个线程MyThreadProc:
AfxBeginThread((AFX_THREADPROC)MyThreadProc, m_hWnd);

然后再在线程函数MyThreadProc中发送消息:
UINT CChildView::MyThreadProc(LPVOID pParam)
{
HWND hWnd = (HWND)pParam;
::SendMessage(hWnd, WM_MY_MSG, 0, 0);

return 0;
}

但是我的消息处理函数却不响应该消息,处理函数设置断点就根本不进入函数。


附其他相关代码:

#define WM_MY_MSG (WM_USER + 1)

protected:
afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_MESSAGE(WM_MY_MSG, OnMyMsg)
END_MESSAGE_MAP()

LRESULT CMyStatic::OnMyMsg(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
MessageBox("Got it!");

return 1;
}
...全文
346 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckacka 2006-07-22
  • 打赏
  • 举报
回复
to zhiyong1822(zhiyong):

thax,你的代码提醒了我,我原来启动线程是在父窗口的构造函数(你的是Ct2View : public CView,我的是CChildView : public CWnd),这样是错误的,应该在OnCreate里面启动。
CW_Wei 2006-07-21
  • 打赏
  • 举报
回复
up
zhiyong1822 2006-07-21
  • 打赏
  • 举报
回复
我试了一下,如果操作正确的,句柄获得的正确,应该可以相应该消息的:我的例子如下:
视图类的实现:
// t2View.cpp : Ct2View 类的实现
//

#include "stdafx.h"
#include "t2.h"

#include "t2Doc.h"
#include "t2View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Ct2View

IMPLEMENT_DYNCREATE(Ct2View, CView)

BEGIN_MESSAGE_MAP(Ct2View, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_COMMAND(ID_32771, &Ct2View::On32771)
ON_WM_CREATE()
END_MESSAGE_MAP()

// Ct2View 构造/析构

Ct2View::Ct2View()
{
// TODO: 在此处添加构造代码

}

Ct2View::~Ct2View()
{
}

BOOL Ct2View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式

return CView::PreCreateWindow(cs);
}

// Ct2View 绘制

void Ct2View::OnDraw(CDC* /*pDC*/)
{
Ct2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
}


// Ct2View 打印

BOOL Ct2View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}

void Ct2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}

void Ct2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清除过程
}


// Ct2View 诊断

#ifdef _DEBUG
void Ct2View::AssertValid() const
{
CView::AssertValid();
}

void Ct2View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

Ct2Doc* Ct2View::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Ct2Doc)));
return (Ct2Doc*)m_pDocument;
}
#endif //_DEBUG


// Ct2View 消息处理程序

void Ct2View::On32771()
{
// TODO: 在此添加命令处理程序代码
/*MessageBox(L"kk");*/
m_hwnd=m_mystatic.m_hWnd;
/*m_hwnd=::GetWindow(NULL,GW_OWNER)*/
m_mystatic.start(m_hwnd);
int i=0;
i++;
}

int Ct2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此添加您专用的创建代码
RECT rect;
rect.bottom=30;
rect.left=0;
rect.right=200;
rect.top=0;
m_mystatic.Create(L"kkkk",WS_CHILD|WS_VISIBLE,rect,this,1000);

return 0;
}

自定义类的实现:
// MyStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "t2.h"
#include "MyStatic.h"
//#include "t2View.h"

#define WM_MY_MSG WM_USER + 1

// CMyStatic

IMPLEMENT_DYNAMIC(CMyStatic, CStatic)

CMyStatic::CMyStatic()
{

// AfxBeginThread((AFX_THREADPROC)MyThreadProc, m_hWnd);


}

CMyStatic::~CMyStatic()
{


}


BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_MESSAGE(WM_MY_MSG, OnMyMsg)

END_MESSAGE_MAP()



// CMyStatic 消息处理程序

UINT MyThreadProc(LPVOID pParam)
{
HWND hWnd = (HWND)pParam;

::SendMessage(hWnd, WM_MY_MSG, 0, 0);

return 0;
}


void CMyStatic::start(HWND h)
{
AfxBeginThread((AFX_THREADPROC)MyThreadProc, h);
}

LRESULT CMyStatic::OnMyMsg(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
int i=0;
i++;

return 1;
}
不知道,这样做是否满足你的要求。我是可以相应你的自定义消息
sjhunter 2006-07-21
  • 打赏
  • 举报
回复
define WM_MY_MSG (WM_USER + 1)
这个用法比较奇怪,改成(WM_USER + 101)试试看
zhiyong1822 2006-07-21
  • 打赏
  • 举报
回复
我不知道你的m_hWnd是哪个类的变量,你是怎么给他初始化的。你应该把这几点说清楚,大家才能给你分析。
m_hWnd 是类 CMyStatic 句柄,因为是在 CMyStatic 里面调用的。这句话什么意思,什么叫在:因为是在 CMyStatic 里面调用的。不理解。
ckacka 2006-07-21
  • 打赏
  • 举报
回复

没错,
m_hWnd 是类 CMyStatic 句柄,因为是在 CMyStatic 里面调用的。

线程生成没有问题,我跟踪了的。
WM_MY_MSG 也没有问题。我把这些代码放在CChildView里面就可以收到消息。



其实这个 AfxBeginThread 只是一个模拟。
实际的程序是一个驱动反复调用一个回调函数。驱动没有源代码。
我在使用驱动的时候也是同样的问题。
cleverwyq 2006-07-21
  • 打赏
  • 举报
回复
AfxBeginThread((AFX_THREADPROC)MyThreadProc, (LPVOID)&m_hWnd);

另外你的这个m_hWnd 是谁的句柄,要搞清楚的,呵呵
jacklzw88 2006-07-21
  • 打赏
  • 举报
回复
#define WM_MY_MSG WM_USER + 1
我看是你的HWND的问题
CWinThread* mCWinThread;
HWND *Hwnd = new HWND;
*Hwnd = this->m_hWnd;
mCWinThread = AfxBeginThread(MyThreadProc,LPVOID(*Hwnd),NULL,NULL);
zhoujie20153 2006-07-21
  • 打赏
  • 举报
回复
先看看你的线程有没有成功生成
define WM_MY_MSG (WM_USER + 1)最好是+100以上
livedeal 2006-07-21
  • 打赏
  • 举报
回复
hWnd是类CMyStatic句柄`??

15,979

社区成员

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

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