如何向指定窗口的按钮发送WM_COMMAND消息?

xiaoye2000 2009-05-10 03:44:38
原来的程序是在视图中调用工具栏按钮事件的,比如:其中一个工具栏按钮ID是IDT_CURVE,
在View中有关代码如下:
BEGIN_MESSAGE_MAP(CConferenceView, CView) 
//{{AFX_MSG_MAP(CConferenceView)
ON_COMMAND(IDT_CURVE, OnCurve)
//}}AFX_MSG_MAP

void CConferenceView::OnCurve()
{
GetEditText();
m_nTool = NULL_TYPE;
m_nMouseMode = IDT_CURVE;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurArrow);
DisPlayTheLastText();
}

现在我想在一个基于CFormView类的对话框的按钮中,向CConferenceView视图发送WM_COMMAND消息事件,怎么实现?最好贴出相关代码。谢谢!!
...全文
1005 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoye2000 2009-05-11
  • 打赏
  • 举报
回复
我觉得是分割视图的问题,我试了一下,向CMainFrame发送消息没问题,但是CConferenceView视图属于子视图了。不能直接用下面的代码了:
AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,0),0);
醉生梦死 2009-05-11
  • 打赏
  • 举报
回复
http://blog.csdn.net/yingzai621/archive/2008/06/22/2574274.aspx
dengxuxing 2009-05-11
  • 打赏
  • 举报
回复

改一下:
void CConferenceView::OnCurve()
{
GetEditText();
m_nTool = NULL_TYPE;
m_nMouseMode = IDT_CURVE;
XXXDoc*pd=(XXXDoc*)GetDocument();
pd->test=true;
pd->UpdateAllViews(NULL);
DisPlayTheLastText();
}
dengxuxing 2009-05-11
  • 打赏
  • 举报
回复
要是上面的办法都不行的话,你可以换一中思维来解决,你要发信息给另外一个视图不过是为了响应一些函数,你可以在文档类中定义一些bool型的变量并初始化,通过调用文档类的函数:UpdateAllViews(NULL)刷新视图,在你要发信息的视图类的OnUpdate函数中根据文档类中的那些变量的值调用响应的函数,并改变他们的值。

void CConferenceView::OnCurve()
{
GetEditText();
m_nTool = NULL_TYPE;
m_nMouseMode = IDT_CURVE;
XXXDoc*pd=(XXXDoc*)GetDocument();
pd->UpdateAllViews(NULL);
DisPlayTheLastText();
}

XXXView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
XXXDoc*pd=(XXXDoc*)GetDocument();
if(pd->test){
..................//要调用什么随你了

pd->test=false;
}
}
biweilun 2009-05-11
  • 打赏
  • 举报
回复
GetFirstView GetNextView 遍历View
xiaoye2000 2009-05-11
  • 打赏
  • 举报
回复
我把BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);方法去掉后用
AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,0),0);
就可以向CConferenceView视图发送消息了。现在的问题是在分割视图下如何获取CConferenceView视图的指针?望高手能指点。谢谢!!
xiaoye2000 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 biweilun 的回复:]
不管激活不激活,哪个窗口指针SendMessage就是那个窗口接受。我感觉AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,BN_CLICKED),0);应该没错
[/Quote]
我使用了分割窗口哦??
laneast 2009-05-10
  • 打赏
  • 举报
回复
向窗口中的按钮发送消息用 SendDlgItemMessage 是不是更方便一些?

MSDN:

LRESULT SendDlgItemMessage(HWND hDlg,
int nIDDlgItem,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
Randyqiu 2009-05-10
  • 打赏
  • 举报
回复
SendMessage(WM_COMMAND,MAKEWPARAM(IDC_BUTTON_AMEND,BN_CLICKED),(LPARAM)listview->m_btnAmend.m_hWnd); //发送一个按钮单击消息。
请问:我明白你这句话是向一个ID号为IDC_BUTTON_AMEND的按钮发送一个BN_CLICKED(鼠标单击)的消息,那么这里最后这个参数lParam 设置成listview->m_btnAmend.m_hWnd是什么意思呢?是某个窗口的句柄吗?
小弟一直没有搞明白sendmessage的后面两个参数的用法,正好这里学习一下。谢谢!!!!!!!!
biweilun 2009-05-10
  • 打赏
  • 举报
回复
AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,WM_LBUTTONDOWN),MAKELPARAM(0,0));
AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,WM_LBUTTONUP),MAKELPARAM(0,0));

