CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

这段代码怎么总是报错

楼主addition()2003-06-02 21:59:09 在 VC/MFC / 基础类 提问

BOOL   CMainFrame::SubClassButton(   HWND   hwnd   )  
  {  
  CSkinButton   *   btn   =   new   CSkinButton();  
  CWnd*   pWnd   =   CWnd::FromHandlePermanent(hwnd);  
  if   (   pWnd   ==   NULL)  
  {  
  btn->SubclassWindow(hwnd);         //Line   251  
  btn->SetResource(&m_btnres);  
   
  return   TRUE;  
  }  
  return   FALSE;  
  }  
   
   
  \MainFrm.cpp(251)   :   warning   C4003:   not   enough   actual   parameters   for   macro   'SubclassWindow'  
  \MainFrm.cpp(251)   :   error   C2059:   syntax   error   :   '('  
  \MainFrm.cpp(252)   :   error   C2039:   'btn'   :   is   not   a   member   of   'CSkinButton'  
                  e:\project\themesong\skincomm\skinbutton.h(37)   :   see   declaration   of   'CSkinButton'  
  Error   executing   cl.exe.  
   
   
  说明:  
  1。CSkinButton继承自CButton,没有重载SubclassWindow函数  
  2。完全相同的代码放在基于dialog的程序中,写在CTestDlg中就没有任何问题  
  但是转移到single   Document(use   FormView)上这段代码不管放在CMainFram还是  
  CTestFormView中都是报这两个错。本来可能会运行出错,但是编译出错就说不过去了,这里难道与是不是dialog有关?  
  3。btn->SubclassWindow(hwnd);         //Line   251  
  这句话改为btn->SubclassWindow(this,hwnd);   就不会报警告,奇怪,为什么要多加一个参数?而且这个警告说“for   macro   'SubclassWindow'“   什么意思?  
  问题点数:100、回复次数:19Top

1 楼addition()回复于 2003-06-02 22:01:44 得分 0

CSkinButton是这样写的:  
  class   CSkinButton   :   public   CButton  
  {  
  DECLARE_DYNAMIC(CSkinButton)  
    。。。。。。。。  
  }  
   
  他怎么说  
  'btn'   :   is   not   a   member   of   'CSkinButton'                   ???  
  但是放在基于dialog的CMyDialog中又没有任何问题!Top

2 楼tj_aj()回复于 2003-06-02 22:08:54 得分 7

SubclassWindow:  
  Call   this   member   function   to   "dynamically   subclass"   a   window   and   attach   it   to   this   CWnd   object.   When   a   window   is   dynamically   subclassed,   windows   messages   will   route   through   the   CWnd’s   message   map   and   call   message   handlers   in   the   CWnd’s   class   first.   Messages   that   are   passed   to   the   base   class   will   be   passed   to   the   default   message   handler   in   the   window.  
   
  This   member   function   attaches   the   Windows   control   to   a   CWnd   object   and   replaces   the   window’s   WndProc   and   AfxWndProc   functions.   The   function   stores   a   pointer   to   the   old   WndProc   in   the   CWnd   object.  
  Top

3 楼tj_aj()回复于 2003-06-02 22:09:29 得分 7

CWnd::SubclassWindow  
  BOOL   SubclassWindow(   HWND   hWnd   );  
   
  Return   Value  
   
  Nonzero   if   the   function   is   successful;   otherwise   0.  
   
  Parameters  
   
  hWnd  
   
  A   handle   to   the   window.  
  Top

4 楼addition()回复于 2003-06-02 22:18:24 得分 0

如果是基于dialog的,下面是定义  
  class   CSkinTestDlg   :   public   CDialog  
  {。。。}  
   
  用  
  BOOL   CSkinTestDlg::SubClassButton(   HWND   hwnd   )  
  就没有任何问题,  
  而一旦改为  
  BOOL   CMainFrame::SubClassButton(   HWND   hwnd   )  
  怎么就编译通不过???  
   
  还有,SubclassWindow到底是做什么的呢?Top

5 楼lshadow(没车没房努力中。。。)回复于 2003-06-02 22:52:39 得分 7

SubclassWindow  
  子类化,将你的控件和一个类关联起来Top

