描述:
各位高手:
小弟刚学WTL。有一点MFC基础。今天看一教程时遇到一个问题使终没想明白特来请教,希望有高手指点一二。
我在工具条ToolBar上新添了一个按钮并在框架类中添加代码响应点击按钮:当点击按钮时改变视图窗口背影色。
LRESULT CMainFrame::OnToolBarBtn1Click(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
m_view.PostMessageW(WM_ERASEBKGND);
return 0;
}
然后在视图窗口类中增加对WM_ERASEBKGND消息响应的事件处理
LRESULT CMyFirstWTLView::OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc(m_hWnd);
//TODO: Add your drawing code here
//测试消息是否响应
::MessageBox(m_hWnd,_T("I've called"),_T("Test"),MB_OK);
return 0;
}
可是我发现程序执行后并没有得到我预期的结果。。。
而我更换了主框架类中按钮点击事件的处理代码后:
LRESULT CMainFrame::OnToolBarBtn1Click(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
RECT rcClient;
m_view.GetClientRect( &rcClient );
m_view.RedrawWindow(&rcClient,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
return 0;
}
程序执行却又正确。这是为什么啊?为什么直接发送消息并没有得到处理。请高手指点。。。不甚感谢
解决方案1:
要用sendmessage。
消息是可以被处理的。
你看看你是不是忘了添加消息宏了。 onmessage。宏是否正确
新手经常犯这样的错误。
或者你需要先创建view窗口。
WM_ERASEBKGND消息是系统的通知消息,不可以直接来发送
RedrawWindow是重绘窗口,系统会自动刷新背景,也就是会相应你定义的消息函数。
m_view.PostMessageW(WM_ERASEBKGND);
用SendMessage()试试,PostMessageW有可能消息没有处理完就返回了
SendMessage会等消息处理完才返回。
1,用Messagebox太笨重,想获取运行状态,可以下个DebugView,而后ATLTRACE();
2,PreTranlateMessage,是WTL的一种消息过滤机制,由于你的消息循环是WTL写的,WTL能确保处理message queue中的每个消息前都会call这个函数,如果你的postmessage成功了,那么这个函数一定会先被call到,可以ATLTRACE一下。
直接,发送是没有问题,您仔细看看代码.
如果
LRESULT CMyFirstWTLView::OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc(m_hWnd);
//TODO: Add your drawing code here
//测试消息是否响应
::MessageBox(m_hWnd,_T("I've called"),_T("Test"),MB_OK);
return 0;
}
程序应当在一进行就会出现对话框,那还需要你点工具条啊
也就是说你的OnEraseBkgnd消息都没有来
有几种可能性
1.您没有定义宏
2.消息在前面就被处理了,还没有到这儿来. 解决方案6:
重载这个函数:
BOOL CMainFrame::PreTranlateMessage(MSG* pMsg)解决方案7:
{
if( m_view.PreTranlateMessage(pMsg ) return TRUE;
return TRUE;
}
直接发消息是可以的,参数WPARAM wParam, // handle to device context (HDC)
没有设定, 一般情况下,你不需要手工发消息, 况且还得自已创建/释放这个窗口DC,
用RedrawWindow或Invalidate重绘窗口即可.
您可能想查找下面的文章:
- 看了一下WTL,对这个代码看不懂
- 要用atl写个控件,涉及到界面的,怎么将wtl和atl结合起来用呐?用wtl来做控件的界面
- 在ATL中使用WTL中的CFileDialog实现预览功能出现的不刷新问题,高手进
- 使用WTL库,编译提示“cannotopenincludefile"atlresh"”,这是怎么回事?
- WTL能否用于ATL做COM组件的界面?需要注意什么?
- WTL中,怎么改变lineto画线的颜色和粗细?
- WTL问题,MainFrame加一个Destory响应怎么会这样
- 请大家帮忙看看这个:关于wtl
- WTL,CCodePageCombo继承CComboBoxT<ATL::CWindow>类,需要响应下拉菜单CloseUp的消息
- WTL下如何添加Mediaplayer控件