这段代码怎么总是报错

addition 2003-06-02 09:59:09
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'“ 什么意思?
...全文
68 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
addition 2003-06-04
  • 打赏
  • 举报
回复
还有想最後问一句:

在SubClassButton函数第一句添加
#undef SubclassWindow“

起到一个什么作用?难道移植到single document时候
编译器去找到宏,然后用这句,叫他不要去找了,这样就和
原来dialog时候用的是一个SubclassWindow????

不管又没有回答,最晚明天结贴!
addition 2003-06-04
  • 打赏
  • 举报
回复
成功了,
关键是:
在SubClassButton函数第一句添加
#undef SubclassWindow

特别谢谢escout!
escout 2003-06-03
  • 打赏
  • 举报
回复
你把代码放在CMainFrame里是不行的。因为CMainFrame主要负责框架,如菜单、非客户区等,所以对话框模板里的控件并不是CMainFrame的子窗口,你这样是不可能枚举到你想要的这些控件的。
我想你把所有这些代码都放在CTestFormView里,hwnd就取CTestFormView的m_hWnd应该可以。你说的编译错误可以试试在SubClassButton函数第一句添加
#undef SubclassWindow
escout 2003-06-03
  • 打赏
  • 举报
回复
先关联,然后自己修改为cskinbutton。我就是这样做的,很多书也是这样做的。有很多时候需要自己修改ClassWizard产生的代码,比如自己的消息映射,比如要从CBitmapButton派生一个类,一般的做法是先用ClassWizard从CButton派生,然后手动把他改为CBitmapButton,还有就是这种情况。
addition 2003-06-03
  • 打赏
  • 举报
回复
“只要用class wizard把m_btnres这个控件和一个cskinbutton的对象连接起来就可以了“

用class Wizard好像值可以把IDC_Button1这样的关联到一个CButton上面,难道先关联,然后自己修改为cskinbutton。

还有,如果不用这样方法,应该把line 251改为
btn->SubclassDlgItem(IDC_BUTTON1,btn);
就可以吧,
但是好像还是没有任何效果,就是没有任何编译错误而已。
addition 2003-06-03
  • 打赏
  • 举报
回复
我以前是基于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
有讲解,并且有下载源吗连结。

很感谢你耐心回答我的问题,其实我觉得我这样问真是叫别人头晕。呵呵。
addition 2003-06-03
  • 打赏
  • 举报
回复
1。m_btnres不是一个button的ID
2。是用对话框模板创建的。


你的意思我好像明白了,谢谢了,我试试看。

我的目的是用一个回调函数遍历对话框上的所有button,
确实如你所猜测,是想给所有button"运行时动态换肤"
escout 2003-06-03
  • 打赏
  • 举报
回复
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了。
addition 2003-06-02
  • 打赏
  • 举报
回复
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.

这个好像不懂
addition 2003-06-02
  • 打赏
  • 举报
回复
这么说,两个函数
BOOL CSkinTestDlg::SubClassButton( HWND hwnd )
BOOL CMainFrame::SubClassButton( HWND hwnd )
中相同的语句
btn->SubclassWindow(hwnd);
其实调用的是不同的地方的SubclassWindow(); ?
不然怎么会一个地方编译成功,另外一个地方有警告,
不过就算这个地方解决,后面还有两个error还是没有解决,为什么从
dialog--->single document(formView)就会产生这个问题?
escout 2003-06-02
  • 打赏
  • 举报
回复
也就是说,问题出在你在CSkinButton没有重载SubclassWindow函数。
还有,试试用CWnd::SubclassDlgItem
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );

将251、252行改为
SubclassDlgItem(m_btnres,btn);


escout 2003-06-02
  • 打赏
  • 举报
回复
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

addition 2003-06-02
  • 打赏
  • 举报
回复
纠正:
“如果是dialog的话,我传的是dialog的hwnd“
我是一个回调函数调用SubClassButton( HWND hwnd )
这个hwnd应该是dialog上的控件的句柄,比如一个button的hwnd
addition 2003-06-02
  • 打赏
  • 举报
回复
控件和一个类关联起来?
哪个控件和哪个类呢?


那么btn->SubclassWindow(hwnd);
是btn这个控件了,hwnd有什么用,我传的是mainFrame的hwnd.
如果是dialog的话,我传的是dialog的hwnd
lshadow 2003-06-02
  • 打赏
  • 举报
回复
SubclassWindow
子类化,将你的控件和一个类关联起来
addition 2003-06-02
  • 打赏
  • 举报
回复
如果是基于dialog的,下面是定义
class CSkinTestDlg : public CDialog
{。。。}


BOOL CSkinTestDlg::SubClassButton( HWND hwnd )
就没有任何问题,
而一旦改为
BOOL CMainFrame::SubClassButton( HWND hwnd )
怎么就编译通不过???

还有,SubclassWindow到底是做什么的呢?
tj_aj 2003-06-02
  • 打赏
  • 举报
回复
CWnd::SubclassWindow
BOOL SubclassWindow( HWND hWnd );

Return Value

Nonzero if the function is successful; otherwise 0.

Parameters

hWnd

A handle to the window.
tj_aj 2003-06-02
  • 打赏
  • 举报
回复
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.
addition 2003-06-02
  • 打赏
  • 举报
回复
CSkinButton是这样写的:
class CSkinButton : public CButton
{
DECLARE_DYNAMIC(CSkinButton)
。。。。。。。。
}

他怎么说
'btn' : is not a member of 'CSkinButton' ???
但是放在基于dialog的CMyDialog中又没有任何问题!

16,470

社区成员

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

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

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