MFC编程小技巧.docx

上传人:b****2 文档编号:478928 上传时间:2023-04-29 格式:DOCX 页数:64 大小:48.03KB
下载 相关 举报
MFC编程小技巧.docx_第1页
第1页 / 共64页
MFC编程小技巧.docx_第2页
第2页 / 共64页
MFC编程小技巧.docx_第3页
第3页 / 共64页
MFC编程小技巧.docx_第4页
第4页 / 共64页
MFC编程小技巧.docx_第5页
第5页 / 共64页
MFC编程小技巧.docx_第6页
第6页 / 共64页
MFC编程小技巧.docx_第7页
第7页 / 共64页
MFC编程小技巧.docx_第8页
第8页 / 共64页
MFC编程小技巧.docx_第9页
第9页 / 共64页
MFC编程小技巧.docx_第10页
第10页 / 共64页
MFC编程小技巧.docx_第11页
第11页 / 共64页
MFC编程小技巧.docx_第12页
第12页 / 共64页
MFC编程小技巧.docx_第13页
第13页 / 共64页
MFC编程小技巧.docx_第14页
第14页 / 共64页
MFC编程小技巧.docx_第15页
第15页 / 共64页
MFC编程小技巧.docx_第16页
第16页 / 共64页
MFC编程小技巧.docx_第17页
第17页 / 共64页
MFC编程小技巧.docx_第18页
第18页 / 共64页
MFC编程小技巧.docx_第19页
第19页 / 共64页
MFC编程小技巧.docx_第20页
第20页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MFC编程小技巧.docx

《MFC编程小技巧.docx》由会员分享,可在线阅读,更多相关《MFC编程小技巧.docx(64页珍藏版)》请在冰点文库上搜索。

MFC编程小技巧.docx

MFC编程小技巧

一、窗口类4

1、如何获取应用程序的实例句柄?

4

2、如何通过代码获得应用程序主窗口的指针?

4

3、如何在程序中获得其他程序的图标?

4

4、如何改变窗口的图标?

5

5、如何改变窗口的缺省风格?

5

6、如何将窗口居中显示?

6

7、如何让窗口和MDI窗口一启动就最大化和最小化?

6

8、如何限制窗口的大小?

6

9、如何使窗口不可见?

6

10、如何使窗口始终在最前方?

6

11、如何创建一个字回绕的CEditView7

12、通用控件的显示窗口7

13、移动窗口7

14、重置窗口的大小8

15、如何单击除了窗口标题栏以外的区域使窗口移动8

16、如何改变视窗的背景颜色10

17、如何改变窗口标题11

18、如何防止主框窗口在其说明中显示活动的文档名12

19、如何获取有关窗口正在处理的当前消息的信息13

20、如何创建一个不规则形状的窗口13

21、如何访问桌面窗口15

二应用程序16

1、如何编程结束应用程序?

如何编程控制windows的重新引导?

16

2、怎样加栽其他的应用程序?

16

3、确定应用程序的路径17

4、获得各种目录信息17

5、如何自定义消息18

6、如何使程序保持极小状态?

18

三、工具条、状态栏、菜单19

1、如何在代码中获取工具条和状态条的指针19

2、如何使能和禁止工具条的工具提示19

3、如何设置工具条标题20

4、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态20

5、如何给系统菜单添加一个菜单项21

6、如何确定顶层菜单所占据的菜单行数21

四、对话框22

1、如何创建和使用无模式对话框22

2、如何在对话框中显示一个位图24

3、如何改变对话或窗体视窗的背景颜色24

4、如何获取一个对话控件的指针26

5、对话框消息映射26

6、如何改变框对话或窗体视窗的背景颜色27

7、如何实现点一下对话框外面的区域,自动隐藏对话框?

29

8、改变对话框背景颜色后,如何使控件的背景颜色和对话框背景颜色统一?

32

五、控件33

1、如何禁止和使能控件33

2、如何改变控件的字体34

3、如何在OLE控件中使用OLE_COLOR数据类型35

4、在不使用通用文件打开对话的情况下如何显示一个文件列表35

5、为什么旋转按钮控件看起来倒转36

6为什么旋转按钮控件不能自动地更新它下面的编辑控件36

7、如何用位图显示下压按钮36

8、如何一个创建三态下压按钮37

