紧急求助:VC++如何重写子控件某一特定消息(如:WM_PAINT)

来源:百度知道 编辑:UC知道 时间:2024/06/17 23:35:54
如题,VC++程序,运行于WINCE上。

我用标准控件Picture显示图片,因为WinCE不直接支持Gif,Jpg,Png等这样的图片,所以我要自己解码,然后画到Picture控件上,解码程序我已做好;

窗口是用DialogBox()函数从资源文件中创建的,创建时指定了一个窗口处理过程。
当有WM_PAINT消息后就会发到这个窗口处理过程处理。可是这是主窗口的WM_PAINT消息,而不是Picture控件的!

现在的问题是我怎么处理Picture的WM_PAINT消息,来执行我自己的绘制代码?

另外,还有二个问题:
1,Picture有自己有窗口处理过程吗?
2,麻烦大家给我介绍一下当子控件引发一个消息后,这个消息的流向是怎样的?

最后,麻烦大家看清题目,是用标准SDK的方法实现的,不是用MFC。也请不要粘贴无关代码!!

时间紧迫,多少分不是问题,麻烦大家给出代码或实现思路也可以,在下感激不心!!

下图是资源对话框,仅供参考!!

你解码Gif,Jpg,Png 等图像文件后,生成的应该是一个位图资源。既一个HBITMAP句柄,假设是hTheBmp;
这个Picture控件的句柄可以通过HWND hPictureWnd = ::GetDlgItem(hDlg,nIDImage); 得到,那么就可以这样操作来实现绘图。

HBITMAP hOldBmp = ::SendMessage(hPictureWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hTheBmp);
其中的宏 STM_SETIMAGE, IMAGE_BITMAP 如果wce环境中未定义,可以直接指定相应的数值。
::InvalidateRect(hPictureWnd, NULL,FALSE);

1.有自己的窗口过程,window下每个窗口都有自己的窗口过程。
2.子控件消息:如果是外部硬件(第三方实体...——很别扭的称号)引起的消息,比如鼠标、键盘消息,操作系统就生成一个消息控制块MSG结构,填充其hwnd,message,lparam,wparam等成员。(hwnd就是这个子控件,操作系统通过windowfrompoint函数得到)。然后搜索此窗口所在线程,然后将此消息压入这个线程的消息堆栈。接下来操作系统就不管了,等到时间片到了这个线程,此线程就搜索消息堆栈,对消息预处理,再dispatch分发到相应的窗口(也就是前面提到的hwnd)去处理。
这是常规的,win32程序的标准消息路由方式。对于mdi/sdi架构,基本遵循这个规则,但是实际消息路由非常复杂。mfc的对话框程序,就是这个消息路由。
消息又分很多种,上面说的就是标准的外部硬件触发消息的路由。对于用户主动发送的消息,比如::PostMessage(xxxx,),也是将消息压入窗口所在线程的消息堆栈,然后当前用户就不管了。::SendMessage(hwnd),比较特殊,他其实是一个函数调用,此函数直接调用hwnd窗口的消息处理函数,执行处理,然后再返回。关于消息方法的知识很复杂的。

上面的显示图像的方法如果不行,可以修改Picture窗口的消息处理过程来自己绘制,方法如下:
LO