动态创建的静态文本框:获取和处理STN_CLICKED消息



MSVS2015下的MFC C++项目。我的计划是使用扩展样式动态创建许多(例如>200(CStatic框:WS_EX_DLGMODALFRAME|WS_EX_CLIENTEDGE以使它们看起来美观。这意味着我不能使用CStatic::Create,而是使用:

DWORD style = WS_VISIBLE | WS_CHILD | SS_CENTER | SS_NOTIFY;
p->box = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE, "STATIC", nStr, style,
p->posX, p->posY, p->sizeX, p->sizeY, this->GetSafeHwnd(), NULL, GetModuleHandle(nullptr), NULL );

如果我设置了SS_NOTIFY样式,那么查看是否单击了其中一个静态窗口将非常方便。根据文档,我应该得到一个STN_CLICKED通知,这很好。但这显然是通过WM_COMMAND消息实现的。

WM_COMMAND未在父对话框属性中列为可用消息。

如果我在父对话框中手动创建一个静态框,并将Notify属性设置为true,我可以得到一个STN_CLICKED处理程序,它可以整齐地进入消息映射宏:

ON_STN_CLICKED( IDC_TEST, &CFamilyDlg::OnStnClickedTest )

由于我是动态创建框的,所以我不能为每个静态窗口放入一个处理程序。(在任何情况下,CreateWindowEx函数都会生成HWND而不是控件ID。(

我想接收所有STN_CLICKED消息,然后使用HWND告诉我哪个消息处于活动状态,以便我可以对此采取措施。

想法?

根据Joseph Willcoxson的评论,我为动态创建的静态框添加了ID。(目前只是一些随机范围(

DWORD style = WS_VISIBLE | WS_CHILD | SS_CENTER | SS_NOTIFY;
p->box = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE, "STATIC", nStr, style, p->posX, p->posY, p->sizeX, p->sizeY,
this->GetSafeHwnd(), NULL, GetModuleHandle(nullptr), NULL );
CWnd* pWnd = CWnd::FromHandle(p->box);
pWnd->SetDlgCtrlID( 0x1000 + idx);

然后是一个处理程序函数:

afx_msg void OnPersonClicked( UINT nID );

以及建议的消息映射条目:

ON_CONTROL_RANGE(STN_CLICKED, 0x1000, 0x2000, OnPersonClicked )

现在按要求工作:-(

实际代码的唯一区别是添加了几个常量:

const int MIN_ID=0x1000;const int MAX_ID=0x2000;

我没有在函数名前面使用"与"符号,但它可以使用或不使用它。

最新更新