9、如何动态创建控件37

10、如何限制编辑框中的准许字符38

11、如何改变控件的颜色39

13、当向列表框中添加多个项时如何防止闪烁41

14、如何向编辑控件中添加文本42

六、GDI42

1、如何获取GDI对象的属性信息42

2、如何实现一个橡皮区矩形43

3、如何更新翻转背景颜色的文本46

4、如何创建一个具有特定点大小的字体47

5、如何计算一个串的大小47

6、如何显示旋转文本48

7、如何正确显示包含标签字符的串50

8、串太长时如何在其末尾显示一个省略号50

9、如何快速地格式化一个CString对象51

10、如何访问预定义的GDI对象52

11、在用户环境中如何确定系统显示元素的颜色52

七、视图类53

1、怎样改变视图的大小?

53

2、如何改变一个CFormView的大小?

53

3、如何改变一个视图的背景?

53

4、如何使FormView中显示dialog时,不是凹的54

5、如何获得当前视图的指针?

54

6、如何获得MDI程序的所有视图?

54

61、如何查询和设置系统参数54

62、如何使用一个预定义的Windows光标55

63、如何确定当前屏幕分辨率56

64、如何检索原先的TaskManager应用程序使用的任务列表56

65、如何确定Windows和Windows系统目录57

66、在哪儿创建临文件58

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

一、窗口类

1、如何获取应用程序的实例句柄?

应用程序的实例句柄保存在CWinAppIm_hInstance中,可以这么调用

AfxGetInstancdHandle获得句柄.

Example:

HANDLEhInstance=AfxGetInstanceHandle();

2、如何通过代码获得应用程序主窗口的指针?

主窗口的指针保存在CWinThread:

:

m_pMainWnd中,调用AfxGetMainWnd实现。

AfxGetMainWnd()->ShowWindow(SW_SHOWMAXMIZED);//使程序最大化.

3、如何在程序中获得其他程序的图标?

两种方法:

(1)SDK函数SHGetFileInfo或使用ExtractIcon获得图标资源的handle,

(2)SDK函数SHGetFileInfo获得有关文件的很多信息,如大小图标,属性,类型等.

Example

(1):

在程序窗口左上角显示NotePad图标.

voidCSampleView:

OnDraw(CDC*pDC)

