VC编程小技巧之列表框

1.列表框中标题栏(Column)的添加

创建一个List Control,其IDIDC_LIST,在其Styles属性项下的View项里选择ReportAlign项里选择TopSort项里选择None.

然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:

CString strname[3];

strname[0]="Screen Name";

strname[1]="Form ID";

strname[2]="Category Path";

for(int i=0;i<3;i++)

{

m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);

}

在这之前也要将List ControlIDClistCtrl的对象m_listDoDataExchange(CDataExchange* pDX)函数里绑定,如下:

DDX_Control(pDX, IDC_LIST, m_List);

 

2.怎么防止在列表框中添加非常多数据出现不停的刷新?

  [问题提出]
    listbox添加非常多数据的时候,由于控件不停的刷新,导致出现闪烁,怎么解决?
  [解决方法]
    再添加数据以前,禁止控件刷新,数据添加完毕以后,再刷新一次。
  [程式实现](其中:m_ListBoxCListBox的控件类型的变量)
    m_ListBox.LockWindowUpdate();//禁止本listbox刷新。
    for(int i=0;i<9999;i++)
    {
         m_ListBox.AddString("test");
    }//添加数据。
    this->RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

 

3.列表框中选择变化时怎么获得通知?

我在Report View中使用了一个CListCtrl(自绘制类型),我想知道什么时候选择项发生了改动.

在选择项变化时,能使用按钮有效或失效,按如下操作:

  加入LVN_ITEMCHANGED消息处理.
void CYourClassNameHere::OnItemchangedEventList(NMHDR* pNMHDR, LRESULT* pResult)
{
  NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
  *pResult = 0;

if (pNMListView->uChanged == LVIF_STATE)

{
    if (pNMListView->uNewState)

{
        GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);

}
     else

{
        GetDlgItem(IDC_DELETE)->EnableWindow(FALSE);
    }
  }

}

 

4.列表框控件中整栏选择?

我在处理List控件时碰到了麻烦,我想创建一个ListView,来依据Tree控件的选择同时在ListViewReportView中显示列表的信息.以下是相关的代码:

// Set full line select
ListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(),
LVS_EX_FULLROWSELECT);

按如下方法处理:

// -------------------- begin of snippet --------------------------------
bool CCommCtrlUtil32::ListCtrl_ModifyExtendedStyle(CListCtrl& p_rListCtrl,
                                   const DWORD p_dwStyleEx,
                                   const bool p_bAdd)
{
    HWND t_hWnd = p_rListCtrl.GetSafeHwnd();
    DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);

    if(p_bAdd)
    {
        if(0 == (p_dwStyleEx & t_dwStyleEx))
        {
            // add style
            t_dwStyleEx |= p_dwStyleEx;
        }
    }
    else
    {
        if(0 != (p_dwStyleEx & t_dwStyleEx))
        {
            // remove style
            t_dwStyleEx &= ~p_dwStyleEx;
        }
    }

    ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);

return true;
}

 

5.怎么双击列表框项启动一个和文件关联的程式?

有人问我怎么双击列表框项启动一个程式?其实这个问题非常简单,视窗系统中有一个API函数能打开所有类型的文件:

ShellExecute(NULL,"open",lpFileName,NULL,NULL,SW_SHOWNORMAL);

参数 lpFileName 是文件的全路径名。用这个变量你能传递象“C:\\MyExcelFile.xls”或“http://www.vckbase.com”启动Excel程式或浏览器程式。如果你只是想获取和文件关联的程式名,而不是要运行程式,那么调用::FindExecutable就能了。

 

6.怎么得到列表框中所选择项的String?

  [问题提出]
  怎么得到CListBox所选择项的String
  [解决方法]
  用到:CListBox::GetText()
  [程式实现]
  CString scInfo;
  pList->GetText( GetCurSel(),scInfo);

 

7.锁定ListView的栏目头宽度

