MFC中ON_MESSAGE调用自定义消息处理函数不能使用this指针还有重画函数InvalidateRect 函数代码如下
屏蔽处是错误相关的代码程序用的是WIN32修改写的,+MFC静态库WIN7系统别人的可以用我的就不能,在跑出库的时候消息里边应该存有当前类框架的指针的,进入消息处理函数的...
屏蔽处是错误相关的代码
程序用的是 WIN32 修改写的,+MFC静态库
WIN7系统
别人的可以用我的就不能,在跑出库的时候消息里边应该存有当前类框架的指针的,进入消息处理函数的时候用this指针调用w_hWnd 使用绘图InvalidateRect(this->m_hWnd,NULL,TRUE)函数不能绘制函数,这是一个错误,在类中声明两个变量,x,y 给他们写重载赋值函数后,在自定义的消息处理函数中不能使用x,y 说是没定义,什么意思?别人的就行我的就不行。求解!代码有点问题,我就不改了 直接贴上了,
代码功能,在新建的窗口中,打印一个字符串,实现在鼠标移动的过程中字符串跟随移动
#include "stdafx.h"
int x =100;
int y =100;
class CMyFrameWnd : public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
LRESULT OnCreate(WPARAM wParam,LPARAM lParam);
LRESULT OnPaint(WPARAM wParam,LPARAM lParam);
LRESULT OnMove(WPARAM wParam,LPARAM lParam);
/*
int x;
int y;
CMyFrameWnd();
*/
};
/*
CMyFrameWnd::CMyFrameWnd()
{
x = 100;
y = 100;
}
*/
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_MESSAGE(WM_CREATE,OnCreate)
ON_MESSAGE(WM_PAINT,OnPaint)
ON_MESSAGE(WM_MOUSEMOVE,OnMove)
END_MESSAGE_MAP()
LRESULT OnMove(WPARAM wParam,LPARAM lParam)
{
x = LOWORD(lParam);
y = HIWORD(lParam);
/* ::InvalidateRect(this->m_hWnd,NULL,TRUE);*/
return 0;
}
LRESULT CMyFrameWnd::OnPaint(WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps = {0};
HDC hdc = ::BeginPaint(m_hWnd,&ps);
::TextOut(hdc,x,y,"HELLO",5);
::EndPaint(m_hWnd,&ps);
return 0;
}
LRESULT CMyFrameWnd :: OnCreate(WPARAM wPAram,LPARAM lParam)
{
AfxMessageBox("CMyFrameWnd::OnCreate");
return 0;
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp :: InitInstance()
{
CMyFrameWnd *pFrame = new CMyFrameWnd();
pFrame->Create(NULL,"MFCMsg");
m_pMainWnd= pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
} 展开
程序用的是 WIN32 修改写的,+MFC静态库
WIN7系统
别人的可以用我的就不能,在跑出库的时候消息里边应该存有当前类框架的指针的,进入消息处理函数的时候用this指针调用w_hWnd 使用绘图InvalidateRect(this->m_hWnd,NULL,TRUE)函数不能绘制函数,这是一个错误,在类中声明两个变量,x,y 给他们写重载赋值函数后,在自定义的消息处理函数中不能使用x,y 说是没定义,什么意思?别人的就行我的就不行。求解!代码有点问题,我就不改了 直接贴上了,
代码功能,在新建的窗口中,打印一个字符串,实现在鼠标移动的过程中字符串跟随移动
#include "stdafx.h"
int x =100;
int y =100;
class CMyFrameWnd : public CFrameWnd
{
DECLARE_MESSAGE_MAP()
public:
LRESULT OnCreate(WPARAM wParam,LPARAM lParam);
LRESULT OnPaint(WPARAM wParam,LPARAM lParam);
LRESULT OnMove(WPARAM wParam,LPARAM lParam);
/*
int x;
int y;
CMyFrameWnd();
*/
};
/*
CMyFrameWnd::CMyFrameWnd()
{
x = 100;
y = 100;
}
*/
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_MESSAGE(WM_CREATE,OnCreate)
ON_MESSAGE(WM_PAINT,OnPaint)
ON_MESSAGE(WM_MOUSEMOVE,OnMove)
END_MESSAGE_MAP()
LRESULT OnMove(WPARAM wParam,LPARAM lParam)
{
x = LOWORD(lParam);
y = HIWORD(lParam);
/* ::InvalidateRect(this->m_hWnd,NULL,TRUE);*/
return 0;
}
LRESULT CMyFrameWnd::OnPaint(WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps = {0};
HDC hdc = ::BeginPaint(m_hWnd,&ps);
::TextOut(hdc,x,y,"HELLO",5);
::EndPaint(m_hWnd,&ps);
return 0;
}
LRESULT CMyFrameWnd :: OnCreate(WPARAM wPAram,LPARAM lParam)
{
AfxMessageBox("CMyFrameWnd::OnCreate");
return 0;
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp :: InitInstance()
{
CMyFrameWnd *pFrame = new CMyFrameWnd();
pFrame->Create(NULL,"MFCMsg");
m_pMainWnd= pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
} 展开
2个回答
展开全部
关于这个问题,以前我也回答过一位朋友了,这说明你对MFC对Windows消息的映射还不了解,消息分三种没有,但其中没有ON_MESSAGE的消息的,
1、标准的Windows消息(响应函数由IDE默认)定义响应函数格式为:ON_WM_XXX(),比如你例子中的ON_CREAT,这个是标准的Windows消息,在message map中建立映射时,只有写ON_WM_CREAT();那么系统默认ON_CREAT消息的响应函数是onCreat(),你只用去用就行,例如你派生类中的onPaint,onInitInstance等都是标准的Windows消息
2、COMMAD消息(一般的菜单栏,工具栏的),在message map中声明为
ON_COMMADN(ID_XXX,func);
3、notification消息,比如按钮之类的,,声明为
ON_BNCLICKED(ID_XXX,func)
1、标准的Windows消息(响应函数由IDE默认)定义响应函数格式为:ON_WM_XXX(),比如你例子中的ON_CREAT,这个是标准的Windows消息,在message map中建立映射时,只有写ON_WM_CREAT();那么系统默认ON_CREAT消息的响应函数是onCreat(),你只用去用就行,例如你派生类中的onPaint,onInitInstance等都是标准的Windows消息
2、COMMAD消息(一般的菜单栏,工具栏的),在message map中声明为
ON_COMMADN(ID_XXX,func);
3、notification消息,比如按钮之类的,,声明为
ON_BNCLICKED(ID_XXX,func)
追问
虽然答 的汗多 但是不是我要的答案,还是谢谢你
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询