{

if(:

:

SHGetFileInfo(_T("c:

\\pwin95\\notepad.exe"),0,

&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))

{

pDC->DrawIcon(10,10,stFileInfo.hIcon);

}

}

Example

(2):

同样功能,UseExtractIconFunction

voidCSampleView:

:

OnDraw(CDC*pDC)

{

HICONhIcon=:

:

ExtractIcon(AfxGetInstanceHandle(),_T

("NotePad.exe"),0);

if(hIcon&&hIcon!

=(HICON)-1)

pDC->DrawIcon(10,10,hIcon);

}

说明:

获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到,如果是调用win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点.

4、如何改变窗口的图标?

向窗口发送WM_SECTION消息。

Example:

HICONhIcon=AfxGetApp()->LoadIcon(IDI_ICON);

ASSERT(hIcon);

AfxGetMainWnd()->SendMessage(WM_SECTION,TRUE,(LPARAM)hIcon);

5、如何改变窗口的缺省风格?

重栽CWnd:

:

PreCreateWindow并修改CREATESTRUCT结构来指定窗口风格和其他

创建信息.

Example:

Delete"Max"ButtonandSetOriginalWindow'sPositionandSize

BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

{

cs.style&=~WS_MAXINIZEMOX;

cs.x=cs.y=0;

cs.cx=GetSystemMetrics(SM_CXSCREEN/2);

cs.cy=GetSystemMetrics(SM_CYSCREEN/2);

returnCMDIFramewnd:

:

PreCreateWindow(cs);

}

6、如何将窗口居中显示?

Easy,CallFunctionCWnd:

:

CenterWindows

Example

(1):

CenterWindow();//Relativetoit'sparent

//RelativetoScreen

Example

(2):

CenterWindow(CWnd:

:

GetDesktopWindow());

//RelativetoApplication'sMainWindow

AfxGetMainWnd()->CenterWindow();

7、如何让窗口和MDI窗口一启动就最大化和最小化?

先说窗口。

在InitStance函数中设定m_nCmdShow的取值.

m_nCmdShow=SW_SHOWMAXMIZED;//最大化

m_nCmdShow=SW_SHOWMINMIZED;//最小化

m_nCmdShow=SW_SHOWNORMAL;//正常方式

MDI窗口:

如果是创建新的应用程序,可以用MFCAppWizard的Advanced按钮并在

MDI子窗口风格组中检测最大化或最小化;还可以重载MDIWindow的

PreCreateWindow函数,设置WS_MAXMIZEorWS_MINMIZE;

如果从CMDIChildWnd派生,调用OnInitialUpdate函数中的CWnd:

:

Show

Window来指定MDIChildWindow的风格。

8、如何限制窗口的大小?

也就是FixedDialog形式。

Windows发送WM_GETMAXMININFO消息来跟踪,

响应它,在OnGetMAXMININFO中写代码:

9、如何使窗口不可见?

很简单,用SW_HIDE隐藏窗口,可以结合FindWindow,ShowWindow控制.

10、如何使窗口始终在最前方?

两种途径.

BringWindowToTop(Handle);

SetWindowPos函数,指定窗口的最顶风格,用WS_EX_TOPMOST扩展窗口的风格

Example:

voidToggleTopMost(CWnd*pWnd)

11、如何创建一个字回绕的CEditView

重载CWnd:

:

PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位,由于CEditView:

:

PreCreateWindow显示设置cs.style,调用基类函数后要修改cs.style。

BOOLCSampleEDitView:

:

PreCreateWindow(CREATESTRUCT&cs)

{

//Firstcallbasseclassfunction.

BOOLbResutl=CEditView:

:

PreCreateWindow(cs);

//Nowspecifythenewwindowstyle.

cs.style&=~(ES_AUTOHSCROLL|WS_HSCROLL);

returnbResult;

}

12、通用控件的显示窗口

MFC提供了几个CView派生的视窗类,封装了通用控件的功能,但仍然使用工

作框文档显示窗口体系结构:

CEditView封装了编辑控件,CTreeView保持了树列表

控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。

13、移动窗口

调用CWnd:

:

SetWindowPos并指定SWP_NOSIZE标志。

目的位置与父窗口

有关(顶层窗口与屏幕有关)。

调用CWnd:

:

MoveWindow时必须要指定窗口

的大小。

//Movewindowtopositoin100,100ofitsparentwindow.

SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOAORDER);

14、重置窗口的大小

调用CWnd:

:

SetWindowPos并指定SWP_NOMOVE标志,也可调用

CWnd:

:

MoveWindow但必须指定窗口的位置。

//Getthesizeofthewindow.

CrectreWindow;

GetWindowRect(reWindow);

//Makethewindowtwiceaswideandtwiceastall.

SetWindowPos(NULL,0,0,reWindow.Width()*2,

reWindow.Height()*2,

SWP_NOMOVE|SWP_NOZORDER);

15、如何单击除了窗口标题栏以外的区域使窗口移动

当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理

该信息使Windows认为鼠标在窗口标题上。

对于对话框和基于对话的应用程序,可

以使用ClassWizard处理该信息并调用基类函数,如果函数返回HTCLIENT则表明

鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。

UINTCSampleDialog:

:

OnNcHitTest(Cpointpoint)

{

UINTnHitTest=Cdialog:

:

OnNcHitTest(point);

return(nHitTest==HTCLIENT)?

HTCAPTION:

nHitTest;

}

上述技术有两点不利之处,其一是在窗口的客户区域双击时,窗口将极大;

其二,它不适合包含几个视窗的主框窗口。

还有一种方法,当用户按下鼠标左键

使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN

信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。

voidCSampleView:

:

OnLButtonDown(UINTnFlags,Cpointpoint)

{

CView:

:

OnLButtonDow(nFlags,pont);

//Foolframewindowintothinkingsomeneclickedon

itscaptionbar.

GetParentFrame()—>PostMessage(

WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(poitn.x,point.y));

}

该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd:

:

GetParentFrame。

voidCSampleDialog:

:

OnLbuttonDown(UINTnFlags,Cpointpoint)

{

Cdialog:

:

OnLButtonDow(nFlags,goint);

//Fooldialogintothinkingsimeoneclickedonitscaptionbar.

PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARM(point.x,point.y))

}

16、如何改变视窗的背景颜色

Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用

ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以