编译:NorthTibet

   世界之大,真是无其不有。视窗系统 应用程式的GUI标准明确规定了 ListView 栏目头(Column Header)的宽度必须是可调整的,这本来是专门为用户考虑而设计的控制特性,可是偏偏就有用户拒绝这样的特性。作为技术人员,用户的需求是非常难拒绝的。尽管这明显是一种非典型性需求。本文将通过一个实例来示范怎么实现 ListView Column Header 宽度的锁定。
    ListView 及其 Column Header 实际上都是 视窗系统 通用控件(Comctl32.dll) 的一部分。所以查一查 MSDN 中和“Header Control”相关的控件资料不难发现,栏目头的锁定和否和几个 视窗系统 的通知消息密切相关,这几个消息分别是 HDN_TRACKHDN_BEGINTRACK HDN_ENDTRACKA。其中 HDN_BEGINTRACK 是本文要特别关照的一个。当用户在栏目头上拖拽鼠标时,如果位置正好在改动宽度的分割条上,则栏目头控件会向其父窗口发送一个 HDN_BEGINTRACK 通知消息。为了实现栏目头宽度的锁定,就必须搞掂这个通知消息。不能将他传递到父窗口,不过,这个消息和 视窗系统 中形形色色的其他通知消息相同,有两个版本:一个版本是 HDN_BEGINTRACKW,专门用于宽字符和 Unicode 字符集;另一个版本是 HDN_BEGINTRACKA,专门用于 ANSI 字符集。这两个版本的使用方法能从公共控件的头文件 commctrl.h 中获取:

// From commctrl.h
#ifdef UNICODE
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#else
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#endif     

    所以在实现对消息的 HDN_BEGINTRACK 处理时,实际上是根据 UNICODE 的取值实现对 HDN_BEGINTRACKA HDN_BEGINTRACKW 的处理。那么 Header Control 到底是发送的哪一个消息呢?在这里必须明白:Header Control 视窗系统 通用控件的一部分,他的实现都在 comctl32.dll 动态链接库中。由于这个 DLL 已被编译成可执行代码,因此在工程中修改 UNICODE 的设置将无济于事。怎么知道栏目头控件发送哪一个版本的通知消息呢?是 A 版本还是 W 版本?
    为了找到答案,我们必须求助一个经常被遗忘的消息 WM_NOTIFYFORMAT。一般控件第一次被创建时,都要向父窗口一个消息询问父窗口需要哪个版本的通知消息。然后父窗口返回 NFR_ANSI NFR_UNICODE。如果父窗口不处理 WM_NOTIFYFORMAT,那么这个消息将根据父窗口或对话框本身的最佳选择项被传递到 视窗系统 DefWindowProc 消息处理例程进行默认处理。默认为 UNICODE。因此,要知道通知消息的版本,必须处理 ListCtrl WM_NOTIFYFORMAT。为了确认父窗口的返回值,你能做一个试验便明白了。
    如果你不想处理 WM_NOTIFYFORMAT 消息,那么完万能通过双双实现 HDN_BEGINTRACKA HDN_BEGINTRACKW 通知消息的处理来简化问题的解决方案,同时这种方法也更可靠和通用。此时代码将同时支持 ANSI Unicode。本文附带的例子程式示范了这种方法的实现。如图一所示:

图一 锁定栏目头宽度

    实现代码非常简单,Header 控件发送 HDN_XXX 到父窗口(ListCtrl),在 MFC 中能利用消息反射来处理 Header 控件的通知消息。因为可锁定栏目头特性本身更趋向于 Header 控件的属性,而不是 ListCtrl 属性。如果你不用 MFC ,那么就得处理 ListCtrl 中的通知消息。例子程式使用了消息反射机制,在 Header 控件的消息映射使用 ON_NOTIFY_REFLECT,也就是该写虚拟成员函数 OnChildNotify

