如何实现类似VC属性表中的钉子按钮

1、新建一工程,基于对话框,采用默认设置。

2、添加一个新类,CSButton 基类CButton。

3、加入两副位图,分别表示钉子钉下和没有钉下时的状态。

4、向类中加入变量CBitmap bitmap,bitmap2,BOOL m_state 表示按钮的状态。CDC memdc;

5、重载函数PreSubclassWindow 已装入位图。

void CSButton::PreSubclassWindow()
{
  m_state=FALSE;
  bitmap.LoadBitmap(IDB_BITMAP1);
  bitmap2.LoadBitmap(IDB_BITMAP2);
  CDC *pDC=GetDC();
  memdc.CreateCompatibleDC(pDC);
  memdc.SelectObject(&bitmap);
  memdc2.CreateCompatibleDC(pDC);
  memdc2.SelectObject(&bitmap2);
  CButton::PreSubclassWindow();
} 

  6、重载DrawItem画出按钮

void CSButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  CRect client=lpDrawItemStruct->rcItem;
  CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
  DWORD state=lpDrawItemStruct->itemState;
  CBrush brush;
  brush.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
  pDC->FillRect(client,&brush);
  if(m_state)
  {
   pDC->StretchBlt(client.left,client.top,client.Width(),client.Height(),&memdc,0,0,24,21,SRCCOPY);
   GetParent()->SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  }
  else
  {
   pDC->StretchBlt(client.left,client.top,client.Width(),client.Height(),&memdc2,0,0,24,21,SRCCOPY);
   GetParent()->SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
  }
}

7、重载OnLButtonDown void CSButton::OnLButtonDown(UINT nFlags, CPoint point)
{
  m_state=!m_state;
  CButton::OnLButtonDown(nFlags, point);
} 

  其它实现细节请参见源代码。

时间: 2024-08-31 13:17:14

如何实现类似VC属性表中的钉子按钮的相关文章

逆向删除属性表中的字段

删除属性表中的字段一定要注意循环的方式.如果是for循环,i< FeatureClass.Fields.FieldCount话,每删除一个字段FieldCount属性返回的字段数量将减少一个,也就是你根本不能完全删除想要删除的字段:如果你先把FeatureClass.Fields.FieldCount赋给一个变量count,for循环中使用i<count,最后导致索引越界:所以,建议使用逆向的方法删除字段. IFeatureClass pointFS = GPClass.gpUtilities

向Excel工作表中添加按钮或命令按钮

  了解按钮和命令按钮 表单控件按钮和 ActiveX 控件命令按钮都称为按钮.您可以使用按钮或命令按钮自动执行以下操作:打印工作表.筛选数据或计算数字.通常,表单控件按钮和 ActiveX 控件命令按钮具有相似的外观和功能.但是,它们也确实存在着一些差异,以下各部分对这些差异进行了说明. 按钮(表单控件)命令按钮(ActiveX 控件) 添加按钮(表单控件) 1.如果"开发工具"选项卡未显示,请显示它. 2.在"开发工具"选项卡上的"控件"组中

通过对象属性表来增加系统的扩展性

在数据中设计时,通过对象属性表来增加系统的扩展性.如新闻系统中有新闻表t_news ,同时增加一个新闻 属性表t_news_prop, 这样新闻表的字段不能满足需求时,使用属性表就可以实现需求,只需要增加一条记 录到属性表中即可. 数据结构简单例子如下: t_news id  新闻IDtitle 新闻标题content 新闻内容addtime  时间 t_news_prop id  新闻IDpropName 属性名称propValue 属性值

vb.net 结构树sql表中自动编号在另一张表中怎么能同时更新

问题描述 vb.net 结构树sql表中自动编号在另一张表中怎么能同时更新 我在用VB.NET和SQL做treeview结构树 时 数据库中有两张表 一张是结构树表 一张是结构树数属性表 结构树表的编号是自动编号的 我怎么将结构树中的自动编号 放到另一张属性表中 解决方案 两张表肯定要有主外键关联的啊,通过联表查询可得 解决方案二: 在sql中设置级联更新或者用触发器

用户积分管理:除了用户积分记录表之外,每次积分变化后的新总积分是否更新到用户属性表?

问题描述 如果不更新到用户属性表,每次读取用户总积分的时候,都要查询积分记录表是否效率不高?如果每积分变化都更新到用户属性表,是否会因为同时操作两个表,效率不高?大家是如何解决的? 解决方案 解决方案二:这个是矛盾体,但通常为性能考虑,不应该使用计算列或者自定义函数,而应该直接更新.解决方案三:积分记录表,会记录每次积分的变化,及变化后的总积分关键是否把变化后的总积分更新到用户属性表解决方案四:更新到用户属性表中还是有必要的.可以在积分记录表中创建一个触发器,每次插入积分变化的数据时,更新用户属

方法-用SQL语句查询User表中newsh属性为“政治类新闻”和“娱乐类新闻”的人数放入MAP中

问题描述 用SQL语句查询User表中newsh属性为"政治类新闻"和"娱乐类新闻"的人数放入MAP中 用SQL语句查询User表中newsh属性为"政治类新闻"和"娱乐类新闻"的人数放入MAP中问题一:整个方法该如何实现问题二:SQL语句怎么写 参考用例 类似这样的方法 新手不知道该怎么改动成自己需要的方法求助各位大神 public Map<String Long> totalInventory(int year

项目开发中对使用的第三方库统一进行管理__添加属性表/页

最近接手的一个项目开发中用到了很多第三方库,比如boost.gdal.xerces等等这些.从接手项目到现在从中学习到了很多之前从未见识过的东西.项目绝大部分都是前辈们写的,对于里面的对第三方库的管理我感觉是很不错的,所以记录下来以备后用,好的东西同时也应该分享给更多的可能会用到的... 项目开发中,如果遇到不是自己开发的项目时,当需要另外的人去维护时,经常连正常的编译连接都不能通过,很多的都是需要设置一些工程属性什么的,搞了半天最终才能编译通过.像这些类似的体力活可能是大多数人不愿弄的. 这里

实现类似VC中可设断点的编辑窗口

运行效果图如下: 想做一个跟踪调试工具,于是到网上找类似VC可设置断点的EditView,可惜没找到(呵呵,俺E文不好,没去国外站点找).那就自己做一个吧!! 唉!!为了这个小东西俺可是走了不少弯路!! 还好,今天终于做好了,拿出来与大家分享. 1.创建一个工程------俺不多说了,记住要选CeditView. 2.在OnInitialUpdate()中设置EDIT的Margin,当然留出的空间用来画断点或行号等.并得到行高. SIZE size; GetTextExtentPoint(Get

代码-java .选择下拉框中选择的属性,点击查询按钮,在表中显示

问题描述 java .选择下拉框中选择的属性,点击查询按钮,在表中显示 例如下面的下拉框: <td class="std_1"> 抵押类型 </td> <td class="std_2"> <select style="width:150px" name="isDy" id="s1"> <tion value="0">--请选择