博文

[置顶] CListCtrl 取消label(2012-11-22 17:57:00)

摘要: 有时候,CListCtrl用来显示图片的时候,ICON模式下,不想看到label,即使把字体设为"",仍然可以看到文字区域。于是很多做法都出现了   (1)SetIconSpacing。这个函数在横排排列的时候,似乎很有用,一到竖排,乱七八糟,诡异的很。 (2)将ListCtrl的Font大小设置为-1,行么?   实际上,在WinXp之后CListCtrl就增加了扩展风格:LVS_EX_HIDELABELS   int nStyle = m_thumbnailVList.GetExtendedStyle(); m_thumbnailVList.SetExtendedStyle(nStyle | LVS_EX_HIDELABELS | LVS_EX_DOUBLEBUFFER);   设置即可。 ......

阅读全文(2552) | 评论:2

C# 控件 Anchor(2012-11-27 19:07:00)

摘要: 拉动对话框size时,总是几个控件跟着动,很烦人,又没找到原因。   原来C#所有的控件都提供Anchor,也就是自己跟随着动。如果要保持不动的话,只要让其都固定为Top,Left即可。 ......

阅读全文(2286) | 评论:1

VC CComboBox 获得手动输入(2011-03-31 11:06:00)

摘要:设置为Dropdown风格即可手动输入。 手动输入值用GetWindowText获得即可。不要用什么GetCurSel,GetLBText等。......

阅读全文(2721) | 评论:1

ON_NOTIFY/ON_NOTIFY_REFLECT/ON_NOTIFY_RE(2011-02-17 14:25:00)

摘要:ON_NOTIFY : Comes from a child control to the parent. This macro goes in the parent's message map.
ON_NOTIFY_REFLECT: Comes from a child control, but is "reflected" back to the child (by the parent)
so the child can handle its own notification. This macro goes in the child's message map.
ON_NOTIFY_REFLECT_EX: Same as previous, except that the handler function returns a BOOL, indicating whether or not the message should be routed on to parent classes for possible handlers. Note   that   the   reflected   message   is   handled   before   the   notification   message.
   ......

阅读全文(4417) | 评论:0

取消或者注册dll与ocx(2011-01-07 11:29:00)

摘要:经常要注册或者取消dll与ocx,老是输入cmd命令太麻烦,于是新建两个右键快捷菜单,方便多了。   1、打开注册表      依次打开 “开始/运行”,输入“regedit” 
2、添加右键注册dll组件快捷菜单     依次打开“HKEY_CLASSES_ROOT\Dllfile”,右键选择“新建项”,新建项“shell”(如果已经有了则不用新建),再在其下以同样的方法新建“Register”。其中,“Register”就是对.dll或.ocx右键弹出的菜单中项名,再在其下建“command”,双击“默认值”将其改为“Regsvr32 %1”。
3、添加右键取消注册dll组件快捷菜单    依次打开“HKEY_CLASSES_ROOR\Dllfile\shell”,右键选择“新建项”,新建项“Unregister”。其中,“Unregister”就是对.dll或.ocx右键弹出的菜单中的选项名,再在其下建“command”,双击“默认值”将其改为“Regsvr32 %1 /u”。
4、对ocx的注册和取消注册     同理,需要注意的是把上面2和3中的“Dllfile”改为“Ocxfile”即可。    5、 桌面F5刷新。找一个dll或者ocx文件,右键试一下吧。多方便!   6、 郑重声明:该方法对路径中有空格的失效,比如路径名中包含C:/Program Files的。只能通过cmd命令搞定。   其他技巧: 如果硬要输入cmd命令,则需要输入regsvr32 + ocx或者dll的绝对路径。可以复制该路径。也可以直接将ocx或者dll文件拖入cmd窗口,自动得到路径,较为方便。  ......

阅读全文(7200) | 评论:1

CListCtrl的LVN_GETDISPINFO更新问题(2010-11-24 15:17:00)

