MFC之ListCtrl动态添加按钮
先上效果图:


图中用了一个CListCtrl插件,隐藏了网格线(LVS_EX_GRIDLINES)。
添加了“删除”按钮(按钮上贴了图片),选中哪一行则显示在哪一行。
有两种方式创建按钮,一种是直接根据行数(比如n行)创建n按钮,然后根据自己需求全部显示,或是动态显示,只显示所选中的那一行按钮;
另一种是每次只创建选中行的一个按钮,并且销毁上一次创建的按钮(第一次除外)。
本实例选用第二种方法,第一种方法也用了,但是效果不好,有其他bug.
-----------------------------------------------------------------创建按钮源代码如下---------------------------------------------------------------------
有4个基本文件,ButtonEx.h, ButtonEx.cpp, ListCtrlEx.h, ListCtrlEx.cpp.
//ButtonEx.h
#pragma once #include "WDBitmapButton.h"
// CButtonEx
#define WM_BN_CLICK WM_USER + 100
class CButtonEx : public CWDBitmapButton
{
DECLARE_DYNAMIC(CButtonEx) public:
CButtonEx();
CButtonEx( int nItem, int nSubItem, CRect rect, HWND hParent );
virtual ~CButtonEx(); protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClicked();
int m_inItem;
int m_inSubItem;
CRect m_rect;
HWND m_hParent;
BOOL bEnable;
};
// ButtonEx.cpp : 实现文件
// #include "stdafx.h"
#include "ButtonEx.h" // CButtonEx IMPLEMENT_DYNAMIC(CButtonEx, CButton) CButtonEx::CButtonEx()
{ } CButtonEx::~CButtonEx()
{
} CButtonEx::CButtonEx( int nItem, int nSubItem, CRect rect, HWND hParent ) //-
{
m_inItem = nItem;
m_inSubItem = nSubItem;
m_rect = rect;
m_hParent = hParent;
bEnable = TRUE;
} BEGIN_MESSAGE_MAP(CButtonEx, CButton)
ON_CONTROL_REFLECT(BN_CLICKED, &CButtonEx::OnBnClicked)
END_MESSAGE_MAP() // CButtonEx 消息处理程序 void CButtonEx::OnBnClicked()
{
// TODO: 在此添加控件通知处理程序代码
::SendMessage( m_hParent, WM_BN_CLICK, m_inItem, m_inSubItem ); //
}
//ListCtrl.h
#pragma once #include "ButtonEx.h"
#include <map>
using namespace std; typedef map<int,CButtonEx*>button_map;
// CListCtrlEx class CListCtrlEx : public CListCtrl
{
DECLARE_DYNAMIC(CListCtrlEx) public:
CListCtrlEx();
virtual ~CListCtrlEx(); protected:
DECLARE_MESSAGE_MAP() public:
void createItemButton( int nItem, int nSubItem, HWND hMain );
void release();
void deleteItemEx( int iCount, int nItem );
button_map m_mButton;
WCHAR * charToWchar(char *s); public:
UINT m_uID;
//void updateListCtrlButtonPos();
//void enableButton( BOOL bFlag, int iItem );
};
// ListCtrlEx.cpp : 实现文件
// #include "stdafx.h"
#include "ListCtrlEx.h"
#include "resource.h"
#define MAX_PATH 256 // CListCtrlEx IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl) CListCtrlEx::CListCtrlEx()
{
} CListCtrlEx::~CListCtrlEx()
{
} BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
END_MESSAGE_MAP() // CListCtrlEx 消息处理程序 void CListCtrlEx::createItemButton( int nItem, int nSubItem, HWND hMain )
{ m_mButton.clear();
char *name = NULL;
CString strPath;
::GetModuleFileName( NULL, strPath.GetBuffer(MAX_PATH), MAX_PATH );
strPath.ReleaseBuffer();//当前文件的绝对路径
strPath = strPath.Left(strPath.ReverseFind(_T('\\')));//文件所在目录
strPath=strPath.Left(strPath.ReverseFind(_T('\\')));//文件目录的父目录 name = (LPSTR)(LPCSTR)strPath;
WCHAR name_on[256] = {}; wcscpy(name_on,charToWchar(name));
wcscat(name_on,L"//Invaray//Invaray//res//delete.png"); CRect rect;
if( !EnsureVisible(nItem, TRUE))
return ; GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
DWORD dwStyle = WS_CHILD | WS_VISIBLE;
CButtonEx *pButton = new CButtonEx(nItem,nSubItem,rect,hMain);
rect.bottom = rect.bottom-2;
pButton->Create(_T(""),dwStyle, rect, this, m_uID);
//m_uID++;
pButton->SetImage(name_on,name_on,name_on);
m_mButton.insert( make_pair( nItem, pButton ) ); return;
} WCHAR * CListCtrlEx::charToWchar(char *s)
{
int w_nlen=MultiByteToWideChar(CP_ACP,0,s,-1,NULL,0);
WCHAR *ret;
ret=(WCHAR*) malloc(sizeof(WCHAR)*w_nlen);
memset(ret,0,sizeof(ret));
MultiByteToWideChar(CP_ACP,0,s,-1,ret,w_nlen);
return ret;
} void CListCtrlEx::release()
{
button_map::iterator iter;
iter = m_mButton.begin();
while ( iter != m_mButton.end() )
{
delete iter->second;
iter->second = NULL;
iter++;
} }
void CListCtrlEx::deleteItemEx( int iCount, int nItem )
{
//int iCount = GetItemCount();
DeleteItem( nItem );
button_map::iterator iter;
button_map::iterator iterNext;
#ifdef USE_TOPINDEX_BUTTON
//add-----------------------------------
iter = m_mButton.find( nItem );
iterNext = iter;
iterNext++;
while ( iterNext != m_mButton.end() )
{
iter->second->bEnable = iterNext->second->bEnable;
iterNext++;
iter++;
}
//------------------------------
#endif
iter = m_mButton.find( iCount - 1 );
if ( iter != m_mButton.end() )
{
delete iter->second;
iter->second = NULL;
m_mButton.erase( iter );
//updateListCtrlButtonPos();
}
} //void CListCtrlEx::updateListCtrlButtonPos()
//{
// int iTopIndex = GetTopIndex();
// int nItem = iTopIndex;
// button_map::iterator iter;
// button_map::iterator iterUp;
// int iLine = 0;
//#ifdef USE_TOPINDEX_BUTTON
// iter = m_mButton.find( iTopIndex );
// iterUp = m_mButton.begin();
// while ( iter != m_mButton.end() )
// {
// iterUp->second->EnableWindow( iter->second->bEnable );
// iter ++;
// iterUp++;
// }
//#else
// for ( ; nItem < GetItemCount(); nItem++ )
// {
// iter = m_mButton.find(nItem);
// if( iter!= m_mButton.end() )
// {
// CRect rect;
// iterUp = m_mButton.find(iLine);
// rect = iterUp->second->m_rect;
// iter->second->MoveWindow( &rect );
// iter->second->ShowWindow( SW_SHOW );
// if( iLine < iTopIndex )
// {
// iterUp->second->ShowWindow( SW_HIDE );
// }
// iLine++;
// }
// }
//#endif
//
//} //void CListCtrlEx::enableButton( BOOL bFlag, int iItem )
//{
// button_map::iterator iter;
//#ifdef USE_TOPINDEX_BUTTON
// int iTopIndex = GetTopIndex();
// int nItem = iItem - iTopIndex;
// iter = m_mButton.find( iItem );
// if ( iter != m_mButton.end() )
// {
// iter->second->bEnable = bFlag;
// }
// iter = m_mButton.find( nItem );
// if ( iter != m_mButton.end() )
// {
// iter->second->EnableWindow( bFlag );
// }
//#else
// iter = m_mButton.find( iItem );
// if ( iter != m_mButton.end() )
// {
// iter->second->EnableWindow( bFlag );
// }
//#endif
//
//}
动态创建Button的函数
createItemButton( int nItem, int nSubItem, HWND hMain ),3个参数分别是行,列,父窗口句柄;
按钮所产生消息:
void CButtonEx::OnBnClicked()
{
// TODO: 在此添加控件通知处理程序代码
::SendMessage( m_hParent, WM_BN_CLICK, m_inItem, m_inSubItem ); //
}
可以通过宏WM_BN_CLICK来接收相应的行数和列数。
如,在你的其他文件中添加消息响应函数,ON_MESSAGE( WM_BN_CLICK, onBnCLick) ,LRESULT CXXX::onBnCLick( WPARAM wParam, LPARAM lParam ){}
MFC之ListCtrl动态添加按钮的更多相关文章
- iOS: 学习笔记, 动态添加按钮
1. 新建iOS -> Single View Application. 2. 个性控制器文件YYViewController.m(此处修改为你相应的控制器文件名) // // YYViewCo ...
- WPF 动态添加按钮以及样式字典的引用(Style introduction)
我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的对象就可以了. 下面是Ui,其中定义了一个WrapPanel来存放CheckBox,还 ...
- MFC 单文档添加按钮
VS 单文档 添加按钮 今天做项目需要在单文档中创建按钮来响应函数,即点击按钮,调用某函数,特此记录. 1. 在XXXView中添加CButton变量,例如 CButton start; 2. 下来就 ...
- 【代码笔记】iOS-UIActionSheet动态添加按钮
一,效果图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...
- (转载)VC/MFC 工具栏上动态添加组合框等控件的方法
引言 工具条作为大多数标准的Windows应用程序的 一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开 ...
- VC/MFC 工具栏上动态添加组合框等控件的方法
引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...
- winfrom_动态添加按钮button(设置颜色,大小,按钮字体大小、颜色,位置,事件)
List<string> strColor = new List<string>(); strColor.Add("#e67817"); strColor. ...
- 动态添加试题选项按钮 radioButton(一)
最近在做WebView加载试题的功能,但是选项按钮如果放的WebView中,点击时反应很慢.于是把选项用原生的RadioButton,而试题题目和答案放在WebView中.但是选项的个数不确定,所以需 ...
- Android 在程序中动态添加 View 布局或控件
有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...
随机推荐
- Unity面试问题归总
Unity面试问题归总 C#中Struct和Class的区别 Struct是Class的一种 A*寻路 https://blog.csdn.net/windcao/article/details/15 ...
- 百度地图之自动提示--autoComplete
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hadoop2.7.1安装和部署
操作系统:Red Hat Enterprise Linux Server release 6.2 (Santiago) hadoop2.7.1 三台redhat linux主机,ip分别为10.204 ...
- 转:为什么说招到合适的人比融到钱更加重要 - Hiring Great Talent is More Important Than Fund Raising
我在猎头行业工作了 20 多年,一直在帮助创业公司招聘优秀的人才.我服务过的客户既有 VC 投资的初创企业,也有即将 IPO 的公司.我和 200 多个 VC 合作过,也见过 300 多个客户失败的案 ...
- charles 在mac下 抓取 https包
1. 打开charles --> help --> SSL proxying --> install charles root certificate 2. 在弹出的添加证书窗口中 ...
- c# 修改pdf
继续引用spire的dll. 1.代码如下: PdfDocument doc = new PdfDocument(); doc.LoadFromFile("wen.pdf"); P ...
- 软工实践-Alpha 冲刺 (8/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制作 ...
- 软工实践第八次作业(课堂实战)- 项目UML设计(第五组)
本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...
- Alpha 冲刺5
队名:日不落战队 安琪(队长) 今天完成的任务 组织第五次站立式会议(半冲刺总结交流会). 完成草稿箱前端界面. 明天的计划 回收站前端界面. 尝试去调用数据. 还剩下的任务 信息修改前端界面. 遇到 ...
- 【beta】Scrum站立会议第5次....11.7
小组名称:nice! 组长:李权 成员:于淼 刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.7 12:00——12:30 地点:传媒西楼220室 本次对beta阶段的 ...