6 楼addition()回复于 2003-06-02 23:03:34 得分 0

控件和一个类关联起来?  
  哪个控件和哪个类呢?  
   
   
  那么btn->SubclassWindow(hwnd);      
  是btn这个控件了,hwnd有什么用,我传的是mainFrame的hwnd.  
  如果是dialog的话,我传的是dialog的hwndTop

7 楼addition()回复于 2003-06-02 23:06:30 得分 0

纠正:  
  “如果是dialog的话,我传的是dialog的hwnd“  
  我是一个回调函数调用SubClassButton(   HWND   hwnd   )  
  这个hwnd应该是dialog上的控件的句柄,比如一个button的hwndTop

8 楼escout(侦察兵)回复于 2003-06-02 23:07:29 得分 79

CAUSE  
  The   Windowsx.h   file   is   a   header   that   includes   message   cracker   macros   to   help   programmers   write   more   portable   Windows-based   applications.   The   header   file   contains   a   preprocessor   macro   named   SubclassWindow.   The   macro   bears   the   same   name   as   the   CWnd::SubclassWindow()   member   function.   The   macro   has   two   parameters;   the   member   function   has   only   one   parameter.   The   preprocessor   tries   to   expand   the   symbol   SubclassWindow   when   it   is   found.    
   
   
   
  RESOLUTION  
  You   can   un-define   the   macro   as   follows:    
   
   
        #undef   SubclassWindow  
   
  Top

9 楼escout(侦察兵)回复于 2003-06-02 23:22:22 得分 0

也就是说,问题出在你在CSkinButton没有重载SubclassWindow函数。  
  还有,试试用CWnd::SubclassDlgItem  
  BOOL   SubclassDlgItem(   UINT   nID,   CWnd*   pParent   );  
   
  将251、252行改为  
  SubclassDlgItem(m_btnres,btn);  
   
   
  Top

10 楼addition()回复于 2003-06-02 23:23:05 得分 0

这么说,两个函数  
  BOOL   CSkinTestDlg::SubClassButton(   HWND   hwnd   )  
  BOOL   CMainFrame::SubClassButton(   HWND   hwnd   )  
  中相同的语句  
  btn->SubclassWindow(hwnd);    
  其实调用的是不同的地方的SubclassWindow();   ?  
  不然怎么会一个地方编译成功,另外一个地方有警告,  
  不过就算这个地方解决,后面还有两个error还是没有解决,为什么从  
  dialog--->single   document(formView)就会产生这个问题?Top

11 楼addition()回复于 2003-06-02 23:36:29 得分 0

SubclassDlgItem具体是什么意思?  
  Call   this   member   function   to   “dynamically   subclass”   a   control   created   from   a   dialog   template   and   attach   it   to   this   CWnd   object.   When   a   control   is   dynamically   subclassed,   windows   messages   will   route   through   the   CWnd’s   message   map   and   call   message   handlers   in   the   CWnd’s   class   first.   Messages   that   are   passed   to   the   base   class   will   be   passed   to   the   default   message   handler   in   the   control.  
   
  这个好像不懂Top

12 楼escout(侦察兵)回复于 2003-06-03 18:34:29 得分 0

SubclassDlgItem   运行时动态子类化一个控件。我想你应该是在做运行时动态换肤的功能。这个函数就是在运行时把一个控件子类化成btn所代表的类来管理,这样相关的消息都会发给btn这个对象,比如WM_PAINT消息,这样你就可以在这些消息的响应函数中定制自己想要的界面了。  
          为什么从dialog--->single   document(formView)就会产生这个问题?我也不是很清楚。不过我感觉可能是hwnd的问题。subclasswindow是把hwnd所代表的窗体子类化,你传递CMainFrame的hwnd应该是不行的,而应该是你说想子类化的窗体的hwnd,比如说一个button的hwnd。  
          有一个问题,你的m_btnres是一个button的ID吗?你的这些控件是动态创建的呢还是用对话框模板创建的。如果你是用对话框模板创建的,其实只要用class   wizard把m_btnres这个控件和一个cskinbutton的对象连接起来就可以了,这样所有的消息就会先发到cskinbutton,这样你就不用subclsswindow和subclassdlgitem了。Top