BOOL CLockableHeader::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
{
     NMHDR& nmh = *(NMHDR*)lp;
     if (nmh.code==HDN_BEGINTRACKW || nmg.code==HDN_BEGINTRACKA)
         return *pRes=TRUE;
     ......
}

    因为 OnChildNotify 是虚函数,所以没有必要具有消息映射入口。只要实现此函数即可。在所有应用中,Header 发送的消息非此即彼,不会两者都发送。不管怎样,所发送的通知消息在到达父窗口之前都会被吃掉。也就是说,消息处理总是返回 TRUE,是否锁定栏目头的宽度通过一个标志来控制:应用程式通过 Lock 来修改标志的值。
如果锁定了头宽度,那么同时也必须禁用改动宽度的光标,这样用户界面才会有一致性,要实现这一点也非常简单:

BOOL CLockableHeader::OnSetCursor( CWnd* pWnd, UINT nHit, UINT msg)
{
     return m_bLocked ? TRUE : CHeaderCtrl::OnSetCursor(pWnd, nHit, msg);
}      

    如果栏目头被锁定,则 OnSetCursor 返回 TRUE,此时光标不会被重新设置,否则由 Header 控件的进行默认处理。锁定宽度后,当鼠标移到栏目头上时,视窗系统 显示标准的箭头光标,而不是带左右箭头光标。
    CHeaderCtrl 派生类出来的类的使用方法和处理对话框控制相同,通过在父窗口的 OnCreate 的处理例程中进行子类化。实现细节请参考例子原始码:

     
// CMyView is derived from CListView
int CMyView::OnCreate(LPCREATESTRUCT lpcs)
{
  VERIFY(CListView::OnCreate(lpcs)==0);
  return m_header.SubclassDlgItem(0,this) ? 0 : -1;
}

    由于 Header 控制的资源 ID = 0,所以上面的代码是行得通的。为了有一个友好的用户界面,例子程式创建了一个命令菜单和界面更新处理例程。如图一所示。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一些VC编程技巧 Visual C++编程技巧精选(缺57-67) 1. 如何获取应用程序的实例句柄? 2. 如何通过代码获得应用程序主窗口的指针? 3.如何在程序中获得其他程序的图标? 4.如何编程结束应用程序?如何编程控制windows的重新引导? 5.怎样加载其他的应用程序? 6. 确定应用程序的路径 7. 获得各种目录信息 8. 如何自定义消息 9. 如何改变窗口的图标? 10. 如何改变窗口的缺省风格? 11. 如何将窗口居中显示? 12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 13. 如何使程序保持极小状态? 14. 如何限制窗口的大小? 15. 如何使窗口不可见? 16. 如何使窗口始终在最前方? 17、如何创建一个字回绕的CEditView 18、通用控件的显示窗口 19、移动窗口 20、重置窗口的大小 21、如何单击除了窗口标题栏以外的区域使窗口移动 22、如何改变视窗的背景颜色 23、如何改变窗口标题 24、如何防止主框窗口在其说明中显示活动的文档名 25、如何获取有关窗口正在处理的当前消息的信息 26、如何创建一个不规则形状的窗口 27、如何在代码中获取工具条和状态条的指针 28、如何使能和禁止工具条的工具提示 29、如何设置工具条标题 30、如何创建和使用无模式对话框 31、如何在对话框中显示一个位图 32、如何改变对话或窗体视窗的背景颜色 33、如何获取一个对话控件的指针 34、如何禁止和使能控件 35、如何改变控件的字体 36、如何在OLE控件中使用OLE_COLOR数据类型 37、在不使用通用文件打开对话的情况下如何显示一个文件列表 38、为什么旋转按钮控件看起来倒转 39 为什么旋转按钮控件不能自动地更新它下面的编辑控件 40、如何用位图显示下压按钮 41、如何一个创建三态下压按钮 42、如何动态创建控件 43、如何限制编辑框中的准许字符 44、如何改变控件的颜色 45、当向列表框中添加多个项时如何防止闪烁 46、如何向编辑控件中添加文本 47、如何访问预定义的GDI对象 48、如何获取GDI对象的属性信息   49、如何实现一个橡皮区矩形 50、如何更新翻转背景颜色的文本 51、如何创建一个具有特定点大小的字体 52、如何计算一个串的大小 53、如何显示旋转文本 54、如何正确显示包含标签字符的串 55、串太长时如何在其末尾显示一个省略号 56、如何快速地格式化一个CString对象 68. VC1.5下如何跳到第一事例? 69. 为什么VC++2.0中使用文件对话框会死机? 70. 在VC++1.5中如何new一个大数组? 71. 在VC1.5中,如何得到子窗口在主窗口中的相对坐标? 72. VC1.5 如何调用进程? 73. VC++1.5编Win3.1程序能否实现全局跳转? 74. 如何在DLL用自定义窗口? 75. 如何让TOOLTIP的字体变大? 76.怎样更换wallpaper. 77.写打印机Preview需要用什么函数? 78.用MFC写了一个控件,如何在另一个县城里发事件? 79.关于DIADOG背景图象 80.如何显示随光标移动的提示窗口 81.怎么用VC++5.0来编写图像打印程序,我的程序是基于对话框的 82.请问怎样象Winzip一样,给Win95自己的PopMenu中添加Item. 83.问如何在Tree空件上实现点右健选中Item并下拉出菜单,如同VC5中的Workspce窗口. 84.我想在CDialog类中的树控件中响应右键弹起这一消息 85.怎样在程序中启动缺省浏览器,并进入某一网址 86.建立一束特殊效果的黑光在 Direct3D 87.列表显示所有网上邻居 88.怎样在一个应用程序中加载另一个应用程序 89.如何获得当前时间
### 回答1: 雷达目标跟踪是指利用雷达技术获取目标的运动状态,并通过计算机算法在雷达图像中对目标进行跟踪。对于目标跟踪的实现,VC编程是一种常用的编程语言,可用于实现图像处理和计算机视觉算法。 VC编程是一种C++语言的变体,拥有许多图形操作函数和库,使其具有方便快捷的图像处理能力。在雷达目标跟踪方面,VC可以对雷达获得的目标信息进行处理,提取目标运动状态信息,并进行目标跟踪。 VC编程还提供了强大的计算机视觉算法库,包括卡尔曼滤波器、粒子滤波器、背景减除等算法。这些算法可以用于提高雷达目标跟踪的精度和实时性。 总之,VC编程是一种强大的编程语言,可以为雷达目标跟踪提供可靠的技术支持。通过VC编程实现雷达目标跟踪,可以提高目标检测和跟踪的精度和效率,为实现精确的雷达指挥控制提供有力保障。 ### 回答2: 雷达目标跟踪是指利用雷达技术对目标的运动状态进行跟踪,以实现目标的识别、定位和追踪等任务。在雷达目标跟踪中,可以采用各种算法和技术,如卡尔曼滤波、粒子滤波、神经网络等,来实现目标的跟踪。 其中,vc编程是一种常用的编程语言,可以应用于实现雷达目标跟踪功能。通过vc编程语言,可以实现数据处理、算法设计、界面设计等功能,使得雷达目标跟踪系统具有更高的可靠性和灵活性。在vc编程中,常用的开发平台包括VC++、MFC、QT等,可以根据具体需求选择合适的平台进行开发。 在实现雷达目标跟踪的过程中,vc编程可以帮助开发人员将雷达数据处理、目标检测、目标识别、追踪等功能进行集成,同时还能通过图形化界面展示和处理数据。此外,通过优化算法和程序设计,还可以提高系统的运行效率和稳定性,满足不同应用场景的需求。 综上所述,雷达目标跟踪vc编程是一个精细和复杂的过程,需要综合运用雷达技术、算法设计和vc编程等知识。只有通过对相关技术熟练掌握和实践,才能构建出高效、可靠和可控的雷达目标跟踪系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值