[sourceforge.net代码循礼] wxwindows 源代码追踪-ToolBar的disable按钮

yjh1982 2004-11-19 01:42:40
加精
到现在还没人响应我的活动.只好自己开个头了...

wxwindows(http://sourceforge.net/projects/wxwindows)也叫wxWidgets
是一个跨平台的程序框架库;很类似MFC.

现要求参与者追踪关于ToolBar(工具栏)的相关代码.给出
ToolBar中的按钮(其实是一个位图)如何变成灰白外观(disable)的相关代码.


http://sourceforge.net/projects/wxwindows上下载库代码.用VC的下载wxMSW
就够了.用其它开发工具的下wxAll.

编译好库后,然后在samples\toolbar下编译toolbar例子.toobar程序就是你的
追踪起点.



第一个正确解答者至少得分100.积极参与者也有分.
为了尽量公平竞争,照顾没用过wxwindows的人,请大家在本周末早晨八点才开始贴答案.
...全文
473 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
pomelowu 2005-01-28
  • 打赏
  • 举报
回复
mark一下
pomelowu 2005-01-28
  • 打赏
  • 举报
回复
mark一下
yjh1982 2005-01-28
  • 打赏
  • 举报
回复
楼上的,你是怎么看到的?
我在已结贴和精华区都看不到这个贴!郁闷死了
yjh1982 2005-01-28
  • 打赏
  • 举报
回复
楼上的,你是怎么看到的
我怎么在已结贴和精华区都看不到这个贴!
yjh1982 2005-01-06
  • 打赏
  • 举报
回复
已结贴的地方看不到,干脆转到精华,哼哼!
yjh1982 2004-12-28
  • 打赏
  • 举报
回复
寒~好象出问题了.诸位都得到了分吧?
progray 2004-12-27
  • 打赏
  • 举报
回复
还好,结帖前mark一下
实在不懂,郁闷,帮楼主顶一下。
yjh1982 2004-12-25
  • 打赏
  • 举报
回复
总算有人回答了,热泪盈眶中..........下周结贴
FireEmissary 2004-12-24
  • 打赏
  • 举报
回复
我来!


在toolbar例程中通常可以通过一个菜单diable一个按钮.
跟踪它的事件:

比如我跟踪打印按钮的diable处理
IDM_TOOLBAR_ENABLEPRINT
-->
EVT_MENU(IDM_TOOLBAR_ENABLEPRINT, MyFrame::OnEnablePrint)
-->
DoEnablePrint
-->
{
if ( !m_nPrint )
return;

wxToolBarBase *tb = GetToolBar();
tb->EnableTool(wxID_PRINT, !tb->GetToolEnabled(wxID_PRINT));
}
-->
wxToolBarBase::EnableTool
-->
wxToolBarBase::DoEnableTool


在这里出现分枝:
win32下使用了ms的api管理toolbar:
void wxToolBar::DoEnableTool(wxToolBarToolBase *tool, bool enable)
{
::SendMessage(GetHwnd(), TB_ENABLEBUTTON,
(WPARAM)tool->GetId(), (LPARAM)MAKELONG(enable, 0));
}
wince下也差不多:
void wxToolBar::DoEnableTool(wxToolBarToolBase *tool, bool enable)
{
::SendMessage(GetHwnd(), TB_ENABLEBUTTON,
(WPARAM)tool->GetId(), (LPARAM)MAKELONG(enable, 0));
}
x windows下是自己画:
void wxToolBar::DoEnableTool(wxToolBarToolBase *tool, bool enable)
{
// created disabled-state bitmap on demand
if ( !enable && !tool->GetDisabledBitmap().Ok() )
{
wxImage image( tool->GetNormalBitmap().ConvertToImage() );

// TODO: don't hardcode 180
unsigned char bg_red = 180;
unsigned char bg_green = 180;
unsigned char bg_blue = 180;

unsigned char mask_red = image.GetMaskRed();
unsigned char mask_green = image.GetMaskGreen();
unsigned char mask_blue = image.GetMaskBlue();

bool has_mask = image.HasMask();

int x,y;
for (y = 0; y < image.GetHeight(); y++)
{
for (x = 0; x < image.GetWidth(); x++)
{
unsigned char red = image.GetRed(x,y);
unsigned char green = image.GetGreen(x,y);
unsigned char blue = image.GetBlue(x,y);
if (!has_mask || red != mask_red || green != mask_green || blue != mask_blue)
{
red = (((wxInt32) red - bg_red) >> 1) + bg_red;
green = (((wxInt32) green - bg_green) >> 1) + bg_green;
blue = (((wxInt32) blue - bg_blue) >> 1) + bg_blue;
image.SetRGB( x, y, red, green, blue );
}
}
}

for (y = 0; y < image.GetHeight(); y++)
{
for (x = y % 2; x < image.GetWidth(); x += 2)
{
unsigned char red = image.GetRed(x,y);
unsigned char green = image.GetGreen(x,y);
unsigned char blue = image.GetBlue(x,y);
if (!has_mask || red != mask_red || green != mask_green || blue != mask_blue)
{
red = (((wxInt32) red - bg_red) >> 1) + bg_red;
green = (((wxInt32) green - bg_green) >> 1) + bg_green;
blue = (((wxInt32) blue - bg_blue) >> 1) + bg_blue;
image.SetRGB( x, y, red, green, blue );
}
}
}

tool->SetDisabledBitmap(image);
}

RefreshTool(tool);
}
也就是建立一个diable bitmap.这样在toolbar的绘制代码(DoDraw)中,如果该按钮是
diable的.就会用这个bitmap来画.
大家在src\univ\toolbar.cpp中可以学到bitmap的灰度算法了:)





基于wxWidgets-2.5.3
Wolf0403 2004-11-28
  • 打赏
  • 举报
回复
如果没有 VC,做代码追踪就比较……呵呵。
动态追踪比 SI 静态追踪方便很多呢。
kaphoon 2004-11-27
  • 打赏
  • 举报
回复
支持啊
好斑竹!
sharkhuang 2004-11-25
  • 打赏
  • 举报
回复
learning
aa1298 2004-11-25
  • 打赏
  • 举报
回复
不懂.但支持一下
aa1298 2004-11-25
  • 打赏
  • 举报
回复
关注一下
lazyboya 2004-11-25
  • 打赏
  • 举报
回复
请问各位高手这个东东要怎么和VC结合使用啊.
lazyboya 2004-11-24
  • 打赏
  • 举报
回复
不太懂学习一下.
vt 2004-11-24
  • 打赏
  • 举报
回复
不错
不过我想给大家一些怎么样应用的文章会好一些
如果用都不会用就去看代码,也没有什么好处

现在普及wxwidgets的文章还是很少的,中文的,english的就不说了
pacman2000 2004-11-24
  • 打赏
  • 举报
回复
不大懂这个。。。我还没进化到GUI呢。
yjh1982 2004-11-24
  • 打赏
  • 举报
回复
看过<<深入浅出MFC>>的看wxwidgets的代码也不会很难.
其实用起来差不多啦.这里也只是个简单的代码追踪,主要为了让大家加深一点理解.

顺便提一下,在vc下看wxwidgets自带的sample工程看不到相应的类是因为
没加进.h头文件.
手工加入以后看代码就方便多了
FireEmissary 2004-11-23
  • 打赏
  • 举报
回复
mark
加载更多回复(10)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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