6888|6

95

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince Group Box里面的Button控件不响应消息函数? [复制链接]

平台:vs2005 wince5.0 MFC智能设备应用程序。
我在Dialog上添加一个GroupBox(m_cgbpicture),然后在GroupBox上添加一Button,可程序运行后Button(ctxttvbright)跟GroupBox并没有自动关联,
于是我在OnInitDialog()中用m_ctxttvbright.SetParent(&m_cgbpicture);强制关联它们(可以一起显示、使能、移动等)。
之后我双击GroupBox上的Button控件,在自动生成的消息映射函数中添加了实现代码。
最后Debug发现程序根本没跑到Button的消息映射函数中来。

注:用vs 新建一个普通的 C++ MFC 应用程序做测试,GroupBox跟Button会自动关联,Button的消息响应函数也没问题。

请知道的或遇到过该问题的大侠多多指教,希望说明原因和如何改进。。。。非常感谢。。。
此帖出自WindowsCE论坛

最新回复

怎么可能,根本就没有groupbox空间  详情 回复 发表于 2009-12-28 22:03
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
补充:上述使用的Group Box类为CGroupControl类,来自:http://www.codeproject.com/KB/buttons/groupcontrol.aspx
在普通vc mfc上测试没任何问题。。
如果button调用SetParent(&GroupBox);该button的消息响应函数就无效。但wince5.0下面的mfc程序,使用groupbox
又不能跟其他控件关联,所以最终还是不能在wince下用好groupbox。

另,如果我的groupbox 用CStatic类,发现在普通vc mfc程序还是在wince mfc智能设备程序中都无法
使groupbox关联其他控件。。。

所以上述问题转化为:wince下 Group Box怎么和里面Button等其他控件关联起来?

eeworld上搜锁到下面帖子:
http://topic.eeworld.net/t/20020912/16/1018393.html
上面说“重新设置一下TAB跳格顺序就好了,把GroupBox放在最后。”就可以了。
但我还不知道如何设置控件的Tab跳格顺序,在属性里面好像没有啊。。。还是需要在程序里面设置?


此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
按Ctrl+D,能看到各个控件会出现蓝色的数字,然后用鼠标按你希望的顺序,点击各个控件就行。
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
to shuiyan:
我用ctrl +D后,将group box(CStatic类)我的dialog上3个控件tab顺序设置好:一个ok button (1),cancel button (2),一个group box(3),然后cancel button拖入group box里面,再实现ok button单击消息响应函数,使groupbox重复隐藏or显示。
ok button 的响应函数如下:
void CtestceDlg::OnBnClickedOk()
{
        // TODO: 在此添加控件通知处理程序代码
        static int hideFlag = 1;
        if(hideFlag)
                m_cgbtest.ShowWindow(FALSE);//m_cgbtest就是在类中定义的group box
        else
                m_cgbtest.ShowWindow(TRUE);
        hideFlag = !hideFlag;
}
可groupbox里面的cancel button不会随groupbox一起隐藏or显示。

在VC MFC和WINCE MFC下都是这样。

但只要将group box在类定义中用 CGroupControl类(在二楼链接中有定义) 代替 CStatic类, VC MFC下的 cancel button就会随groupbox一起隐藏or显示;但WinCE MFC下仍然不行。tab顺序都设置对了。
不信 大家可以试试。。。   这是不是MFC 在wince 下的一个bug啊?

此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
to shuiyan:
我用ctrl +D后,将group box(CStatic类)我的dialog上3个控件tab顺序设置好:一个ok button (1),cancel button (2),一个group box(3),然后cancel button拖入group box里面,再实现ok button单击消息响应函数,使groupbox重复隐藏or显示。
ok button 的响应函数如下:
void CtestceDlg::OnBnClickedOk()
{
        // TODO: 在此添加控件通知处理程序代码
        static int hideFlag = 1;
        if(hideFlag)
                m_cgbtest.ShowWindow(FALSE);//m_cgbtest就是在类中定义的group box
        else
                m_cgbtest.ShowWindow(TRUE);
        hideFlag = !hideFlag;
}
可groupbox里面的cancel button不会随groupbox一起隐藏or显示。

在VC MFC和WINCE MFC下都是这样。

但只要将group box在类定义中用 CGroupControl类(在二楼链接中有定义) 代替 CStatic类, VC MFC下的 cancel button就会随groupbox一起隐藏or显示;但WinCE MFC下仍然不行。tab顺序都设置对了。
不信 大家可以试试。。。   这是不是MFC 在wince 下的一个bug啊?

此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
怎么没人回复啊,
小弟分太少了,等赚多了再多给些各位大侠。

原因是找到了:groupbox里面的CGroupControl::OnShowWindow消息函数没有响应,但具体就不知道为什么不响应了。在VC MFC下是可以响应的。。。
是不是wince MFC下的消息响应函数有bug?昨天写OnPaint消息时,dialog的picture control图片不能等于dialog的尺寸,更不能大于了。否则dialog的Onpaint消息就不会响应。。。。这太没道理了吧。。。。一个背景图用的时候就是想它完全覆盖dialog的啊。。。。

另,CGroupControl类的.cpp如下:

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GroupControl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGroupControl

CGroupControl::CGroupControl()
{
  m_bAllowOverlap = FALSE;
  m_bUseTabOrder = FALSE;
  m_bIgnoreControls = FALSE;
}

CGroupControl::~CGroupControl()
{
}