13 楼addition()回复于 2003-06-03 21:26:51 得分 0

1。m_btnres不是一个button的ID  
  2。是用对话框模板创建的。  
   
   
  你的意思我好像明白了,谢谢了,我试试看。  
   
  我的目的是用一个回调函数遍历对话框上的所有button,  
  确实如你所猜测,是想给所有button"运行时动态换肤"Top

14 楼addition()回复于 2003-06-03 21:32:53 得分 0

我以前是基于dialog的,没有任何问题,当然这些代码是copy别人的,  
  现在想移植到基于single   document(FormView)。  
  然后就出现这些问题。  
  为此我还有另外一个贴子问相关的问题,见(怎么取到FormView类的对话框资源?)  
  http://expert.csdn.net/Expert/topic/1862/1862710.xml?temp=.7848627  
   
  还有,原来基于dialog的代码可以到一下地址看看:  
  http://www.vckbase.com/document/viewdoc.asp?id=529  
  有讲解,并且有下载源吗连结。  
   
  很感谢你耐心回答我的问题,其实我觉得我这样问真是叫别人头晕。呵呵。Top

15 楼addition()回复于 2003-06-03 21:47:19 得分 0

“只要用class   wizard把m_btnres这个控件和一个cskinbutton的对象连接起来就可以了“  
   
  用class   Wizard好像值可以把IDC_Button1这样的关联到一个CButton上面,难道先关联,然后自己修改为cskinbutton。  
   
  还有,如果不用这样方法,应该把line   251改为  
  btn->SubclassDlgItem(IDC_BUTTON1,btn);  
  就可以吧,  
  但是好像还是没有任何效果,就是没有任何编译错误而已。Top

16 楼escout(侦察兵)回复于 2003-06-03 23:15:55 得分 0

先关联,然后自己修改为cskinbutton。我就是这样做的,很多书也是这样做的。有很多时候需要自己修改ClassWizard产生的代码,比如自己的消息映射,比如要从CBitmapButton派生一个类,一般的做法是先用ClassWizard从CButton派生,然后手动把他改为CBitmapButton,还有就是这种情况。  
  Top

17 楼escout(侦察兵)回复于 2003-06-03 23:53:48 得分 0

你把代码放在CMainFrame里是不行的。因为CMainFrame主要负责框架,如菜单、非客户区等,所以对话框模板里的控件并不是CMainFrame的子窗口,你这样是不可能枚举到你想要的这些控件的。  
        我想你把所有这些代码都放在CTestFormView里,hwnd就取CTestFormView的m_hWnd应该可以。你说的编译错误可以试试在SubClassButton函数第一句添加  
  #undef   SubclassWindowTop

18 楼addition()回复于 2003-06-04 22:15:41 得分 0

成功了,  
  关键是:  
  在SubClassButton函数第一句添加  
  #undef   SubclassWindow  
   
  特别谢谢escout!Top

19 楼addition()回复于 2003-06-04 22:23:57 得分 0

还有想最後问一句:  
  “  
  在SubClassButton函数第一句添加  
  #undef   SubclassWindow“  
   
  起到一个什么作用?难道移植到single   document时候  
  编译器去找到宏,然后用这句,叫他不要去找了,这样就和  
  原来dialog时候用的是一个SubclassWindow????  
   
  不管又没有回答,最晚明天结贴!Top

相关问题

  • 一段简单代码总是报错,苦闷中~~~
  • 请问这段代码在编译是怎么总是报错呢??
  • 这段代码居然会报错?
  • 一段很简单的 ASP 代码,可总是报错,大家帮忙看一看
  • 为什么这段代码运行时总会报错
  • 关于一段HTML代码报错的问题
  • 一段简单的代码报错!!!进者有分
  • 急!!!大家帮我看看这几行代码,为什么总是报错?
  • lookup字段总是报错,如何改
  • 为什么我这段代码加上了md5函数牢是报错

关键词

  • 代码
  • 函数
  • 控件
  • 模板
  • 消息
  • 修改
  • cskinbutton
  • subclasswindow
  • btnres
  • subclassbutton

得分解答快速导航

  • 帖主:addition
  • tj_aj
  • tj_aj
  • lshadow
  • escout

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo