动态创建CbitmapButton的问题

kelekeleyu 2010-11-29 01:25:32
我遇到了一个动态创建CbitmapButton的问题

在本程序的窗口中创建CbitmapButton窗口,显示出来了
//--------------------------------------
pBtnhere = new CBitmapButton;
CRect rBtn(50,100,100,150);
pBtnhere->Create(_T("on other Window"),BS_PUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW, rBtn, this, 8002);
if(!pBtnhere->LoadBitmaps(_T("NameChang_U"), _T("NameChang_D"),NULL, _T("NameChang_X")))
{
TRACE0("Failed to load bitmaps for buttons\n");
AfxThrowResourceException();
}
pBtnhere->SizeToContent();
//--------------------------------------

但是在其他程序的窗口中创建CbitmapButton窗口,显示不出来,只显示出灰色的痕迹
//--------------------------------------
CWnd *pOtherWnd = CWnd::FindWindow(NULL, _T("OtherWnd "));
pBtnthere = new CBitmapButton;
pBtnthere->Create(_T("on other Window"),BS_PUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW, rBtn, pOtherWnd , 8002);
if(!pBtnthere->LoadBitmaps(_T("NameChang_U"), _T("NameChang_D"),NULL, _T("NameChang_X")))
{
TRACE0("Failed to load bitmaps for buttons\n");
AfxThrowResourceException();
}
pBtnthere->SizeToContent();
//--------------------------------------

如过不是有位图的时候,只显示文字的话,现实的挺好的,就是一有位图就不行了
难道是位图资源搞不到其他程序上去?

请解释解释
...全文
311 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kelekeleyu 2010-11-30
  • 打赏
  • 举报
回复
太感谢了,拜读
对了,顺便问一句
>如果是注入DLL的话就不用改,直接在DLL里面FindWindow后LoadImage
wince中注入DLL的方法可以实行吗?
coolthanice 2010-11-30
  • 打赏
  • 举报
回复
你在创建按钮的时候,按钮的风格可能设置不对
m_btnCard[i].Create(_T(""),WS_VISIBLE|BS_OWNERDRAW | BS_BITMAP | WS_TABSTOP,CRect(25+remainer*100,25+result*100 ,80+remainer*100,90+result*100),this,10001+i);
注意在风格中有BS_BITMAP 这一项,否则是不会有图片显示的。
给你一个实例你可以看看
http://download.csdn.net/source/2824474


visualwind 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 kelekeleyu 的回复:]

OtherWnd程序需要改吗
[/Quote]

如果是注入DLL的话就不用改,直接在DLL里面FindWindow后LoadImage
也可以把OtherWnd程序改成响应自定义消息,在响应里面创建按钮和LoadImage
kelekeleyu 2010-11-30
  • 打赏
  • 举报
回复
OtherWnd程序需要改吗
向立天 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kelekeleyu 的回复:]
按照你的解释,
是无法使用CBitmapButton的方案是无法实现的了吧?
[/Quote]除非做一个dll注入
kelekeleyu 2010-11-30
  • 打赏
  • 举报
回复
按照你的解释,
是无法使用CBitmapButton的方案是无法实现的了吧?
visualwind 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kelekeleyu 的回复:]

>跟这个应该没关系,绘制都是用DrawItem
>就是上面说的BITMAP句柄不能跨进程。因为要贴的位图是从BITMAP句柄来的,也就是pBtnthere->LoadBitmaps
>的时候其实是生成了一个BITMAP句柄,这个句柄不能垮进程。

我不理解的就是这个跨进程
按钮不是只是画在OtherWnd程序窗口上吗
我一旦关掉创建程序,按钮会消失的,这么说,按钮不是还应该属于创建程……
[/Quote]

你的pBtnthere->LoadBitmaps装载的图片是在你的本进程中吧,要创建的按钮在另一个进程的窗口中吧,图片数据就相当于在你的本进程中的内存中,别的进程是不能直接访问其他进程内存数据的。
向立天 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kelekeleyu 的回复:]
>跟这个应该没关系,绘制都是用DrawItem
>就是上面说的BITMAP句柄不能跨进程。因为要贴的位图是从BITMAP句柄来的,也就是pBtnthere->LoadBitmaps
>的时候其实是生成了一个BITMAP句柄,这个句柄不能垮进程。

我不理解的就是这个跨进程
按钮不是只是画在OtherWnd程序窗口上吗
我一旦关掉创建程序,按钮会消失的,这么说,按钮不是还应该属于创建程序……
[/Quote]
不是的
按钮属于另外一个程序的进程
只是你可以在你的进程里控制
但是进程间的数据是不能随便共享的
你虽然可以通过一种方式让另一个程序创建按钮
却不能让它调用你这面的位图数据
kelekeleyu 2010-11-30
  • 打赏
  • 举报
回复
>跟这个应该没关系,绘制都是用DrawItem
>就是上面说的BITMAP句柄不能跨进程。因为要贴的位图是从BITMAP句柄来的,也就是pBtnthere->LoadBitmaps
>的时候其实是生成了一个BITMAP句柄,这个句柄不能垮进程。

我不理解的就是这个跨进程
按钮不是只是画在OtherWnd程序窗口上吗
我一旦关掉创建程序,按钮会消失的,这么说,按钮不是还应该属于创建程序的进程吗。

请解释一个这个“跨进程”是怎么跨进程的,非常感谢。
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kelekeleyu 的回复:]
还是不太理解

我刚才跟踪了一下代码
大概是这个样子的
在完成上面的操作之后
在本程序窗口绘制按钮时是下面的流程
CButton::OnChildNotify -> CWnd::OnDrawItem -> CBitmapButton::DrawItem

在OtherWnd程序窗口绘制按钮时是直接进入
CWnd::OnDrawItem

请问,是这个原因吗?
[/Quote]

跟这个应该没关系,绘制都是用DrawItem
就是上面说的BITMAP句柄不能跨进程。因为要贴的位图是从BITMAP句柄来的,也就是pBtnthere->LoadBitmaps的时候其实是生成了一个BITMAP句柄,这个句柄不能垮进程。
kelekeleyu 2010-11-29
  • 打赏
  • 举报
回复
还是不太理解

我刚才跟踪了一下代码
大概是这个样子的
在完成上面的操作之后
在本程序窗口绘制按钮时是下面的流程
CButton::OnChildNotify -> CWnd::OnDrawItem -> CBitmapButton::DrawItem

在OtherWnd程序窗口绘制按钮时是直接进入
CWnd::OnDrawItem

请问,是这个原因吗?
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kelekeleyu 的回复:]

看不懂
[/Quote]

晕。。。
就是说任何进程都可以发消息给目标进程,然后目标进程响应消息后进程创建的操作。。。
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kelekeleyu 的回复:]

用Spy++看了一下,
动态创建的按钮就是在创建它的窗口的进程中的

当我关掉创建它的窗口,OtherWnd上的动态创建按钮也会消失
[/Quote]

具体创建的操作当然得在自己进程中创建了,但是发创建的消息可能来自任何进程。
kelekeleyu 2010-11-29
  • 打赏
  • 举报
回复
用Spy++看了一下,
动态创建的按钮就是在创建它的窗口的进程中的

当我关掉创建它的窗口,OtherWnd上的动态创建按钮也会消失
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kelekeleyu 的回复:]

>就是图形数据过不去。
>创建按钮实际最终是通过API创建的,但是图片数据是过不去的。
不理解
[/Quote]

因为给按钮添加图片,最终是通过发消息BM_SETIMAGE实现的,而发这个消息需要给lParam传BITMAP句柄,而这个句柄只能在同一个进程内有效,跨进程是无效的。
kelekeleyu 2010-11-29
  • 打赏
  • 举报
回复
>就是图形数据过不去。
>创建按钮实际最终是通过API创建的,但是图片数据是过不去的。
不理解
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kelekeleyu 的回复:]

不是吧
大小已经过去了
我用Spy++取得了一下OtherWnd上的那个动态创建的按钮,大小和本程序的窗口中创建的按钮的大小一致

似乎只有图形没有穿过去的
[/Quote]

就是图形数据过不去。
创建按钮实际最终是通过API创建的,但是图片数据是过不去的。
kelekeleyu 2010-11-29
  • 打赏
  • 举报
回复
不是吧
大小已经过去了
我用Spy++取得了一下OtherWnd上的那个动态创建的按钮,大小和本程序的窗口中创建的按钮的大小一致

似乎只有图形没有穿过去的
visualwind 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 kelekeleyu 的回复:]
我遇到了一个动态创建CbitmapButton的问题

在本程序的窗口中创建CbitmapButton窗口,显示出来了
//--------------------------------------
pBtnhere = new CBitmapButton;
CRect rBtn(50,100,100,150);
pBtnhere->Create(_T("on other Wind……
[/Quote]

这个跨进程应该是不行的,因为创建的CBitmapButton只能在本进程有效。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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