MFC学习总结4.docx
- 文档编号:6742619
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:19
- 大小:21.75KB
MFC学习总结4.docx
《MFC学习总结4.docx》由会员分享,可在线阅读,更多相关《MFC学习总结4.docx(19页珍藏版)》请在冰豆网上搜索。
MFC学习总结4
MFC学习总结(4)(转载)
[2008-1-2814:
23:
00|By:
Enzo]
71.隐藏标题栏和菜单栏
隐藏标题栏ModifyStyle(WS_CAPTION,0)
隐藏菜单栏SetMenu(NULL)
72.InflateRect
InflateRect这个函数用于增大或减小一个矩形的大小.
如m_graphRect.InflateRect(-70,-30,-30,-50);
将矩形左边坐标加70,上面加30,右边减30,下面减50。
73.怎么让无模式对话框显示在主窗口后面
要解决这个问题的关键在于CDialog的Create并不能建立一个无属主的窗口.必须用另外方式建窗口.
比如你的对话框类叫CDlgNoOwner,在CMainFrame中加一个CDlgNoOwner类的成员变量,
弹出这个对话框的消息处理函数为
void CMainFrame:
:
OnNoowner()
{
CDlgNoOwner *m_dlgTest=new CDlgNoOwner(this);
HWND hwndDlg=:
:
CreateDialog(AfxGetInstanceHandle(),MAKEINTRESOURCE(CDlgNoOwner:
:
IDD),NULL/*owner*/,NULL/*dlgproc*/);
//注意此处DLGPROC为NULL,并不要紧,因为接下要subclass啦
m_dlgTest->SubclassWindow (hwndDlg);//挂接到成员变量!
m_dlgTest->ShowWindow (SW_SHOW);
//这时可以看到一个"自由"的对话框弹出,和你的主窗口是平起平坐的.
}
当然不要忘了在对话框关闭时DestroyWindow()..那都是在对话框类中的标准处理了.
74.隐藏窗口(子窗口没有焦点时)
在程序启动时 InitDialog 中使用 SetWindowPos 将窗体设置到屏幕以外
然后再隐藏
1.在OnInitDialog()函数里设置定时器:
(WINDOWS API里面响应消息WM_INITDIALOG)
SetTimer(1, 1, NULL);
2.添加处理WM_TIMER的消息处理函数OnTimer,添加代码:
if(nIDEvent == 1)
{
DeleteTimer
(1);
ShowWindow(SW_HIDE);
}
75.修改视图背景
HowdoIchangethebackgroundcolorofaview?
TochangethebackgroundcolorforaCView,CFrameWnd,orCWndobject,processtheWM_ERASEBKGNDmessage.Thefollowingcodeshowshow:
BOOLCSampleView:
:
OnEraseBkgnd(CDC*pDC)
{
//Setbrushtodesiredbackgroundcolor.
CBrushbackBrush(RGB(255,128,128));
//Saveoldbrush.
CBrush*pOldBrush=pDC->SelectObject(&backBrush);
CRectrect;
pDC->GetClipBox(&rect); //Erasetheareaneeded.
pDC->PatBlt(rect.left,rect.top,rect.Width(),
rect.Height(),PATCOPY);
pDC->SelectObject(pOldBrush);
returnTRUE;
}
Isolvedtheproblemlikethis:
HBRUSHdlgtest:
:
OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
switch(nCtlColor)
{
caseCTLCOLOR_BTN:
caseCTLCOLOR_STATIC:
{
pDC->SetBkMode(TRANSPARENT);
}
caseCTLCOLOR_DLG:
{
CBrush* back_brush;
COLORREF color;
color=(COLORREF)GetSysColor(COLOR_BTNFACE);
back_brush=newCBrush(color);
return(HBRUSH)(back_brush->m_hObject);
}
}
return(CFormView:
:
OnCtlColor(pDC,pWnd,nCtlColor));
}
76.如何实现点击对话框外的地方使对话框到主窗口的后面
只能将桌面做为父窗口
pMDlg=newCMDlg;
pMDlg->Create(IDD_M_DIALOG,CWnd:
:
GetDesktopWindow()/*设置父窗口*/);
pMDlg->ShowWindow(SW_SHOW);
然后在任务栏里隐藏对话框程序
如何让对话框应用程序在在任务栏上不出现,并且不隐藏窗口。
[解决方法]
把对话框的扩展属性修改成为WS_EX_TOOLWINDOW。
[程序实现]
把对话框的属性设置成为toolwindow,然后在需要的地方执行本代码。
DWORDStyle=:
:
GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);
Style=WS_EX_TOOLWINDOW;
AfxGetMainWnd()->ShowWindow(FALSE);
:
:
SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,Style);
AfxGetMainWnd()->ShowWindow(TRUE);
77.想在程序一启动时就自动关闭窗口,不在任务栏里显示
用CTRL+W打开ClassWizard;
点击ClassInfo页,类名是工程名Dlg,
再在左下方的"Filter"中选择"Windows";
回到MessageMaps页,就可以看到消息中有WM_WINDOWPOSCHANGING,
加入代码,如上所示.
这样运行*.EXE,不但看不到主界面,任务栏也没有,就是任务管理器中的"应用程序"中也不列出,那该如何关闭它?
在任务管理器的"进程"中可以找到它,这是黑客程序常用的方法.
如果需要的话,连"进程"中也看不到.这样要终止它就是问题了.
78.修改打印预览的ToolBar
为AFX_IDD_PREVIEW_TOOLBAR这个ID创建一个DialogBar。
则系统就会用新创建的DialogBar代替系统默认的那个
79.如何实现SDI与MDI的转换?
我想将一个编好的SDI应用程序转换为MDI,很明显要有多处的改变。
你可以这样做:
建立一个继承于CMDIChidWnd的类,不防设为CChldFrm.在CWinApp中作如下变化。
InitInstance()
{
....
//insteadofaddingCSingleDocTemplate
//AddCMultiDocTemplate.
pDocTemplate=newCMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDIDoc),
RUNTIME_CLASS(CChldFrm),
//ForMainMDIFramechangethisframewindowfrom
//CFrameWndderivative(i.e.CMainFrame)
//toyourCMDIChildWndderivedCChldFrm.
RUNTIME_CLASS(CSDIView));
///Afterthisitisrequiredtocreatethemainframewindow
//whichwillcontainallthechildwindows.Nowthiswindowis
//whatwasinitiallyframewindowforSDI.
CMainFrame*pMainFrame=newCMainFrame;
if(!
pMainFrame->LoadFrame(IDR_MAINFRAME))
returnFALSE;
m_pMainWnd=pMainFrame;
.....
}
在从CMDIFrameWnd中继承的类CMainFrame代替CFramWnd后,所有的类都将从CMDIFrame继承,而不是CFrameWnd,编译运行后你就会发现程序已经从SDI变换到MDI。
注意:
在CMainFram中必须将构造函数从private改为public.否则会出错。
80.CDC中的竖排文本?
在OnDraw成员函数中我想让文本竖直对齐,但CDC类似乎不支持该处理
方法一:
如果你的竖直对齐是指旋转文本的话,下面的代码会对你有帮助:
该代码检查一个Checkbox控制,查看文本是否需要旋转.
//m_pcfYTitleisaCFont*totheselectedfont.
//m_bTotateYTitleisabool(==TRUEifrotated)
voidCPage1:
:
OnRotateytitle()
{
LOGFONTlgf;
m_pcfYTitle->GetLogFont(&lgf);
m_bRotateYTitle=
((CButton*)GetDlgItem(IDC_ROTATEYTITLE))->GetCheck()>0;
//escapementisreckonedclockwisein1/10thsofadegree:
lgf.lfEscapement=-(m_bRotateYTitle*900);
m_pcfYTitle->DeleteObject();
m_pcfYTitle->CreateFontIndirect(&lgf);
DrawSampleChart();
}
注意如果你从CFontDialog中选择了不同的字体,你应该自己设定LOGFONT的lfEscapement成员.将初始化后的lfEscapement值传到CFontDialog中.
方法二:
还有一段代码可参考:
LOGFONTLocalLogFont;
strcpy(LocalLogFont.lfFaceName,TypeFace);
LocalLogFont.lfWeight=fWeight;
LocalLogFont.lfEscapement=Orient;
LocalLogFont.lfOrientation=Orient;
if(MyFont.CreateFontIndirect(&LocalLogFont))
{
cMyOldFont=cdc->SelectObject(&MyFont);
}
81.如何用键盘滚动分割的视口?
我的问题是当我用鼠标滚动分割窗口时,视口滚动都很正常,但用键盘时,却什么也没有发生.
在你的视图继承类中加入如下两个函数,假定该类为CScrollerView:
voidCScrollerView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
BOOLprocessed;
for(unsignedinti=0;i processed=KeyScroll(nChar); if(! processed) CScrollView: : OnKeyDown(nChar,nRepCnt,nFlags); } BOOLCScrollerView: : KeyScroll(UINTnChar) { switch(nChar) { caseVK_UP: OnVScroll(SB_LINEUP,0,NULL); break; caseVK_DOWN: OnVScroll(SB_LINEDOWN,0,NULL); break; caseVK_LEFT: OnHScroll(SB_LINELEFT,0,NULL); break; caseVK_RIGHT: OnHScroll(SB_LINERIGHT,0,NULL); break; caseVK_HOME: OnHScroll(SB_LEFT,0,NULL); break; caseVK_END: OnHScroll(SB_RIGHT,0,NULL); break; caseVK_PRIOR: OnVScroll(SB_PAGEUP,0,NULL); break; caseVK_NEXT: OnVScroll(SB_PAGEDOWN,0,NULL); break; default: returnFALSE;//notforus //andletthedefaultclass //processit. } returnTRUE; } 82.如何改变默认的光标形状? 我试着将光标改变为其它的形状和颜色,但却没有变化. 在对话框/窗口/你需要的地方加上对WM_SETCURSOR消息的处理. BOOLMyDialog: : OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage) { //TODAddyourmessagehandlercodehereand/orcalldefault : : SetCursor(AfxGetApp()->LoadCursor(IDC_MYCURSOR)); returnTRUE; //returnCDialog: : OnSetCursor(pWnd,nHitTest,message); } 你没有成功的原因是因为窗口类光标风格不能为NULL. 83.如何选择CTreeCtrl中的节点文本进行编辑? 在向CTreeCtrl中加入一项后,有什么方法可以编辑该节点的文本呢? 首先设置你的CcompTreeCtrl具有TVS_EDITLABELS属性.在设计时用控件属性来设置在运行时用GetStyle()/SetStyle()成员函数来设置.然后请看下述代码: HTREEITEMCCompTreeCtrl: : AddSet() { staticintsetCnt=3D1; HTREEITEMhItem; CStringcsSet; //createtextfornewnote: NewSet1,NewSet2... csSet.Format(_T("NewSet%d"),setCnt++); hItem=3DInsertItem(csSet,IMG_CLOSEDFOLDER,IMG_CLOSEDFOLDER); if(hItem! =3DNULL) EditLabel(hItem); returnhItem; } 84.CListCtrl中选择变化时如何获得通知? 我在ReportView中使用了一个CListCtrl(自绘制类型),我想知道什么时候选择项发生了改变. 在选择项变化时,可以使用按钮有效或失效,按如下操作: 加入LVN_ITEMCHANGED消息处理. voidCYourClassNameHere: : 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); } } 85.List控件中整栏选择? 我在处理List控件时碰到了麻烦,我想创建一个ListView,来依据Tree控件的选择同时在ListView和ReportView中显示列表的信息.以下是相关的代码: //Setfulllineselect ListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(), LVS_EX_FULLROWSELECT); 按如下方法处理: //--------------------beginofsnippet-------------------------------- boolCCommCtrlUtil32: : ListCtrl_ModifyExtendedStyle(CListCtrl&p_rListCtrl, constDWORDp_dwStyleEx, constboolp_bAdd) { HWNDt_hWnd=p_rListCtrl.GetSafeHwnd(); DWORDt_dwStyleEx=ListView_GetExtendedListViewStyle(t_hWnd); if(p_bAdd) { if(0==(p_dwStyleEx&t_dwStyleEx)) { //addstyle t_dwStyleEx|=p_dwStyleEx; } } else { if(0! =(p_dwStyleEx&t_dwStyleEx)) { //removestyle t_dwStyleEx&=~p_dwStyleEx; } } ListView_SetExtendedListViewStyle(t_hWnd,t_dwStyleEx); returntrue; } 86.如何限制mdi子框架最大化时的大小? 用ptMaxTrackSize代替prMaxSize,如下所示: voidCChildFrame: : OnGetMinMaxInfo(MINMAXINFOFAR*lpMMI) { //TODAddyourmessagehandlercodehereand/orcalldefault CChildFrame: : OnGetMinMaxInfo(lpMMI); lpMMI->ptMaxTrackSize.x=300; lpMMI->ptMaxTrackSize.y=400; } 87.怎样实现3D效果? 在对话框中怎样实现Edit和Listboxes控件的3D效果? (环境95/NTVC5.0) 1).使用带WS_EX_CLIENTEDGE标志的: : CreateWindowEx来替换: : CreateWindow或者用CWnd: : CreateEx替换CWnd: : Create. 2).在建立控件之后,调用ModifyStyleEx(0,WS_EX_CLIENTEDGE). 88.HowdoIupdatethetextofapaneinastatusbar? Bydefault,aCStatusBarpaneisnotenabledwhenthepaneiscreated.Toactivateapane,youmustcalltheON_UPDATE_COMMAND_UI()macroforeachpaneonthestatusbarandupdatethepanes.BecausepanesdonotsendWM_COMMANDmessages,youcannotuseClassWizardtoactivatepanes;youmusttypethecodemanually.Forexample,supposeonepanehasID_INDICATOR_PAGEasitsidentifierandthatitcontainsthecurrentpagenumberinadocument.TomaketheID_INDICATOR_PAGEpanedisplaytext,addthefollowingtoaheaderfile(probablytheMAINFRM.Hfile): afx_msgvoidOnUpdatePage(CCmdUI*pCmdUI); Addthefollowingtotheap
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 学习 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)