(转)MFC学习技巧<三>

31. 如何在编辑控件中以追加的方式添入字符?
 [问题提出]
  SetDlgItemText可以向Edit控件中输入字符,发送更新的消息也可是Edit控件显示与其关联的变量的值,但若是向已有的Edit字符后追加字符,该如何做?
 [程序实现]
  建立名为My的对话框工程,添加一个Edit和一个Button控件.Edit的ID=IDC_EDIT1,Button的ID=IDC_BUTTON1.建立和IDC_BUTTON1的响应函数:OnButton1()

  void CMyDlg::OnButton1() 
  {
    CString pText="你好";
    CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);
    int nLen=m_Edit->GetWindowTextLength(); 
    m_Edit->SetFocus(); 
    m_Edit->SetSel(nLen, nLen); 
    m_Edit->ReplaceSel(pText); 
  }

在Edit控件中输入字符,想追加时按IDC_BUTTON1按钮.看看效果.


32.属性页标题改名
我用CPropertySheet创建属性页,用的CPropertyPage对象只有一个,也就是每个属性页的内容一样.现在的问题是:这样每个属性页的标题都是一样的,是对话框的标题!怎样动态的改变这个标题,使每个属性页的标签的名称都不同??

CTabCtrl * pCtrl = pSheet->GetTabControl();
TCITEM tc;
tc.mask = TCIF_TEXT;
tc.pszText = "新标题";
pCtrl->SetItem(0,&tc);//0即是你要改的TAb的索引

33. 怎样去掉属性页的Apply与Help按钮?

//去掉Help
  m_psh.dwFlags |= PSH_HASHELP ;
  m_psh.dwFlags &= ~PSH_HASHELP ;
//除掉应用按钮 
m_psh.dwFlags|=PSH_NOAPPLYNOW; 


34. 如何给树控件加入工具提示
1.首先给树控件加入TVS_INFOTIP属性风格,如下所示:

if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|
  TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP, //加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100)
   CRect(0, 0, 0, 0), &m_wndTreeBar, 100))
  {
   TRACE0("Failed to create instant bar child\n");
   return -1;
  }


2.其次加入映射消息声明,如下所示:

afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult);    //树控件上加入提示消息,jingzhou xu  
ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip)       //树控件条目上加入提示,jingzhou xu


3.最后加入呼应涵数处理:

void CCreateTreeDlg::OnGetInfoTip(NMHDR* pNMHDR, LRESULT* pResult) 
 {
 *pResult = 0;
 NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR;
 LPARAM itemData = (DWORD) pTVTipInfo->lParam;
 //对应每个条目的数据
 HTREEITEM hItem = pTVTipInfo->hItem;
 CString tip;
 HTREEITEM hRootItem = m_chassisTree.GetRootItem();
 if (hRootItem != pTVTipInfo->hItem)
 {
  tip = "树结点的提示";
 }
 else
 {
  tip = "树根上的提示";
 }
 strcpy(pTVTipInfo->pszText, (LPCTSTR) tip);
}


35. 如何在TreeList中加图标?
 [问题提出]
 请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀?
 [解决方法]
 1)

  HICON hicon[8];
  m_imageList.Create(16,16,0,8,8);
  hicon[0]=AfxGetApp()->LoadIcon(IDI_ICON0);
  hicon[1]=AfxGetApp()->LoadIcon(IDI_ICON1);
  hicon[2]=AfxGetApp()->LoadIcon(IDI_ICON2);
  hicon[3]=AfxGetApp()->LoadIcon(IDI_ICON3);
  hicon[4]=AfxGetApp()->LoadIcon(IDI_ICON4);
  hicon[5]=AfxGetApp()->LoadIcon(IDI_ICON5);
  hicon[6]=AfxGetApp()->LoadIcon(IDI_ICON6);
  hicon[7]=AfxGetApp()->LoadIcon(IDI_ICON7);
  for(int n=0;n<8;n++)
    m_imageList.Add(hicon[n]);
  CTreeCtrl *pTree=(CTreeCtrl *)GetDlgItem(IDC_TREE);
  pTree->SetImageList(&m_imageList,TVSIL_NORMAL);

 2)

    CImageList cil1;
  cil1.Create(32,32,TRUE,2,2);
  cil1.Add(pApp->LoadIcon(IDI_DAO1));
  cil1.Add(pApp->LoadIcon(IDI_DAO2));
  cil1.Add(pApp->LoadIcon(IDI_DAO3));
  cil1.Add(pApp->LoadIcon(IDI_DAO4));
  cil1.Add(pApp->LoadIcon(IDI_DAO5));
  cil1.Add(pApp->LoadIcon(IDI_DAO6));
  cil1.Add(pApp->LoadIcon(IDI_DAO7));
  cil1.Add(pApp->LoadIcon(IDI_DAO8));
  cil1.Add(pApp->LoadIcon(IDI_DAO9));
  //设置图象列表
  m_list.SetImageList(&cil1,LVSIL_NORMAL);


36. 如何双击列表框项启动一个与文件关联的程序?
有人问我如何双击列表框项启动一个程序?其实这个问题很简单,Windows中有一个API函数可以打开任何类型的文件:
ShellExecute(NULL,"open",lpFileName,NULL,NULL,SW_SHOWNORMAL);
参数 lpFileName 是文件的全路径名。用这个变量你可以传递象“C:\\MyExcelFile.xls”或者“http://www.vckbase.com”启动Excel程序或者浏览器程序。如果你只是想获取与文件关联的程序名,而不是要运行程序,那么调用::FindExecutable就可以了。

37. 如何防止在listbox中添加很多数据出现不停的刷新?
 [问题提出]
  在listbox添加很多数据的时候,由于控件不停的刷新,导致出现闪烁,如何解决?
 [解决方法]
  再添加数据以前,禁止控件刷新,数据添加完毕以后,再刷新一次。
 [程序实现](其中:m_ListBox是CListBox的控件类型的变量)

  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);

38. 如何得到CListBox所选择项的String?
 [问题提出]
 如何得到CListBox所选择项的String
 [解决方法]
 用到:CListBox::GetText()
 [程序实现]

 CString scInfo; 
 pList->GetText( GetCurSel(),scInfo);


39. 用鼠标移动基于对话框的无标题栏程序的简单方法

void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
  //一句话解决问题 
  SendMessage(WM_SYSCOMMAND,0xF012,0);
  CDialog::OnLButtonDown(nFlags, point);
}


40. 如何改变框对话或窗体视窗的背景颜色
调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。

BOOL CSampleApp : : InitInstance ( )
{
…
//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;
…
}

需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。
首先,给对话基类增加一人成员变量CBursh :

class CMyFormView : public CFormView
{
…
private :
CBrush m_ brush ; // background brush
…
} ;

其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。

CMyFormView : : CMyFormView ( )
{
// Initialize background brush .
m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )
}

最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor参量。
HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )
{
// Determine if drawing a dialog box . If we are , return +handle to
//our own background brush . Otherwise let windows handle it .
if (nCtlColor = = CTLCOLOR _ DLG )
return (HBRUSH) m_brush .GetSafeHandle ( ) ;
return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );
}

posted @ 2012-10-17 17:29  拿枪的程序员  阅读(721)  评论(0编辑  收藏  举报