BEGIN_MESSAGE_MAP(CGroupControl, CButton)
        //{{AFX_MSG_MAP(CGroupControl)
        ON_WM_ENABLE()
        ON_WM_WINDOWPOSCHANGED()
        ON_WM_SHOWWINDOW()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGroupControl message handlers

BOOL CGroupControl::Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT &rect, CWnd *pParentWnd, UINT nID)
{
  dwStyle &= ~(0xF);                // remove styles with conflict with group box
  dwStyle |= BS_GROUPBOX;        // add group box style
  return CButton::Create(lpszCaption, dwStyle, rect, pParentWnd, nID);
}

void CGroupControl::PreSubclassWindow()
{
  CButton::PreSubclassWindow();

  // if this 'button' is not a group then
  // it's a bit meaningless to use this control at all
  ASSERT((GetStyle() & 0xF) & BS_GROUPBOX);
}

BOOL CGroupControl::IsInGroup(CWnd *pCtrl, BOOL &bOverlapped) const
{
  BOOL bIsInGroup = FALSE;
  if (pCtrl == NULL)
    return FALSE;
  CRect rcGroup, rc;
  GetWindowRect(&rcGroup);
  pCtrl->GetWindowRect(&rc);
  if (rcGroup.PtInRect(rc.BottomRight()) && rcGroup.PtInRect(rc.TopLeft()))
    bIsInGroup = TRUE;
  if (! bIsInGroup && (rcGroup.PtInRect(rc.BottomRight()) || rcGroup.PtInRect(rc.TopLeft())))
    bOverlapped = bIsInGroup = TRUE;
  return bIsInGroup;
}

BOOL CGroupControl::DoGroupControlAction(GROUPCONTROLACTIONFUNC pfnGCAF, LPARAM lParam/*=0*/) const
{
  if (pfnGCAF == NULL)
    return FALSE;

  if (m_bIgnoreControls)
    return FALSE;

  // don't do anything if we're not a groupbox
  if (!((GetStyle() & 0xF) & BS_GROUPBOX))
    return FALSE;

  // go through all controls that lie inside the group and enable/disable
  // those controls also
  CRect rcGroup;
  GetWindowRect(&rcGroup);

  // go through siblings, and see if they lie within the boundary
  // of this group control
  CWnd* pCtrl = NULL;
  if (m_bUseTabOrder)
    pCtrl = GetNextWindow();
  else
    pCtrl = GetParent()->GetWindow(GW_CHILD);
  while (pCtrl != NULL)
  {
    if (pCtrl->GetSafeHwnd() != GetSafeHwnd())
    {
      BOOL bOverlapped = FALSE;
      BOOL bIsInGroup = IsInGroup(pCtrl, bOverlapped);
      if (bIsInGroup && (m_bAllowOverlap || ! bOverlapped))
      {
        if (! pfnGCAF(pCtrl, lParam))
          return FALSE;
      }
      else if (! bOverlapped && m_bUseTabOrder)  // found out side of group, so ditch out
        break;
    }
    pCtrl = pCtrl->GetNextWindow();
  }
  return TRUE;
}

static BOOL GroupControlActionFunc_Enable(CWnd* pCtrl, LPARAM lParam)
{
  if (pCtrl == NULL)
    return TRUE;
  BOOL bEnable = (BOOL)lParam;
  pCtrl->EnableWindow(bEnable);
  return TRUE;
}

void CGroupControl::OnEnable(BOOL bEnable)
{
  CButton::OnEnable(bEnable);
  if (! m_bIgnoreControls)
    DoGroupControlAction(GroupControlActionFunc_Enable, bEnable);
}

static BOOL GroupControlActionFunc_Move(CWnd* pCtrl, LPARAM lParam)
{
  if (pCtrl == NULL)
    return TRUE;
  short nDeltaX = LOWORD(lParam);
  short nDeltaY = HIWORD(lParam);
  CRect rc;
  pCtrl->GetWindowRect(&rc);
  rc.OffsetRect(nDeltaX, nDeltaY);
  pCtrl->GetParent()->ScreenToClient(&rc);
  pCtrl->MoveWindow(rc);
  return TRUE;
}

void CGroupControl::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
  CButton::OnWindowPosChanged(lpwndpos);

  if (m_bIgnoreControls)
    return;

  if (lpwndpos->flags & SWP_NOMOVE)
    return;
  
  // see if we've moved x or y, and
  // move group controls with group box
  CRect rcGroup;
  GetWindowRect(&rcGroup);
  GetParent()->ScreenToClient(&rcGroup);

  int nDeltaX = lpwndpos->x - rcGroup.left;
  int nDeltaY = lpwndpos->y - rcGroup.top;

  if (nDeltaX == 0 && nDeltaY == 0)
    return;

  DoGroupControlAction(GroupControlActionFunc_Move, MAKELPARAM(nDeltaX, nDeltaY));

  Invalidate();
}

static BOOL GroupControlActionFunc_Show(CWnd* pCtrl, LPARAM lParam)
{
  if (pCtrl == NULL)
    return TRUE;
  BOOL bShow = (BOOL)lParam;
  pCtrl->ShowWindow(bShow ? SW_SHOW : SW_HIDE);
  return TRUE;
}

void CGroupControl::OnShowWindow(BOOL bShow, UINT nStatus)
{
  CButton::OnShowWindow(bShow, nStatus);
  if (! m_bIgnoreControls)
    DoGroupControlAction(GroupControlActionFunc_Show, bShow);
}
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
怎么可能,根本就没有groupbox空间
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表