- 浏览: 356383 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
tianshawang:
楼主你好偏心啊,把代码给谷歌不给这里
java 实现windows资源管理器 -
tianshawang:
其实我是也想要资源管理器的代码来的。。
java 实现windows资源管理器 -
hcmfys:
lonuery 写道open file 是获取要进行复制的文件 ...
JAVA 复制 带进度条 时间 百分比 -
qq657052171:
怎么没有代码呢?
java 实现windows资源管理器 -
IT女民工:
楼主,求资源管理器代码~~~~
java 实现windows资源管理器
学习0
<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
2. 关于list control 的高级应用--- 条目编辑
http://www.fa39.com/Article/c/200610/1952.html
论坛中搜索一下, 你会发现不少类似的提问: 我如何编辑list control 的条目? 如何直接编辑list control... 等等;list control 可用来做数据库表的视图, 十分有用.
但报表风格的list control 只能编辑第一列, 其余的该死的微软没为vc 做到. 它怕VB 卖不出. 于是C++ 程序员只好DIY. 主要思想是在list control 中动态创建一个控件, 动态移动该控件到相应位置. 这些方法早有人讨论过了, 本文也是基于如上思想的, 但注重于可扩充性与使用的方便.
List control 这头主要是重载OnLButtonDown 方法, 计算出被点中的条目. 这里重要的函数是SubItemHitTest 和GetSubItemRect, 看msdn 上有相关说明. 用户点中后, 就要负责显示控件了: 如果之前选中了其他, 就要验证之前的改动是否成功. 不成功就要回到原来的地方, 成功就应用修改并移到新位置. 看代码:
static const UINT IDCHAILD="3000";
void CValidateList::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
LVHITTESTINFO hi;
hi.pt = point;
if(SubItemHitTest(&hi) != -1 )// 没有点中条目就不管
{if(m_col==-1||//-1 还没被选过
true==(m_col+m_validate)->Validate (m_row))
{
m_row = hi.iItem, m_col= hi.iSubItem;//m_row,m_col 成
// 员分别跟踪选中的行列
}
((m_col+m_validate))->Move (_GetRect(),m_row);
}
}
WinBlast* CValidateList::SetValidate( WinBlast*in)// 设置验证的
// 控件群,in 对应第一列,in+1 第二列……
{
WinBlast*ret=m_validate;
m_validate=in;
int counts="GetHeaderCtrl"()->GetItemCount();;
RECT rect;
memset(&rect,0,sizeof(rect));
for(int i="0";i< span>
(in+i)->Create (this,rect,IDCHAILD+i,i);
m_col=-1;// 没有被选中的
return ret;
}
RECT CValidateList::_GetRect()// 内部使用, 得到相应显示位置
{
CRect ret;
GetSubItemRect(m_row,m_col,LVIR_BOUNDS,ret);
return ret;
}
void CValidateList::NoSelect()// 置未选中状态
{
m_col=-1;// 没有被选中的
}
看到了WinBlast*ret=m_validate 吧.WinBlast 是用来修改和验证数据的控件看它的实现:
class WinBlast
{
int m_col;// 跟踪列, 为什么要这个? 因为你可以让一种控件对
// 不同列用不同的验证策略
CWnd* m_win;// 你的控件窗口
CListCtrl *m_parent;// 用它获得文本
public:
WinBlast(){m_win=NULL;}
~WinBlast(){m_win->DestroyWindow();delete m_win;}
virtual bool Create( CWnd* pParentWnd,
const RECT& rect, UINT nID,
int col)
{
m_col=col;m_parent=(CListCtrl *)pParentWnd;
m_win=new CEdit;
return ((CEdit*)m_win)->
Create(ES_NOHIDESEL,rect,pParentWnd,nID);
}
void Move(const RECT &rect,int row)// 最重要的函数但前面
// 两个动作是必作的,SetText 为虚, 你在那做你喜欢的
; {
m_win->ShowWindow(SW_SHOW);
m_win->MoveWindow(&rect);
SetText(row);
}
virtual bool Validate(int row)// 验证, 虚函数. 这里永远返回true
{
m_win->ShowWindow(SW_HIDE);
CString set;
m_win->GetWindowText(set);
m_parent->SetItemText(row,m_col,set);
return true;
}
virtual void SetText(int row)
{
m_win->SetWindowText(m_parent->GetItemText(row,m_col));
((CEdit*)m_win)->SetSel (0,-1);
}
};
实际使用通常是这样的:
WinBlast*p=new WinBlast[sizeof(col)/sizeof(col[0])];//col 是
// 列名字符数组,sizeof(col)/sizeof(col[0]) 计算列数
m_test.SetValidate (p);//m_test 是CValidateList 类
你可以继承WinBlast, 重载Create 建立一个下拉框, 加入你喜爱的验证方法.
注意我的设计漏洞:CValidateList 应接收WinBlast**, 而不是WinBlast*----- 不理解这个漏洞其实也不要紧: 但要记住, 不改正的话你的WinBlast 后继类就不能加数据成员了.
3. 如何在 VC MFC 的 List Control 中实现拷贝功能?
Reference: http://zhidao.baidu.com/question/13639294.html
我在单文档视图中加入一个 List Control 控件 (Report 形式 ) ,并关联类 CListCtrl 的一个对象,往里面写数据什么的都行,但在界面上无法实现对报表数据的拷贝(快捷或右键都不行),想请教如何实现拷贝该报表显示的数据?
1 对 CListCtrl 创建 click 事件,记录 item
2 在视图所在的类创建虚函数 PreTranslateMessage
加入代码
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam==13)// 这里 13 是表示回车键盘,你也可以改成其他的
{
copy();
}
}
3. 编写 copy 函数,取得 item 处的文本,保存只剪切板
4. 更改列表控件样式
创建列表控件 (List Control) (CListCtrl) 后,可以在任何时间更改它的窗口样式。通过更改窗口样式来更改控件使用的视图类型。例如,为了模拟“资源管理器”,您可以提供菜单项或工具栏按钮以在不同的视图(图标视图、列表视图等)之间切换控件。
例如,用户选择您的菜单项后,您可以调用 GetWindowLong 来检索控件的当前样式,然后调用 SetWindowLong 来重置样式。有关更多信息,请参见 Platform SDK 中的使用列表视图 (ListView) 控件。
可用样式在 Create 中列出。样式 LVS_ICON 、LVS_SMALLICON 、LVS_LIST 和 LVS_REPORT 指定四种列表控件 (List Control) 视图。
扩展样式
除了列表控件 (List Control) 的标准样式之外,还有另一个称为扩展样式的样式集。Platform SDK 中的扩展列表视图样式讨论了这些样式,这些样式可提供自定义列表控件 (List Control) 行为的各种有用功能。若要实现某个样式的行为(如随意选择),请调用 CListCtrl::SetExtendedStyle 传递所需的样式。下面的示例说明该函数调用:
m_myListCtrl.SetExtendedStyle(LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE);
注意 要使随意选择起作用,还必须打开 LVS_EX_ONECLICKACTIVATE 或 LVS_EX_TWOCLICKACTIVATE 。
5. 在列表控件( List Control )中实现工作区
默认情况下,列表控件 (List Control) 按标准网格格式排列所有项。但也支持另一种方法:工作区。工作区将列表项排列到矩形组中。有关实现工作区的列表控件 (List Control) 的图像,请参见 Platform SDK 中的“使用列表- 视图控件”。
注意 工作区只有当列表控件 (List Control) 处于图标或小图标模式时才可见。但是,如果视图切换到报表或列表模式,将维持任何当前工作区。
工作区可用来显示空边框(在项的左侧、顶部和/ 或 右侧),或在通常不会有水平滚动条的时候显示水平滚动条。另一个普通用法是创建多个工作区,可以将项移动或放置到这些工作区。使用该方法可以在单一视图中 创建具有不同意义的区域。然后用户可以将项放置到不同的区域以对它们分类。此类示例可以是一个文件系统的视图,它包含一个读/ 写文件区,一个只读文件区。如果将文件项移动到只读区,它将自动变为只读。将文件从只读区移动到读/ 写区会使文件成为可读/ 写的。
CListCtrl 为创建和管理列表控件 (List Control) 工作区提供几个成员函数。GetWorkAreas 和 SetWorkAreas 检索并设置 CRect 对象(或 RECT 结构)数组,该数组存储当前实现的列表控件 (List Control) 工作区。另外,GetNumberOfWorkAreas 检索列表控件 (List Control) 的当前工作区数目(默认值为零)。
项和工作区
工作区创建后,工作区中的项成为其成员。同样,如果将一个项移动到某个工作区,则该项成为它所移动到的工作区的成员。如果某个项不在任何工作区中,则它自动成为第一个工作区(索引 0 )的成员。如果想创建项并将其放置到一个特定的工作区,则需要创建该项,然后调用 SetItemPosition 将项移动到所需工作区。下面的第二个示例说明该技术。
下面的示例在列表控件 (List Control) ( m_listctrl ) 中实现四个大小相等的工作区 ( rcWorkAreas ) ,每个工作区都有 10 像素宽的边框。
CRect curRect;
CSize size;
size= m_listctrl.ApproximateViewRect();
size.cx+= 100;
size.cy+= 100;
CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);
//set work areas
m_listctrl.SetWorkAreas(4, rcWorkAreas);
调用 ApproximateViewRect 来获取在一个区域显示所有项所需要的总区域大小的估计值。之后,该估计值被分成四个区域并用 5 像素宽的边框填充。
下一个示例将现有列表项分配给每一组 ( rcWorkAreas ) 并刷新控件视图 ( m_listctrl ) 以实现此效果。
// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
rgptWork[i].x = rcWorkAreas[i].left + 10;
rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (i = 0; i < 20; i++)
m_listctrl.SetItemPosition(i, rgptWork[i % 4]);
// force the control to rearrange the shuffled items
m_listctrl.Arrange(LVA_DEFAULT);
6. 处理列表控件( List Control )中的通知消息
用户单击列标题、拖动图标、编辑标签等时,列表控件 (List Control) (CListCtrl) 将通知消息发送给它的父窗口。如果要进行某种响应,请处理这些消息。例如,用户单击列标题后,可能想基于单击的列的内容对项排序,如在 Microsoft Outlook 中所做的那样。
在视图或对话框类中处理列表控件 (List Control) 的 WM_NOTIFY 消息。基于正在处理的通知消息,用“属性”窗口创建带 switch 语句的 OnChildNotify 处理函数。
有关列表控件 (List Control) 可以发送到其父窗口的通知的列表,请参见 Platform SDK 中的列表视图 (ListView) 控件参考。
7. 虚拟列表控件
虚拟列表控件指具有 LVS_OWNERDATA 样式的列表视图 (ListView) 控件。该样式启用控件来支持项数达到 DWORD (默认的项数只扩展到 int )。然而,该样式的最大便利是可以使内存中一次只有一个数据项子集。这使虚拟列表视图 (ListView) 控件可以将自己借给大型信息数据库使用,而在这类数据库中已存在特定的数据访问方法。
注意 MFC 除了在 CListCtrl 中提供虚拟列表功能外,还在 CListView 类中提供相同的功能。
在开发虚拟列表控件时应注意一些兼容性问题。有关更多信息,请参见 Platform SDK 中“ 列表 - 视图控件” 主题的“ 兼容性问题” 一节。
处理 LVN_GETDISPINFO 通知
虚拟列表控件维护非常少的项信息。除了项选择和焦点信息,所有项信息都由控件的所有者管理。框架通过 LVN_GETDISPINFO 通知消息来请求信息。若要提供请求的信息,虚拟列表控件的所有者(或控件本身)必须处理该通知。使用“ 属性” 窗口可以很容易地完成此操作(请参见 将消息映射到函数 )。所得到的代码应类似于下面的示例(其中 CMyListCtrl 是虚拟列表控件对象,控件正在处理通知)。
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
END_MESSAGE_MAP()
在 LVN_GETDISPINFO 通知消息的处理程序中,必须检查正在请求的信息的类型。可能值是:
· LVIF_TEXT 必须填写 pszText 成员。
· LVIF_IMAGE 必须填写 iImage 成员。
· LVIF_INDENT 必须填写 iIndent 成员。
· LVIF_PARAM 必须填写 lParam 成员。
· LVIF_STATE 必须填写 state 成员。
然后应将所有请求的信息提供给框架。
下面的示例摘自列表控件 (List Control) 对象的通知处理程序体,它通过为文本缓冲区和项的图像提供信息来说明一种可能的方法:
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
int iItemIndx= pItem->iItem;
if (pItem->mask & LVIF_TEXT) //valid text buffer?
{
switch(pItem->iSubItem){
case 0: //fill in main text
lstrcpy(pItem->pszText,
m_Items[iItemIndx].m_strItemText);
break;
case 1: //fill in sub item 1 text
lstrcpy(pItem->pszText,
m_Items[iItemIndx].m_strSubItem1Text);
break;
case 2: //fill in sub item 2 text
lstrcpy(pItem->pszText,
m_Items[iItemIndx].m_strSubItem2Text);
break;
}
}
if pItem->mask & LVIF_IMAGE) //valid image?
pItem->iImage=
m_Items[iItemIndx].m_iImageIndex;
由于这种类型的列表控件 (List Control) 是提供给大的数据集的,因此建议您缓存请求的项数据以提高检索性能。框架提供缓存提示机制,通过发送 LVN_ODCACHEHINT 通知消息来帮助优化缓存。但是,您必须使用一种稍有不同的方法来处理该通知。使用“ 属性” 窗口,重写列表控件 (List Control) 对象的 OnChildNotify 函数。在该示例的情况下为 CMyListCtrl 。
在处理程序体中检查 LVN_ODCACHEHINT 消息,如果找到,则准备缓存。
下面的示例(摘自 OnChildNotify 函数体)执行此检查并调用 CMyListCtrl 类的 PrepCache 成员函数。
NMLVCACHEHINT* pcachehint="NULL";
if (message == WM_NOTIFY)
{
NMHDR* phdr = (NMHDR*)lParam;
switch(phdr->code)
{
case LVN_ODCACHEHINT:
pcachehint= (NMLVCACHEHINT*) phdr;
// Load the cache with the recommended range.
PrepCache(pcachehint->iFrom, pcachehint->iTo);
break;
default:
return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);
}
return FALSE;
}
else
return CListCtrl::OnChildNotify(message, wParam, lParam, pLResult);
注意,如果消息类型不是 LVN_ODCACHEHINT ,则通知将传递给基类 (CListCtrl ) 。有关准备和维护缓存的更多信息,请参见 Platform SDK 中的“ 列表 - 视图控件” 主题的“ 缓存管理” 一节。
当需要查找特定的列表控件项时,虚拟列表控件发送 LVN_ODFINDITEM 通知消息。列表视图 (ListView) 控件接收快捷键访问或接收 LVM_FINDITEM 消息时发送该通知消息。搜索信息以 LVFINDINFO 结构的格式发送,该结构是 NMLVFINDITEM 结构的成员。通过重写列表控件 (List Control) 对象的 OnChildNotify 函数来处理该消息,并在处理程序体中检查 LVN_ODFINDITEM 消息。如果找到此消息,则执行相应的操作。
您应该准备好搜索与列表视图 (ListView) 控件给定的信息匹配的项。如果成功,则应返回项的索引;如果没有找到匹配项,则返回 -1 。
8. 销毁列表控件
如果嵌入 CListCtrl 对象作为视图或对话框类的数据成员,则当销毁其所有者时该对象也被销毁。如果使用 CListView ,则框架在销毁视图时销毁控件。
如果安排将一些列表数据存储在应用程序而不是列表控件 (List Control) 中,将需要安排对列表数据的解除分配。有关更多信息,请参见 Platform SDK 中的回调项和回调屏蔽。
另外,您要负责将您所创建的与此列表控件 (List Control) 对象关联的所有图像列表解除分配。
9. 列表控件( List Control )和列表视图
为方便起见, MFC 以两种方法封装列表控件 (List Control) 。可以按下列两种方式使用列表控件 (List Control) :
· 通过在对话框类中嵌入 CListCtrl 对象来直接使用。
· 通过使用类 CListView 来间接使用。
CListView 使得在 MFC 文档 / 视图结构中集成列表控件 (List Control) 变得容易,封装此控件与 CEditView 封装编辑控件 (Edit Control) 基本相同:控件填充 MFC 视图的整个表面区。(视图“ 是” 转换为 CListView 的控件。)
CListView 对象从 CCtrlView 及其基类继承并添加一个检索基础列表控件 (List Control) 的成员函数。像视图一样使用视图成员处理视图。使用 GetListCtrl 成员函数获得对列表控件 (List Control) 的成员函数的访问权限。使用这些成员可以:
· 添加、删除或操作列表中的“项”。
· 设置或获取列表控件 (List Control) 属性。
若要获得对作为 CListView 基础的 CListCtrl 的引用,请从列表视图类调用 GetListCtrl :
CListCtrl& ctlList = GetListCtrl();
该主题描述了使用列表控件 (List Control) 的两种方法。
10. 列表项和图象列表
列表控件 (List Control) (CListCtrl) 中的“ 项” 由图标、标签和可能的其他信息(在“ 子项” 中)组成。
列表控件项的图标包含在图像列表中。一个图像列表包含图标视图中使用的标准尺寸的图标。第二个可选图像列表包含控件的其他视图中所使用的相同图标的较小版本。第三个可选列表包含“ 状态” 图像(如复选框),用于在某些视图的小图标前面显示。第四个可选列表包含在列表控件 (List Control) 的单个标头项中显示的图像。
注意 如果列表视图 (ListView) 控件是用 LVS_SHAREIMAGELISTS 样式创建的,则在图像列表不再使用时您要负责销毁这些图像列表。如果您将相同的图像列表分配给多个列表视图 (ListView) 控件,请指定该样式;否则,一个以上的控件可能会尝试销毁同一个图像列表。
有关列表项的更多信息,请参见 Platform SDK 中的列表视图图像列表和项和子项。另请参见“ MFC 参考” 中的 CImageList 类和该文章族中的 使用 CImageList 。
若要创建列表控件 (List Control) ,需要在将新项插入到列表中时提供将要使用的图像列表。下面的示例将说明此过程,其中 m_pImagelist 是 CImageList 类型的指针, m_listctrl 是一个 CListCtrl 数据成员。
// create, initialize, and hook up image list
m_pImageList = new CImageList();
ASSERT(m_pImageList != NULL); // serious allocation failure checking
m_pImageList->Create(32, 32, TRUE, 4, 4);
m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST1));
m_pImageList->Add(pApp->LoadIcon(IDI_ICONLIST2));
m_listctrl.SetImageList(m_pImageList, LVSIL_NORMAL);
但是,如果不打算在列表视图或列表控件 (List Control) 中显示图标,则不需要图像列表。请参见 DAOVIEW 示例应用程序获取有关不带图标的列表视图的说明。
11. 回调项和回调屏蔽
对于列表视图 (ListView) 控件的每一项,列表视图 (ListView) 控件通常存储标签文本、项的图标的图像列表索引和用于项状态的一组位标志。可以将单个项定义为回调项,这在应用程序已经存储某个项的一些信息时很有用。
可以通过为 LV_ITEM 结构(请参见 CListCtrl::GetItem )的 pszText 和 iImage 成员指定适当值来将一个项定义为回调项。如果应用程序维护项或子项的文本,则为 pszText 成员指定 LPSTR_TEXTCALLBACK 值。如果应用程序跟踪项的图标,则为 iImage 成员指定 I_IMAGECALLBACK 值。
除了定义回调项之外,还可以修改控件的回调屏蔽。该屏蔽是一组指定项状态的位标 志,为这些项状态存储当前数据的是应用程序而不是控件。回调屏蔽适用于控件的所有项,这和回调项指定不同,后者适用于特定的项。默认情况下,回调屏蔽为 零,意思是控件跟踪所有项状态。若要更改此默认行为,请将屏蔽初始化为下列值的任意组合:
· LVIS_CUT 项被标记为进行剪贴操作。
· LVIS_DROPHILITED 项突出显示为拖放目标。
· LVIS_FOCUSED 项有焦点。
· LVIS_SELECTED 项被选定。
· LVIS_OVERLAYMASK 应用程序存储每一个项的当前覆盖图像的图像列表索引。
· LVIS_STATEIMAGEMASK 应用程序存储每一个项的当前状态图像的图像列表索引。
有关检索和设置该屏蔽的进一步信息,请参见 CListCtrl::GetCallbackMask 和 CListCtrl::SetCallbackMask 。
12. 创建列表控件
创建列表控件 (List Control) (CListCtrl) 的方式取决于是直接使用此控件还是代之以使用类 CListView 。如果使用 CListView ,框架将视图构造成其文档 / 视图创建序列的一部分。创建列表视图也就创建了列表控件 (List Control) (二者相同)。控件在视图的 OnCreate 处理函数中创建。在这种情况下,通过调用 GetListCtrl 准备在控件中添加项。
在对话框中直接使用 CListCtrl
1. 在对话框编辑器中,向对话框模板资源添加“ List Control ”控件。指定其控件 ID 。
2. 使用 添加成员变量向导 添加带 Control 属性的 CListCtrl 类型的成员变量。可以使用该成员来调用 CListCtrl 成员函数。
3. 对于需要处理的任何列表控件 (List Control) 通知消息,使用“属性”窗口来映射对话框类中的处理函数,请参见 将消息映射到函数 。
4. 在 OnInitDialog 中,设置 CListCtrl 的样式。请参见 更改列表控件 (List Control) 样式 。虽然以后可以更改视图,但该操作可确定在控件中获得的“视图”类型。
在非对话框窗口中使用 CListCtrl
1. 在视图或窗口类中定义此控件。
2. 调用控件的 Create 成员函数,可能在 OnInitialUpdate 中,也可能与父窗口的 OnCreate 处理函数一样早(如果创建此控件的子类)。设置此控件的样式。
13. 创建图象列表
不论使用 CListView 还是使用 CListCtrl ,创建图像列表是一样的。
注意 只有在列表控件 (List Control) 包括 LVS_ICON 样式时才需要图像列表。
使用 CImageList 类创建一个或多个图像列表(对于标准尺寸的图标、小图标和状态)。请参见 Platform SDK 中的 CImageList 以及列表视图图像列表。
为每一个图像列表调用 CListCtrl::SetImageList ;将指针传递给合适的 CImageList 对象。
14. 向控件添加列
注意 下列过程适用于 CListView 或 CListCtrl 对象。
列表控件 (List Control) 在报表视图中时显示列,提供一种组织每一列表控件项的各种子项的方法。这种组织是通过列表控件 (List Control) 中的列和列表控件项的相关子项之间的一一对应来实现的。有关子项的更多信息,请参见 向控件添加项 。 Windows 95 和 Windows 98 资源管理器中的“ 详细信息” 视图提供了报表视图中列表控件 (List Control) 的示例。第一列列出文件夹、文件图标和标签。其他列列出文件大小、文件类型、上次修改日期等。
虽然可以在任何时间向列表控件 (List Control) 添加列,但只有控件的 LVS_REPORT 样式位打开时列才可见。
每一列有一个关联的标头项(请参见 CHeaderCtrl )对象,该对象标记列并允许用户调整列的大小。有关代码示例的信息,请参见 DAOVIEW 示例应用程序。
如果列表控件 (List Control) 支持报表视图,则需要为列表控件项中每一个可能的子项添加一列。要添加列,先准备 LV_COLUMN 结构,然后调用 InsertColumn 。添加必要的列(有时称标头项)后,可以使用属于嵌入式标头控件的成员函数和样式来对它们重新排序。有关更多信息,请参见 排序标头控件中的项 。
注意 如果用 LVS_NOCOLUMNHEADER 样式创建列表控件 (List Control) ,则将忽略任何插入列的尝试。
15. 向控件添加项
若要向列表控件 (List Control) (CListCtrl) 添加项,请根据您所拥有的信息调用 InsertItem 成员函数的几种版本中的一种。一种版本采用您准备的 LV_ITEM 结构。因为 LV_ITEM 结构包含大量成员,因此您对列表控件项的属性具有更强大的控制能力。
LV_ITEM 结构的两个重要成员(相对于报表视图)是 iItem 和 iSubItem 成员。 iItem 成员是该结构正在引用的项的从零开始的索引, iSubItem 成员是子项的从一开始的索引(如果该结构包含有关某项的信息则从零开始)。用这两个成员确定每项的子项信息的类型和值,此信息在列表控件 (List Control) 位于报表视图中时显示。有关更多信息,请参见 CListCtrl::SetItem 。
其他成员指定项的文本、图标、状态和项数据。“ 项数据” 是与列表视图项关联的应用程序定义值。有关 LV_ITEM 结构的更多信息,请参见 CListCtrl::GetItem 。
其他版本的 InsertItem 采用一个或多个与 LV_ITEM 结构中的成员相对应的独立值,使您得以只初始化想要支持的成员。通常情况下,列表控件 (List Control) 管理列表项的存储,但使用“ 回调项” 可以将一些信息存储在应用程序中。有关更多信息,请参见本主题中的 回调项和回调屏蔽 和 Platform SDK 中的回调项和回调屏蔽。
有关更多信息,请参见项和子项
16. 向 List Control 添加列利用 Cstring 的例子
//
// create Columns ...
//
for( i="0" ; i
{
// create columns
str.Format(IDS_COLUMN, i+1);
colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);
nCol++;
}
关于str.Format:
例: CString str = "Some Data";
str.Format("%s%d", str, 123); // Attention: str is also used in the parameter list.
IDS_COLUMN :字符串ID ,内容为Column %d
BOOL SetItemText( int nItem , int nSubItem , LPTSTR lpszText );
Return Value
Nonzero if successful; otherwise zero.
Parameters
nItem
Index of the item whose text is to be set.
nSubItem
Index of the subitem, or zero to set the item label.
lpszText
Pointer to a string that contains the new item text.
Remarks
Changes the text of a list view item or subitem.
int InsertItem( const LVITEM* pItem );
int InsertItem( int nItem , LPCTSTR lpszItem );
int InsertItem( int nItem , LPCTSTR lpszItem , int nImage );
int InsertItem( UINT nMask , int nItem , LPCTSTR lpszItem , UINT nState , UINT nStateMask , int nImage , LPARAM lParam );
Return Value
The index of the new item if successful or -1 otherwise.
Parameters
pItem
Pointer to an LVITEM structure that specifies the item’s attributes, as described in the Platform SDK .
nItem
Index of the item to be inserted.
lpszItem
Address of a string containing the item’s label, or LPSTR_TEXTCALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask .
nImage
Index of the item’s image, or I_IMAGECALLBACK if the item is a callback item. For information on callback items, see CListCtrl::GetCallbackMask .
nMask
The nMask parameter specifies which item attributes passed as parameters are valid. It can be one or more of the mask values described in LVITEM structure in the Platform SDK . The valid values can be combined with the bitwise OR operator.
nState
Indicates the item's state, state image, and overlay image. See the Platform SDK topics LVITEM for more information and List View Item States for a list of valid flags.
nStateMask
Indicates which bits of the state member will be retrieved or modified. See LVITEM in the Platform SDK for more information.
nImage
Index of the item’s image within the image list.
lParam
A 32-bit application-specific value associated with the item. If this parameter is specified, you must set the nMask attribute LVIF_PARAM .
Remarks
Inserts an item into the list view control.
19. 引用 &
程序参考:E:/ 唐进/ 工作/ 项目/VC2005 项目/testing/MFC/0328MauCtni/ 资源例程/ ××Print ListCtrl on multiple pages/listPrint_demo/listPrintView.cpp(111): CListCtrl &refCtrl = GetListCtrl();
void CListPrintView::OnFill()
{
CWaitCursor wait;
CListCtrl &refCtrl = GetListCtrl();// 此处为引用
int i,
j,
nCol=0,
colId,
iActualItem;
CString str;
if( m_bFilled )
{
AfxMessageBox(IDS_STUPID);
return;
}
对于
CListCtrl& GetListCtrl( ) const;
Return Value
A reference to the list control associated with the view.
Remarks
Call this member function to get a reference to the list control associated with the view.
经典例子:
void CListPrintView::OnFill()
{
CWaitCursor wait;
CListCtrl &refCtrl = GetListCtrl();// 此处犹为重要
int i,
j,
nCol=0,
colId,
iActualItem;
CString str;
if( m_bFilled )
{
AfxMessageBox(IDS_STUPID);
return;
}
m_bFilled = TRUE;
// speed up !
SetRedraw(FALSE);
//
// create Columns ...
//
for( i="0" ; i
{
// create columns
str.Format(IDS_COLUMN, i+1);
colId = refCtrl.InsertColumn(nCol, str, LVCFMT_LEFT, 100);
nCol++;
}
m_ColSortOrder.SetSize(nCol);
// ... and fill in text
for( j="0"; j
{
str.Format(IDS_CELL, i+1, j+1);
iActualItem = refCtrl.InsertItem(j, str);
for( i="0" ; i
{
str.Format(IDS_CELL, i+1, j+1);
refCtrl.SetItemText(iActualItem, i, str);
}
}
DWORD dwStyle = refCtrl.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
dwStyle |= LVS_EX_HEADERDRAGDROP| LVS_EX_GRIDLINES;
dwStyle |= LVS_EX_FULLROWSELECT;
refCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle);
SetRedraw(TRUE);
}
20. 请教关于 c++ 的 combo box 的用法
Reference: http://zhidao.baidu.com/question/3937015.html
我在对话框中添加了一个
combo box
,请问如何在程序里动态增加,删除列表(
item
),以及如何获取用户当前选择的是哪个列表,请说明的详细一点,请用非
MFC
的方法。
谢谢!!
可以调用 SendMessage 函数来实现这些功能
增加一个列表项 CB_ADDSTRING
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_ADDSTRING, // message ID
(WPARAM) wParam, // = 0; not used, must be zero
(LPARAM) lParam // = (LPARAM) (LPCTSTR) lParam;
);
lParam 指向一个以 null 结束的字符串,将被加入的列表项
删除一个列表项 CB_DELETESTRING
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_DELETESTRING, // message ID
(WPARAM) wParam, // = (WPARAM) () wParam;
(LPARAM) lParam // = 0; not used, must be zero
);
wParam 指定将被删除列表项的下标 ( 从 0 开始 )
取得选定的项 CB_GETCURSEL
lResult = SendMessage( // returns LRESULT in lResult
(HWND) hWndControl, // handle to destination control
(UINT) CB_GETCURSEL, // message ID
(WPARAM) wParam, // = 0; not used, must be zero
(LPARAM) lParam // = 0; not used, must be zero
);
返回值了 lResult 包含了当前被选择的列表项的下标 ( 从 0 开始 )
参考资料: microsoft msdn
1. 你在编辑状态下点那个控件的向下的三角形,就出冒出来一个可以调高度的东东。将高度调高,否则在执行时会不能显示下拉选项。
2. 2. 为 combo box 添加选项,在编辑状态下选 combo box 控件的属性,选 Data 标签,在编辑框中添加选项,按 Ctrl-Enter 来添加下一个选项。
3.
3.
为
combo box
添加变量
combo box
有两个变量,
CComboBox
类变量和
CString
变量。
CComboBox
变量用来设置
combo box
的属性,一般在
cdialog
类中的
oninitdialog()
函数中使用。添加方法是在
classwizard
中添加变量,添加时
Category
中选
Control
。例如:
CComboBox.SetCurSel(0)
用来设置下拉菜单初始值,具体看
MSDN
。
CString
变量用来存储下拉菜单所选的选项值。同样,当选项发生变化时要使用
UpdateData(TRUE)
函数更新该变量的值。
21. 指针类型转换
我们已经知道,指针的值就是指针指向的地址,在
32
位程序中,指针的值其
实是一个
32
位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象
下面的语句:
unsignedinta;
TYPE*ptr;//TYPE
是
int
,
char
或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//
我们的目的是要使指针
ptr
指向地址
20345686
(十进制
)
ptr=a;//
我们的目的是要使指针
ptr
指向地址
20345686
(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到
了吗?不,还有办法:
unsignedinta;
TYPE*ptr;//TYPE
是
int
,
char
或结构类型等等类型。
...
...
a=
某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a
;
//
呵呵,这就可以了。
严格说来这里的
(TYPE*)
和指针类型转换中的
(TYPE*)
还不一样。这里的
(TYP
E*)
的意思是把无符号整数
a
的值当作一个地址来看待。
上面强调了
a
的值必须代表一个合法的地址,否则的话,在你使用
ptr
的时候
,就会出现非法操作错误。
想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完
全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个
整数当作一个地址赋给一个指针:
例十六:
inta=123,b;
int*ptr=&a;
char*str;
b=(int)ptr;//
把指针
ptr
的值当作一个整数取出来。
str=(char*)b;//
把这个整数的值当作一个地址赋给指针
str
。
好了,现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以
把一个整数值当作地址赋给一个指针。
- LONG A 32-bit signed integer.
- LPARAM A 32-bit value passed as a parameter to a window procedure or callback function.
- LPCSTR A 32-bit pointer to a constant character string.
- LPSTR A 32-bit pointer to a character string.
- LPCTSTR A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
- LPTSTR A 32-bit pointer to a character string that is portable for Unicode and DBCS.
- LPVOID A 32-bit pointer to an unspecified type.
- LRESULT A 32-bit value returned from a window procedure or callback function.
- UINT A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32.
- WNDPROC A 32-bit pointer to a window procedure.
- WORD A 16-bit unsigned integer.
- WPARAM A value passed as a parameter to a window procedure or callback function: 16 bits on Windows versions 3.0 and 3.1; 32 bits on Win32.
Data types unique to the Microsoft Foundation Class Library include the following:
- POSITION A value used to denote the position of an element in a collection; used by MFC collection classes.
- LPCRECT A 32-bit pointer to a constant (nonmodifiable) RECT structure.
CString str="uhsajflkj";
BYTE king[20];
king = (BYTE )str.GetBuffer(Str.GetLength());
相关推荐
这个“机器学习0深度学习最全总结.zip”压缩包文件包含了关于这一主题的详细资料,主要分为两个部分:Tensorflow与深度学习HTML和机器学习课件HTML。下面我们将深入探讨这两个方面的知识。 一、Tensorflow与深度...
"0嵌入式学习0.pdf"可能是一份详细的嵌入式Linux和Android学习指南,涵盖上述所有内容。通过阅读这份文档,初学者可以系统地规划自己的学习路径,逐步掌握嵌入式领域的核心技术,从而在这一领域建立起坚实的基础。...
window编程学习笔记
深度学习概述、开发技能、开源框架和应用前景 深度学习是当前计算机科学领域最前沿和最具神秘色彩的学科。自2006年以来,人工智能领域随着云计算对大数据的并行处理能力的支持,其算法也取得突破性进展。这篇文章将...
JAVA学习教程
c#入门经典,0基础学习 c#入门经典,0基础学习 c#入门经典,0基础学习
深度学习:学习率规划-余弦退火CosineAnnealing和WarmRestart原理及实现 深度学习中的学习率规划是指在模型训练过程中,适时地调整学习率,以达到更好的模型收敛和泛化能力。其中,余弦退火CosineAnnealing和...
ansys fluent 16 0 超级学习手册光盘案例文件资源分享
2. 逻辑回归:尽管名字里有“回归”,但它实际上是用于分类问题的,特别是二分类问题,通过Sigmoid函数将线性输出转化为0和1之间的概率。 3. 决策树:基于特征的树状模型,通过一系列规则进行预测,易于理解和解释。...
1机器学习0大经典算法,包括: k-means, SVM, 贝叶斯,kNN,EM,决策树等,内容十分详细
它通过sigmoid函数将线性模型的输出映射到(0,1)之间,形成概率预测。支持向量机(SVM)则是一种强大的分类模型,它通过构造最大边距超平面来划分数据,能够处理高维数据并具有很好的泛化能力。决策树和随机森林是...
M0学习资料.xlsx
《机器学习实战源码》是一份专为初学者设计的资源包,旨在通过实践帮助学习者深入理解机器学习的原理和应用。这份压缩包包含了四个精心设计的实战项目,每个项目都提供了清晰、简洁的代码,并附有详尽的注释,确保...
在探讨李宏毅深度学习学习笔记Task0的内容之前,我们需要对深度学习的基本概念有所理解,然后才能根据笔记内容提取具体的知识点。深度学习是机器学习领域的一个分支,它通过建立、训练和应用多层的人工神经网络来...
np.random.random函数则生成[0,1)之间的随机浮点数。 从学习笔记的内容来看,个人对机器学习的入门知识点掌握较为全面,涵盖了从基本概念到技术应用、以及编程实践的多个方面,对于初学者而言,这些知识可以作为...
TD(0)是最基础的形式,还包括SARSA(State-Action-Reward-State-Action)和Q-learning等变体。 5. Q-learning:Q-learning是一种离策略的强化学习算法,它学习的是一个Q表,用于估计在给定状态下执行每个动作的未来...
更新参数:\(\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1)\),其中 \(\alpha\) 是学习率。 4. 重复步骤2和3直到收敛。 - **注意事项**:选择合适的学习率至关重要,...
该算法的目标是让TD error 尽量近似于 0,TD error 是预测值和真实值之间的差异。 策略学习: 策略学习是强化学习的一个重要组成部分。策略学习的目标是学习一个策略函数,以选择最优的动作。策略学习的方法包括...
虽然名字中有“回归”,但其输出是概率值,通过Sigmoid函数将线性预测转换为(0,1)区间内的概率。逻辑回归在医药、市场分析等领域有广泛应用。 4. **神经网络** 神经网络是模拟人脑神经元结构的计算模型,由多个...
逻辑回归的模型本质上是一个线性回归模型,但逻辑回归可以减小预测范围,将预测值限定为 [0,1]。 10. XGBoost 的优势 XGBoost 使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准。使用泰勒展开取得二阶倒数...