SetWindowLong的用法一问。

dr80 2001-07-15 05:34:05

我想改变Edit1的窗口过程。

LRESULT TForm1::MyVcWinProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);//新的窗口过程函数的声明。
.........
.........
.........
OldProc=GetWindowLong(Edit1->Handle,GWL_WNDPROC);
SetWindowLong(Edit1->Handle,GWL_WNDPROC,MyVcWinProc);//这里编译通不过
//错误如下:应该是最后一个参数那里错了
[C++ Error] Unit1.cpp(106): E2034 Cannot convert 'long (* (_closure )(void *,unsigned int,unsigned int,long))(void *,unsigned int,unsigned int,long)' to 'long'
但是在VC和VB里这样用都是对的阿。MyVcWinProc这个函数名本来就是一个地址了,
为什么会错呢?
谢谢。
...全文
112 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wingsun 2001-07-23
  • 打赏
  • 举报
回复
是啊,结账了吧
xrbeck 2001-07-23
  • 打赏
  • 举报
回复
这个也该结帐了。。。呵呵。。
  • 打赏
  • 举报
回复
你把成员函数的指针和普通的函数指针搞混了。
xzgyb说的不错,可以把
LRESULT TForm1::MyVcWinProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);//新的窗口过程函数的声明。
申明成静态的 static
Sephil 2001-07-15
  • 打赏
  • 举报
回复
心情不好
进来看看
xzgyb 2001-07-15
  • 打赏
  • 举报
回复
回调函数好像应放在外面,如放在类里则默认加一this,不符合函数中的参数约定
或者在类里把它定义成静态函数
xrbeck 2001-07-15
  • 打赏
  • 举报
回复
WNDPROC oldproc=NULL;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// ShowMessage("OnClick!");
MessageBox(Handle,"Pro","Test",MB_OK);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{

oldproc=(WNDPROC)GetWindowLong(Button1->Handle,GWL_WNDPROC);
SetWindowLong(Button1->Handle,GWL_WNDPROC,(LONG)MyApp);

}
//---------------------------------------------------------------------------

LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
POINT MousePos;
//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);

switch(message)
{
case WM_LBUTTONDOWN:
if (GetCursorPos(&MousePos))
{
Form2->PopupMenuTest->PopupComponent = Form1;
Form2->PopupMenuTest->Popup(MousePos.x, MousePos.y);
}
//ShowMessage("haha");
break;

case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;

// return DefWindowProc(hwnd,message,wParam,lParam);
}
return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);

}
Wingsun 2001-07-15
  • 打赏
  • 举报
回复
这样写:
SetWindowLong(Edit1->Handle,GWL_WNDPROC,(long)MyVcWinProc);
因为这儿确实是需要一个long的参数,而你的MyVcWinProc不是一个long型的数据,所以你需要强制转换。
「已注销」 2001-07-15
  • 打赏
  • 举报
回复
我也想知道究竟

@_@

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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