如何得到自定义控件的ID

tjzzx888 2003-12-08 11:34:57
我用SDK开发,用CreateWindow建立了一个按钮,我如何得到这个控件的ID号,也就是说,点击这个按钮时将向主窗口发送一个WM_COMMAND消息,在众多的WM_COMMAND消息中,我如何知道是这个按钮发出的消息
...全文
368 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggw007 2003-12-20
  • 打赏
  • 举报
回复
补充:你说的ID号就是按钮的窗口句柄(HWND)
ggw007 2003-12-20
  • 打赏
  • 举报
回复
我今天也遇到了这个问题,不知道你解决了没有,

BEGIN_MESSAGE_MAP(CDragTView, CView)
。。。。。。
ON_COMMAND(ID_CREATE_BTN, OnCreateBtn) // ID_CREATE_BTN为一菜单命令
ON_COMMAND(ID_BTN, OnCreateBtn) // 在此ID_BTN等于101
。。。。。。
END_MESSAGE_MAP()

void CDragTView::OnCreateBtn()
{
// TODO: Add your command handler code here
RECT cliRect;
GetClientRect(&cliRect); // 获得客户区的大小

RECT btnRect; //按钮的大小
int No =m_arrDrafHandlBtn.GetSize();
btnRect.top =30*No;
btnRect.left =0;
btnRect.right =cliRect.right;
btnRect.bottom =30*(No+1);
ptrDrafHandleBtn =new CDrafHandleBtn;
ptrDrafHandleBtn->Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, btnRect, this, ID_BTN);
int windowsID =GetWindowLong(ptrDrafHandleBtn->m_hWnd, GWL_ID);
CString str1,str2;
str1.Format("%d",windowsID);
str1 ="======"+str1+"=======\n";
TRACE(str1);
str2.Format("%d",(int)ptrDrafHandleBtn->m_hWnd);
str2 ="======"+str2+"=======\n";
TRACE(str2);
}

BOOL CDragTView::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class

return CView::OnCommand(wParam, lParam);
}

// 上面函数中str1和ID_BTN和wParam是一样的;str2和lParam是一样的;
// 如果发出命令消息的是控件,如按钮之类的,OnCommand函数中的wParam是命令消息
// 标识,lParam标识发出命令消息的控件,
// 所以在建立了按钮后记下它的HWND,然后在OnCommand函数中与lParam比较,如果一样就
// 是该按钮发出的消息
mcaire 2003-12-08
  • 打赏
  • 举报
回复
ID号在创建时就要当参数填写进去的
__________________ 2003-12-08
  • 打赏
  • 举报
回复
CreateWindow后GetWindowLong获取它的id保存它
wm_command时与保存的id比较
tjzzx888 2003-12-08
  • 打赏
  • 举报
回复
to laomai(老迈)
我的MSN:xfbcb@hotmail.com
tjzzx888 2003-12-08
  • 打赏
  • 举报
回复
to laomai(老迈)
当然可以
osborn 2003-12-08
  • 打赏
  • 举报
回复
自msdn

hMenu
[in] Handle to a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window.
laomai 2003-12-08
  • 打赏
  • 举报
回复
to 青草:
我最近也在做一个实现自定义按钮的例子,可以和您交流吗?
ross33123 2003-12-08
  • 打赏
  • 举报
回复
CreateWindow 用的 hMenu 参数对子窗口而言就是 ID
crystal_heart 2003-12-08
  • 打赏
  • 举报
回复
up
ross33123 2003-12-08
  • 打赏
  • 举报
回复
既然用CreateWindow,怎么会不知道自己填的参数?

如果你在 CreateWindow 用的参数填的如果是 0,当然不会给你返回别的ID
Ah 2003-12-08
  • 打赏
  • 举报
回复
在发送WM_COMMAND消息时,控件ID保存在WPARAM参数的低16位中,高16位中保存的是命令消息,比如BN_CLICK,可以象下面这样取得ID

DWORD dwID = wParam & 0x00FF;
tjzzx888 2003-12-08
  • 打赏
  • 举报
回复
to checkyvc6(checkyvc6):
我调用GetWindowLong(hWnd,GWL_ID)返回零呀,查MSDN说调用没成功,这是怎么回事
seilfer2000 2003-12-08
  • 打赏
  • 举报
回复
看到你帖子了,帮你UP
checkyvc6 2003-12-08
  • 打赏
  • 举报
回复
CreateWindow 用的 hMenu 参数对子窗口而言就是 ID
如果控件是你自己创建的话应该知道,
不过如果你在创建的时候不知道可以用int nId=GetWindowLong(hWnd,GWL_ID)取得.
然后在WM_COMMAND消息处理里面
switch(LOWORD(wParam))
case id:
.....
这样应该明白了吧

16,551

社区成员

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

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

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