在C++ Builder 中怎样更改窗口的默认处理过程?

ljhsoft 2002-02-25 01:47:51
在更改窗口的默认处理过程中,使用GetWindowLong函数取得原有的窗口过程后用SetWindowsLong设置一个定义的窗口过程.在自定义的窗口过程中再用CallWindowPorc调用原用的窗口过程时,报错,CallWindowProc第一个参数的类型为WNDPROC,怎样进行类型转换,请教高手解决.
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
invalid 2002-02-27
  • 打赏
  • 举报
回复
背景图片啊,看看下面的代码。其实这个帖子有的,我都回复过的,在贴一遍吧。
// in header file...

FARPROC NewClientWP;
FARPROC OldClientWP;
void __fastcall MDIClientWndProc(TMessage &Msg);


//---------------------------------------------------------------------------





//---------------------------------------------------------------------------
// in source file...

// subclass the client window
__fastcall TMainForm::TMainForm(TComponent *Owner)
: TForm(Owner)
{
NewClientWP = (FARPROC)MakeObjectInstance(MDIClientWndProc);
OldClientWP = (FARPROC)SetWindowLong(ClientHandle, GWL_WNDPROC,
(LONG)NewClientWP);
}
//---------------------------------------------------------------------------

// implement a helper funtion to tile the image
void TileBlt(HDC HDestDC, int DestWidth, int DestHeight, HDC HSourceDC,
int SourceWidth, int SourceHeight)
{
for (int y = 0; y < DestHeight; y = y + SourceHeight)
{
for (int x = 0; x < DestWidth; x = x + SourceWidth)
{
::BitBlt(HDestDC, x, y,
SourceWidth, SourceHeight,
HSourceDC, 0, 0,
SRCCOPY);
}
}
}
//---------------------------------------------------------------------------

// in the subclass procedure, draw the image
void __fastcall TMainForm::MDIClientWndProc(TMessage &Msg)
{
switch (Msg.Msg)
{
// draw the image to the device context of the
// client window
case WM_ERASEBKGND:
{
HDC Hdc = (HDC)Msg.WParam;
SelectPalette(Hdc, Image1->Picture->Bitmap->Palette, true);
RealizePalette(Hdc);
TileBlt(Hdc, Width, Height,
Image1->Canvas->Handle,
Image1->Picture->Bitmap->Width,
Image1->Picture->Bitmap->Height);

Msg.Result = 0;
return;
}

// handle the palette changes
case WM_QUERYNEWPALETTE:
{
HDC Hdc = GetDC(ClientHandle);
SelectPalette(Hdc, Image1->Picture->Bitmap->Palette, true);
RealizePalette(Hdc);
InvalidateRect(ClientHandle, NULL, true);
ReleaseDC(ClientHandle, Hdc);

Msg.Result = 0;
return;
}
case WM_PALETTECHANGED:
{
if ((HWND)Msg.WParam != ClientHandle)
{
HDC Hdc = GetDC(ClientHandle);
SelectPalette(Hdc, Image1->Picture->Bitmap->Palette, true);
RealizePalette(Hdc);
UpdateColors(Hdc);
ReleaseDC(ClientHandle, Hdc);
}

Msg.Result = 0;
return;
}

// refresh the image upon scrolling
case WM_HSCROLL:
case WM_VSCROLL:
{
InvalidateRect(ClientHandle, NULL, true);
break;
}

// un-subclass the client window
case WM_DESTROY:
{
SetWindowLong(ClientHandle, GWL_WNDPROC, (LONG)OldClientWP);
FreeObjectInstance(NewClientWP);
}
}

// call the default window procedure
Msg.Result = CallWindowProc(OldClientWP, ClientHandle, Msg.Msg,
Msg.WParam, Msg.LParam);
}
ljhsoft 2002-02-25
  • 打赏
  • 举报
回复
WNDPROC是int (_stdcall(*))()类型,请教高手看不看得懂,我的程序已经通过编译了,但在运行时出错.我的主要功能是要实现MDI窗口的Client窗口显示背景图景图片,其它截取消息的方法我都试过了,而且用Delphi完全能够实现,请教高手还有什么好方法,还望赐教,谢谢.
wfu 2002-02-25
  • 打赏
  • 举报
回复
重载窗口过程.

并关注!
invalid 2002-02-25
  • 打赏
  • 举报
回复
WNDPROC估计是个函数指针类型。
invalid 2002-02-25
  • 打赏
  • 举报
回复
同意楼上的。窗体过程是虚拟方法,可以重载。
kingcaiyao 2002-02-25
  • 打赏
  • 举报
回复
改变默认的窗口过程可以直接重载窗口过程.

13,825

社区成员

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

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