MFC学习总结 67个技巧Word文档格式.docx
《MFC学习总结 67个技巧Word文档格式.docx》由会员分享,可在线阅读,更多相关《MFC学习总结 67个技巧Word文档格式.docx(80页珍藏版)》请在冰豆网上搜索。
intwidth=rect.right-rect.left;
intheight=rect.bottom-rect.top;
//调整属性页的大小和位置
m_tabsheet.SetWindowPos(NULL,225,225,width-82,height,SWP_NOACTIVATE);
属性页的添加完成。
如果要添加多个属性页,则只需要增加多个对象,如下:
m_skatch1);
m_tabsheet.AddPage(&
m_skatch2);
......
2."
ListControl中标题栏(Column)的添加:
创建一个ListControl,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align项里选择Top、Sort项里选择None.
然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:
CStringstrname[3];
strname[0]="
ScreenName"
;
strname[1]="
FormID"
strname[2]="
CategoryPath"
for(inti=0;
i<
3;
i++)
{
m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);
}
在这之前也要将ListControl的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange*pDX)函数里绑定,如下:
DDX_Control(pDX,IDC_LIST,m_List);
3."
ToolBar和StatusBar中控件的添加:
方法⑴.只能在ToolBar里创建控件:
首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).
其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:
选择工程/增加到工程/新的类;
也可以选择工程的根,然后点击右键,选择新的类;
或者CTL+W,选择增加类/新的类---然后在classtype里选择GenericClass,在Name栏里输入新类的名字,Baseclass里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:
CComboBox"
m_wndMyCombo;
CStatic"
m_wndCategory,m_wndCategoryPath;
CButton"
m_wndOpenButton;
Cedit"
m_wndEdit;
然后在构造函数里初始化如:
m_wndMyCombo.m_hWnd=NULL;
m_wndCategory.m_hWnd=NULL;
m_wndCategoryPath.m_hWnd=NULL;
m_wndOpenButton.m_hWnd=NULL;
m_wndEdit.m_hWnd=NULL;
接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp文件的OnCreate函数的最后实现如下:
intindex=0;
CRectrect;
//可定义在头文件当中
// ComboBox
//找到指定的工具项
while(m_wndToolBar.GetItemID(index)!
=ID_TOOL_COMBO)
index++;
//设置指定工具项的宽度并获取新的区域 120是宽度
m_wndToolBar.SetButtonInfo(index,ID_TOOL_COMBO,TBBS_SEPARATOR,120);
m_wndToolBar.GetItemRect(index,&
//设置位置
rect.top+=1;
rect.bottom+=200;
//创建并显示控件
if(!
m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|
CBS_DROPDOWNLIST|CBS_HASSTRINGS,rect,&
m_wndToolBar,ID_TOOL_COMBO))
{
TRACE0("
Failedtocreatecombo-box\n"
);
returnFALSE;
m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);
//填充内容"
m_wndToolBar.m_wndMyCombo.AddString("
25%"
50%"
75%"
//选择默认项
m_wndToolBar.m_wndMyCombo.SetCurSel(0);
//获取到内容并MSGBOX显示出来
CStringstrContent;
m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);
index=0;
其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。
方法⑵.这种方法创建不太容易控制:
直接在CMainframe的头文件中创建要增加的控件的对象,如CButton"
的对象m_wndAboutButton,然后创建CToolBar或者CstatusBar的对象,如:
CstatusBar的对象_wndStatusBar;
再增加几个函数如下:
Protected:
virtualvoidRecalcLayout(BOOLbNotify=TRUE);
afx_msgvoidCMainFrame:
:
OnViewStatusBar();
接着在.cpp文件中将StatusBar的ID和OnViewStatusBar函数绑定在一起,如下所示:
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
// {{AFX_MSG_MAP(CMainFrame)
ON_COMMAND(ID_VIEW_STATUS_BAR,OnViewStatusBar)
ON_WM_CREATE()
// }}AFX_MSG_MAP
END_MESSAGE_MAP()
然后Create函数的最后(返回值之前)实现如下代码:
CRectrc;
VERIFY(m_wndAboutButton.Create(_T("
MyAbout"
),
WS_VISIBLE,rc,this,ID_APP_ABOUT));
//TODO:
Removethisifyoudon'
twanttooltipsoraresizeabletoolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|
CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);
再在RecalcLayout函数里实现:
if(m_wndStatusBar.m_hWnd)
m_wndStatusBar.GetWindowRect(&
rc);
ScreenToClient(&
rc.right-=50;
m_wndStatusBar.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),
SWP_NOZORDER);
rc.left=rc.right;
rc.right+=50;
m_wndAboutButton.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),
最后在OnViewStatusBar()里实现:
BOOLbShow=m_wndStatusBar.GetStyle()&
WS_VISIBLE;
m_wndAboutButton.SetWindowPos(NULL,0,0,0,0,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
(bShow?
SWP_SHOWWINDOW:
SWP_HIDEWINDOW));
ToolBar中的创建与此相同,只需更改一下句柄即可。
4."
通过Control创建的控件,对其属性的动态控制:
在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_button。
然后在.cpp中的DoDataExchange函数里将Button的ID和创建的对象绑定在一起:
//{{AFX_DATA_MAP(CPrintDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
DDX_Control(pDX,IDC_MyButton,m_button);
//}}AFX_DATA_MAP
然后可以在该函数的最后进行初始化:
m_button.EnableWindow(FALSE);
到这里已经实现了改变属性。
如果要动态改变其属性,可如下实现(通过两个Button的点击改变起属性):
//RadioAllButton的点击响应函数
voidCPrintDlg:
OnRadioAll()
Addyourcontrolnotificationhandlercodehere
m_button.EnableWindow(TRUE);
//RadioSelectButton的点击响应函数
OnRadioSelect()
也可以通过一个CheckButton的点击来改变,在其点击响应函数里实现:
m_button.EnableWindow(!
m_button.IsWindowEnabled());
其余控件属性的改变都如此。
5."
窗口的分割与停靠:
一、新建一个类CMySplitter,基类为CSplitterWnd
二、重载该类的OnMouseMove函数:
voidCMySplitter:
OnMouseMove(UINTnFlags,CPointpoint)
{
//限制切分条的运动范围。
if(point.x<
228||point.x>
600)
CWnd:
OnMouseMove(nFlags,point);
}
else
CSplitterWnd:
三、然后就可以跟一般的窗口分割那样去做了,if(point.x<
600)这里的范围可以随你去设置了^_^,够简单吧。
四、切分窗口
在MaiFram.h建立切分条对象:
protected:
CMySplitterm_wndSplitter;
//切分窗口对象
//在MaiFram.cpp中实现窗口切分:
BOOLCMainFrame:
OnCreateClient(LPCREATESTRUCT/*lpcs*/,CCreateContext*pContext)
//创建拆分器窗口
if(!
m_wndSplitter.CreateStatic(this,1,2))
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CLeftView),CSize(228,100),pContext)||!
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDataEditView), CSize(100,100),pContext))
m_wndSplitter.DestroyWindow();
returnTRUE;
6. ①怎样在程序开始的时候让它最大化?
②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能?
③如何在显示窗口时,使最大化按钮变灰?
①在App类里的C…App:
InitInstance()中把m_pMainWnd->
ShowWindow(SW_SHOW)改成m_pMainWnd->
ShowWindow(SW_MAXIMIZE);
②在CreateWidnow时用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX风格.
③第一种方法:
PreCreateWindow(CREATESTRUCT&
cs)
if(!
CFrameWnd:
PreCreateWindow(cs))
ModifytheWindowclassorstylesherebymodifying
// theCREATESTRUCTcs
//disablethemaxminibox
cs.style&
=~WS_MAXIMIZEBOX;
第二种方法:
CMenu*pMenu=AfxGetApp()->
m_pMainWnd->
GetSystemMenu(FALSE);
intx=pMenu->
GetMenuItemCount();
UINTpID=pMenu->
GetMenuItemID(x-1);
pMenu->
EnableMenuItem(pID,MF_DISABLED);
第三种方法:
ModifyStyle(WS_MAXIMIZEBOX,0);
这个函数也可以是最大化按钮失效!
并且可以在程序中动态的改变窗口的风格
7.更改属性页标题
voidCProSheet:
SetPageTitle(intnPage,intnImage,CStringstrTitle)
TC_ITEMitem;
//item.mask=TCIF_TEXT|TCIF_IMAGE;
//设置图标+文字
item.mask=TCIF_IMAGE;
//只设置图标
item.iImage=nImage;
//item.pszText=strTitle.GetBuffer(0);
//设置文字
GetTabControl()->
SetItem(nPage,&
item);
//要设置文字时就将上面2行有注释符的代码前的注释符去掉
8.创建动态菜单
voidCMainFrame:
OnSelectState(NMTOOLBAR*pnmtb,LRESULT*plr)
CMenumenu;
menu.CreateMenu())
return;
menu.AppendMenu(MF_STRING,0,"
开始"
结束"
m_wndToolBar.SendMessage(TB_GETRECT,pnmtb->
iItem,(LPARAM)&
m_wndToolBar.ClientToScreen(&
menu.TrackMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,
rc.left,rc.bottom,this,&
//"
menu.DestroyMenu();
menu.detach();
9.关于打印
1.要打印哪个视就
((CMainFrame*)AfxGetMainWnd())->
m_wndSplitter.SetActivePane(...)
//要打印的那个视对应的Pane
2.有一个单文档工程,文档窗口被切分:
左视图由CTreeView的派生类管理,右视图由CListView的派生类CMyListView(其为风格为LVS_REPORT)管理,我想为右视图添加打印和打印预览,我在MyListView.cpp中添加了
ON_COMMAND(ID_FILE_PRINT,CListView:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CListView:
OnFilePrintPreview)还有
BOOLCMyListView:
OnPreparePrinting(CPrintInfo*pInfo)
{
//TODO:
callDoPreparePrintingtoinvokethePrintdialogbox
//returnCListView:
OnPreparePrinting(pInfo);
pInfo->
SetMaxPage
(2);
BOOLbret=DoPreparePrinting(pInfo);
m_nNumPreviewPages=2;
returnbret;
}
3.下面是从MSDN中摘出来的一段,是用来改变消息路由的。
用了这段代码之后,CView中的消息(菜单,控件,子窗口)将先被CMyShape类来处理。
不知道你要的是不是这样的效果。
//Thisexampleillustratesextendingtheframework'
sstandardcommand
//routefromtheviewtoobjectsmanagedbytheview. Thisexample
//isfromanobject-orienteddrawingapplication,similartothe
//DRAWCLIsampleapplication,whichdrawsandedits"
shapes"
.
BOOLCMyView:
OnCmdMsg(UINTnID,intnCode,void*pExtra,
AFX_CMDHANDLERINFO*pHandlerInfo)
//Extendtheframework'
scommandroutefromtheviewto
//theapplication-specificCMyShapethatiscurrentlyselected
//intheview.m_pActiveShapeisNULLifnoshapeobject
//iscurrentlyselectedintheview.
if((m_pActiveShape!
=NULL)
&
&
m_pActiveShape->
OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
returnTRUE;
//Iftheobject(s)intheextendedcommandroutedon'
thandle
//thecommand,thenletthebaseclassOnCmdMsghandleit.
returnCView:
OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
//ThecommandhandlerforID_SHAPE_COLOR(menucommandtochange
//thecolorofthecurrentlyselectedshape)wasaddedto
//themessagemapofCMyShape(note,notCMyView)usingClassWizard.
//Themenuitemwillbeautomaticallyenabledordisabled,depending