防止Windows擦除窗口。

//Paintareathatneedstobeerased.

BOOLCSampleView:

:

OnEraseBkgnd(CDC*pDC)

{

//Createapruplebrush.

CBrushBrush(RGB(128,0,128));

//Selectthebrushintothedevicecontext.

CBrush*pOldBrush=pDC—>SelcetObject(&brush);

//Gettheareathatneedstobeerased.

CRectreClip;

pDC—>GetCilpBox(&rcClip);

//Paintthearea.

pDC—>PatBlt(rcClip.left,rcClip.top,

rcClip.Width(),rcClip.Height(),PATCOPY);

//Unselectbrushoutofdevicecontext.

pDC—>SelectObject(pOldBrush);

//Returnnonzerotohalffrutherprocessing.

returnTRUE;

}

17、如何改变窗口标题

调用CWnd:

:

SetWindowText可以改变任何窗口(包括控件)的标题。

//Settitleforapplication'smainframewindow.

AfxGetMainWnd()—>SetWindowText(_T("Applicationtitle"));

//SettitleforView'sMDIchildframewindow.

GetParentFrame()—>SetWindowText("_T("MDIChildFramenewtitle"));

//Settitlefordialog'spushbuttoncontrol.

GetDigitem(IDC_BUTTON)—>SetWindowText(_T("Buttonnewtitle"));

如果需要经常修改窗口的标题(注:

控件也是窗口),应该考虑使用半文档化

的函数AfxSetWindowText。

该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在

联机帮助中找不到它,它在AFXPRIV.H中半文档化,在以后发行的MFC中将文档化。

AfxSetWindowText的实现如下:

voikAFXAPIAfxSetWindowText(HWNDhWndCtrl,LPCTSTRIpszNew)

{

itnnNewLen=Istrlen(Ipaznew);

TCHARszOld[256];

//fastchecktoseeiftextreallychanges(reducesflashinthecontrols)

if(nNewLen>_contof(szOld)||

:

:

GetWindowText(hWndCrtl,szOld,_countof(szOld)!

=nNewLen||

Istrcmp(szOld,IpszNew)!

=0

{

//changeit

:

:

SetWindowText(hWndCtrl,IpszNew);

}

}

18、如何防止主框窗口在其说明中显示活动的文档名

创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在

说明中自动添加文档名,必须禁止该风格位,可以使用ClassWizard重置

CWnd:

:

PreCreateWindow并关闭FWS_ADDTOTITLE风格。

BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

{

//TurnoffFWS_ADDTOTITLEinmainframe.

cs.styel&=~FWS_ADDTOTITLE; 

returnCMDIFrameWnd:

:

PreCreateWindow(cs);

}

关闭MDI子窗口的FWS_ADDTOTITLE风格将创建一个具有空标题的窗口,可以调

用CWnd:

:

SetWindowText来设置标题。

记住自己设置标题时要遵循接口风格指南。

 

本文来自CSDN博客,转载请标明出处:

{

ASSERT_VALID(pWnd);

pWnd->SetWindowPos(pWnd->GetStyle()&WS_EX_TOPMOST)?

&wndNoTopMOST:

&wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE);

}

19、如何获取有关窗口正在处理的当前消息的信息

调用CWnd:

:

GetCurrentMessage可以获取一个MSG指针。

例如,可以使用

ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage

来确定所选中的菜单项。

viodCMainFrame:

:

OnCommmonMenuHandler()

{

//Displayselectedmenuitemindebugwindow.

TRACE("Menuitem%uwasselected.\n",

GetCruuentMessage()—>wParam);

}

20、如何创建一个不规则形状的窗口

可以使用新的SDK函数SetWindowRgn。

该函数将绘画和鼠标消息限定在窗口的一

个指定的区域,实际上使窗口成为指定的不规则形状。

使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删

除所在的缺省控件、标题以及边界。

给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。

ClassCRoundDlg:

publicCDialog

{

private:

Crgnm_rgn:

//windowregion

};

修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给

窗口:

BOOLCRoundDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Getsizeofdialog.

CRectrcDialog;

GetClientRect(rcDialog);

//Createregionandassigntowindow.

m_rgn.CreateEllipticRgn(0,0,rcDialog.Width(),rcDialog.Height());

SetWindowRg

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2