摘要:    对CListCtrl真是又爱又恨,每用一次都会发现新问题,每解决一个问题都会有新的收获。真想好好一下总结这些年对CListCtrl的知识积累,推出一个小系列。等有空啦。。。       这次碰到的问题是LVN_GETDISPINFO。 我们知道,响应LVN_GETDISPINFO消息后我们可以通过结构体内容去更新列表控件,使更新CListCtrl内容变得非常简单了,尤其是可以定义自己的输出格式,例如小数点几位、字典对应等。但是我发现只有每次插入的时候(InsertItem)会触发该消息,但是当我对已有的item直接改变其关联的内存结构,却发现界面根本没有更新。难道消息没有触发?       我惊讶的发现消息实际上触发了。因此响应函数(OnGetdispinfoList1)里面的代码肯定出了问题。   void CNavigationInOutDoorInPutDlg::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
 // TODO: Add your control notification handler code here  int iItem = pDispInfo->item.iItem;
 int iSubItem = pDispInfo->item.iSubItem;
 C3DNaviKeyNode *pNode = (C3DNaviKeyNode *)m_inputNodeList.GetItemData(iItem);
 
 if(pDispInfo->item.mask & LVIF_TEXT)
 {
  if(iSubItem == 0)
  {
 ......

阅读全文(7103) | 评论:0

CListBox自绘与刷新(2010-06-03 21:28:00)

摘要:
CListBox自绘的具体步骤就不再详述了,不过还是要留意以下几点:   LBS_OWNERDRAWVARIABLE:允许每一项有不同的长度。要想改变某一项的高度,通过MeasureItem无法做到(宽度可以)。需要用到函数SetItemHeight。   LBS_NOTIFY:只有加入该风格,CListBox才能响应双击等消息。   DrawItem:核心自绘函数。不过并不建议直接使用CListBox的DC来绘制,而是采用双缓冲的方式,可以有效的在Invalidate(FALSE)时减小刷新。   本文主要介绍实际应用中的一种情况。有些时候,当双击CListBox某一项的时候,我们希望它能展开,显示更多的信息;再次双击一下,能够收缩,回到正常状态。功能的具体实现很简单,只需要调用SetItemHeight实时调整大小,在DrawItem判断该项是否为展开项来进行显示。       但是,在刷新显示的时候碰到一个问题。当双击收缩最后一项时,如果调用Invalidate(TRUE),自然会产生轻微的闪烁;本文采用了Invalidate(FALSE)来避免闪烁,却发现最后一项收缩后显示正常,但是刚才扩展的区域,因为未刷新,仍然显示刚才的内容,这种效果显然是不正确的。造成的主要原因是因为DrawItem只会负责绘制该项的区域,如果不实时改变每项的高度,这已经足够了;但是由于每项高度在双击后会改变,因此其有义务维护上一次该项的绘制区域。   因此一个技巧就是在绘制最后一项时,判断其是否因为收缩而需要刷新,如果是,则利用双缓冲绘制时,需要绘制从该项往下整个客户区(或者展开区域);如果不是,则绘制其实时区域。         核心代码如下:         // 如果不是最后一项 绘制其实时区域(展开或者收缩)        if(lpDrawItemStruct->itemID != GetCount() - 1)   &......

阅读全文(6509) | 评论:2

Invalidate、UpdateWindow、Z-order、显示顺序(2010-05-17 10:50:00)

摘要:   在一个Dialog的OnPaint按照下面的方法实现:       void   CMyDialog::OnPaint()     {             CWnd*   pWnd   =   GetDlgItem(IDC_STATIC1);             CDC*   pDC   =   pWnd->GetDC();             pWnd->Invalidate();     //??????????             pWnd->UpdateWindow();   //????????????             pDC->SelectStockObject(BLACK_BRUSH);             pDC->Rectangle(0,0,10,10);             pWnd->ReleaseDC(pDC);     }   &nbs......

阅读全文(6228) | 评论:2

关于CTreeCtrl背景图在动态添加节点时的移动问题(2010-03-17 18:38:00)

摘要:CTreeCtrl背景图的实现在网上已经有很多了,比较著名的是这两篇:
http://www.vckbase.net/document/viewdoc/?id=355
http://www.codeguru.com/Cpp/controls/treeview/misc-advanced/article.php/c679/   这俩篇都实现了最基本的绘制,以及收缩和展开节点时候的刷新问题,后一篇还处理了滚动条刷新问题。这里提几点自己的实验体会,与大家共享:
(1)OnEraseBkgnd和OnPaint中的处理过程基本相同。 (2)在动态添加子项时(InsertItem),如果是插入到父节点的第一个子节点,处理OnTvnItemexpanding和OnTvnItemexpanded,刷新正常。但是如果是开始插入第二个子节点,那么不会响应OnTvnItemexpanding和OnTvnItemexpanded(因为父节点已经展开),因此会发现背景图产生偏移。这是由于InsertItem时未刷新导致的。因此只需要在调用代码InsertItem前加上下面一句即可:
m_treectrl.SetRedraw(TRUE);   (3)滚动条滚动刷新时 与(2)是同样的原理,要调用SetRedraw   (4) http://www.codeproject.com/KB/GDI-plus/what_is_a_basename_.aspx 处理了一般CTreeCtrl等控件闪烁的问题,很为实用......

阅读全文(4010) | 评论:2

CListCtrl行高的修改(2010-03-09 14:43:00)

摘要:网上修改CListCtrl项高度的方法一般是扩大字体,及用图片将项高度撑大.这两种方法虽然简单,但是效果却不是很理想.一种比较理想的方法是自画CListCtrl,不过方法相对来说比较复杂.要修改CListCtrl的列表项高度,我们需要自己添加 MeasureItem 的消息响应函数,对应的消息是 WM_MEASUREITEM+WM_REFLECT_BASE, 而不是 WM_MEASUREITEM.在CListBox里我们可以直接在 ClassWizard 里将此消息响应添加进 class 里,但是 CListCtrl 默认是没有这个消息响应的,我们需要手动添加它(注意,这里不是 WM_MEASUREITEM. CListCtrl 仅有 WM_MEASUREITEM, 对应的函数为 OnMeasureItem).为了响应这个消息,我们还需要给列表加上 LVS_OWNERDRAWFIXED 风格.可以在 Create 列表的时候添加,也可以在 PreCreateWindow 虚函数中添加.添加 MeasureItem 消息响应函数,首先我们需要在类的头文件中添加:afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);来声明此消息响应函数;然后在cpp的消息响应宏中添加:ON_WM_MEASUREITEM_REFLECT()最后自己建立 MeasureItem 的函数定义://///////////////////////////////////////////////////////////////////////////
// CListEx message handlersvoid CListEx::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if( m_nItemHeight > 0 )
   lpMeasureItemStruct-&g......

阅读全文(5935) | 评论:0