(转)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 ); }