动态创建的自绘按钮无法响应单击的问题

changanbenben 2009-01-07 03:11:08
前几天在论坛发帖没有解决只好请专家帮忙解决了。
我从网上下载了一个自绘按钮的代码,CXPButton类,让按钮有漂亮的外观。我把对话框上的按钮关联上CXPButton类的变量后,按钮确实能够显示漂亮的外观。但是我用该类的变量动态Create一个按钮,该按钮有漂亮的外观,但是无法响应鼠标单击,而且根本无法点击,跟一个静态的文本一样。该类没有重载Create()函数。
我是在属性表里动态添加的按钮,因为属性表下面的“确定”“应用”“取消”“帮助”四个按钮不够,而属性表在资源里又看不到,所以动态添加了一个,在属性表的OnInitDialog()里添加m_Button.Create("恢复出厂设置",BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE | WS_TABSTOP,rect1,this,IDC_RECOVER);当m_Button是CButton类型时,按钮没有问题,响应都能用。但是当m_Button是CXPButton类型时,按钮能够创建出来,而且外观也是CXPButton类的外观,只是无法点击,点击时一点反应都没有。
CXPButton类的头文件和源文件在原来的帖子上http://topic.csdn.net/u/20090105/20/13ca4d96-b37f-40f8-b572-13bde57706aa.html7楼是头文件,8楼10楼是源文件。
请专家帮忙看一下是什么问题,应该怎么解决。
...全文
487 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangdi7922 2011-07-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 changanbenben 的回复:]

问题解决了,我下载的CXPButton的代码跟大家的有些不同,

void CXPButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);

//设置按钮的有效区域
CRgn rgn;
CRect rc;
GetC……
[/Quote]

谢谢楼主,问题解决了,但是我还有个问题: 既然这样,为什么不是动态创建的就没有这个问题呢?希望楼主帮助讲解
zenLoner 2010-04-22
  • 打赏
  • 举报
回复
我也遇到这个问题,搞了很久,看到这个帖子才搞定,真是太感谢了
shanglihong 2010-01-12
  • 打赏
  • 举报
回复
楼主不错,我也遇到同样的问题,按照楼主的方法吧问题解决了,呵呵!
冰霜icefrost 2009-01-10
  • 打赏
  • 举报
回复
LZ真的很认真呀,
问题解决就好。
changanbenben 2009-01-10
  • 打赏
  • 举报
回复
感谢各位的帮忙,尤其是binglingshuang 是他的DEMO让我找到了我的程序中的错误。
changanbenben 2009-01-10
  • 打赏
  • 举报
回复
问题解决了,我下载的CXPButton的代码跟大家的有些不同,

void CXPButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);

//设置按钮的有效区域
CRgn rgn;
CRect rc;
GetClientRect(&rc);

//有效区域为一个角半径为5的圆角矩形
rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom,5,5);

SetWindowRgn(rgn,TRUE);

rgn.DeleteObject();

}
红色部分是我的代码中多的部分,这段代码将按钮的有效区域进行了设置,而所用的SetWindowRgn(rgn,TRUE)函数中窗口区域的坐标是相对于窗口的左上角而非窗口的客户区的左上角,因此按钮的有效区域被设在了按钮之外。这段代码去掉即可。
冰霜icefrost 2009-01-09
  • 打赏
  • 举报
回复
LZ我把我用你代码写的一个Demo,你下载看一看吧。
http://download.csdn.net/source/956253
changanbenben 2009-01-09
  • 打赏
  • 举报
回复
唉,没办法啊,工程很大,其它按钮都是那个风格的,必须得整好啊。看样子还得靠自己,最近一直在深入研究呢。
冰霜icefrost 2009-01-08
  • 打赏
  • 举报
回复
LZ还在研究你那个XPButton呢,
changanbenben 2009-01-08
  • 打赏
  • 举报
回复
似乎跟NOTIFY没有关系吧?我试过了。
changanbenben 2009-01-08
  • 打赏
  • 举报
回复
可能我的表达能力不太好,大家都还没有理解问题真正所在。现在按钮根本无法点击,系统无法捕获按钮点击的消息,所以有消息响应也没有用。我用CButton类型的变量动态创建的按钮已经完全实现了我所需要的功能,但是按钮外观不好看,所以我把变量类型改成CXPButton其它都没有改变,按钮创建正确,外观也很好看,但是无法单击,鼠标移动到按钮上的消息都捕获不到。我认为应该是CXPButton类还有什么函数没有添加或者重载,但是我是初学者,这方面了解不多。
changanbenben 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Tinary3v0 的回复:]
m_Button.Create("恢复出厂设置",BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE | WS_TABSTOP,rect1,this,IDC_RECOVER);创建位置不变

需要手动添加消息映射过程。
[/Quote]
这些我都添加过了,我发帖时也说了,如果m_Button是CButton类型的,一点问题都没有,按钮单击响应函数也都能用。
sungoco2 2009-01-08
  • 打赏
  • 举报
回复
NOTIFY属性为FALSE?
Tinary3v0 2009-01-08
  • 打赏
  • 举报
回复
m_Button.Create("恢复出厂设置",BS_PUSHBUTTON |WS_CHILD | WS_VISIBLE | WS_TABSTOP,rect1,this,IDC_RECOVER);创建位置不变

需要手动添加消息映射过程。
在属性表类(CPro***Dlg)的头文件中添加:
afx_msg void OnInXPButtonClick();


在属性表类(CPro***Dlg)的CPP文件中先添加映射:
BEGIN_MESSAGE_MAP(CPro***Dlg, CDialog)
//{{AFX_MSG_MAP(CPro***Dlg)
//......
ON_BN_CLICKED(IDC_RECOVER, OnInXPButtonClick) //IDC_RECOVER一定要是你创建按钮时候对应的ID
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


CPP文件中添加消息响应函数的实现:
void CPro***Dlg::OnInXPButtonClick( ) 
{
//添加点击消息处理
}
aa3000 2009-01-07
  • 打赏
  • 举报
回复
一楼正解,进来接分。
fenix124 2009-01-07
  • 打赏
  • 举报
回复
你没有写对应的oncommand函数
oyljerry 2009-01-07
  • 打赏
  • 举报
回复
自己添加响应事件

BOOL  CMySheet::OnCommand(WPARAM  wParam,  LPARAM  lParam)    
{
if (HIWORD) (wParam) == BN_CLICKED)
{
switch (LOWORD (wParam))
{
case IDOK:
PressButton (PSBTN_OK);
DestroyWindow ();
return (TRUE);
case ID_APPLY_NOW: // Apply
PressButton (PSBTN_APPLYNOW);
return (TRUE);
case IDCANCEL:
PressButton (PSBTN_CANCEL);
DestroyWindow ();
return (TRUE);
case IDHELP:
PressButton (PSBTN_HELP);
return (TRUE);
}
}
return CPropertySheet::OnCommand(wParam, lParam);
}


http://www.diybl.com/course/3_program/c++/cppsl/2008227/101895_2.html

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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