看这个行不行
biweilun 2009-05-10
  • 打赏
  • 举报
回复
不管激活不激活,哪个窗口指针SendMessage就是那个窗口接受。我感觉AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,BN_CLICKED),0);应该没错
xiaoye2000 2009-05-10
  • 打赏
  • 举报
回复
我可能知道原因:这里有两个视图,CConferenceView和CFormView,按钮是放在基于CFormView的一个类里面。当其中一个视图激活后,另一个视图就处于未激活状态。是不是这个原因??
xiaoye2000 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 biweilun 的回复:]
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated. WM_COMMAND消息在三种情况下被发送: 1.用户选择一个菜单项 2.控件向自己的父窗口发送通知消息 3.加速键被按下三种情况对应的wParam和lParam参数用法如下(MSDN):

Message Source wParam (high word) wParam (low…
[/Quote]
兄弟,还是没响应啊??
biweilun 2009-05-10
  • 打赏
  • 举报
回复
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated. WM_COMMAND消息在三种情况下被发送: 1.用户选择一个菜单项 2.控件向自己的父窗口发送通知消息 3.加速键被按下三种情况对应的wParam和lParam参数用法如下(MSDN):

Message Source wParam (high word) wParam (low word) lParam
Menu 0 Menu identifier (IDM_*) 0
Accelerator 1 Accelerator identifier (IDM_*) 0
Control Control-defined notification code Control identifier Handle to the control window


注意一下wParam参数,被分为高字和低字,那当我们需要自己send WM_COMMAND 消息时,怎样来制作wParam参数呢?可以使用MAKEWPARAM宏,下面是我项目中的一句代码: SendMessage(WM_COMMAND,MAKEWPARAM(IDC_BUTTON_AMEND,BN_CLICKED),(LPARAM)listview->m_btnAmend.m_hWnd); //发送一个按钮单击消息。

类似的宏还有: MAKELONG 制作一个长整型的参数 MAKELPARAM 制作一个lParam参数 MAKELRESULT 制作一个从窗口程序或者回调函数返回的32位值

biweilun 2009-05-10
  • 打赏
  • 举报
回复
上面那个0的位置你自己换成具体的消息吧
比如MAKEWPARAM(IDT_LINE,BN_CLICKED)
biweilun 2009-05-10
  • 打赏
  • 举报
回复
AfxGetMainWnd()->SendMessage(WM_COMMAND,MAKEWPARAM(IDT_LINE,0),0);
xiaoye2000 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 biweilun 的回复:]
我晕!!!!!!!!!!!!!!!!!!!!!!!
第一次看到SendMessage是这么用的。。。。。。。。。。。。。。
[/Quote]
呵呵,高手,别绕弯了。直说代码好吗?谢谢!!
biweilun 2009-05-10
  • 打赏
  • 举报
回复
我晕!!!!!!!!!!!!!!!!!!!!!!!
第一次看到SendMessage是这么用的。。。。。。。。。。。。。。
clever101 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoye2000 的回复:]
引用 6 楼 xiaoye2000 的回复:
引用 5 楼 Mackz 的回复:
已经说过了,只要向框架窗口发消息就行了,会自动转发到视图窗口的;视图窗口的消息函数不用作任何更改。

我这样发送AfxGetMainWnd()->SendMessage(IDT_LINE); 还是不行啊???

晕!!纠正一下:AfxGetMainWnd()->SendMessage(IDT_CURVE); 还是不行啊???
[/Quote]

谁叫你这么用的?你查了MSDN吗?
CWnd::SendMessage
Sends the specified message to this window.


LRESULT SendMessage(
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0
);
xiaoye2000 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaoye2000 的回复:]
引用 5 楼 Mackz 的回复:
已经说过了,只要向框架窗口发消息就行了,会自动转发到视图窗口的;视图窗口的消息函数不用作任何更改。

我这样发送AfxGetMainWnd()->SendMessage(IDT_LINE); 还是不行啊???
[/Quote]
晕!!纠正一下:AfxGetMainWnd()->SendMessage(IDT_CURVE); 还是不行啊???
加载更多回复(6)

16,473

社区成员

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

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

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