VC问题与技巧.docx
- 文档编号:8977787
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:62
- 大小:67.29KB
VC问题与技巧.docx
《VC问题与技巧.docx》由会员分享,可在线阅读,更多相关《VC问题与技巧.docx(62页珍藏版)》请在冰豆网上搜索。
VC问题与技巧
解析C语言中的sizeof
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
它并不是函数。
sizeof操作符以字节形式给出了其操作数的存储大小。
操作数可以是一个表达式或括在括号内的类型名。
操作数的存储大小由操作数的类型决定。
二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:
sizeof(type) 数据类型必须用括号括住。
如sizeof(int)。
2、用于变量 sizeof使用形式:
sizeof(var_name)或sizeofvar_name变量名可以不用括号括住。
如sizeof(var_name),sizeofvar_name等都是正确形式。
带括号的用法更普遍,大多数程序员采用这种形式。
注意:
sizeof操作符不能用于函数类型,不完全类型或位字段。
不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为intmax(),sizeof(char_v)若此时char_v定义为charchar_v[MAX]且MAX未知,sizeof(void)都不是正确形式。
三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
1、若操作数具有类型char、unsignedchar或signedchar,其结果等于1。
ANSIC正式规定字符类型为1字节。
2、int、unsignedint、shortint、unsignedshort、longint、unsignedlong、float、double、longdouble类型的sizeof在ANSIC中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。
3、当操作数是指针时,sizeof依赖于编译器。
例如MicrosoftC/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。
一般Unix的指针字节数为4。
4、当操作数具有数组类型时,其结果是数组的总字节数。
5、联合类型操作数的sizeof是其最大字节成员的字节数。
结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
让我们看如下结构:
struct{charb;doublex;}a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
如double类型的结构成员x要放在被4整除的地址。
6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
四、sizeof与其他操作符的关系 sizeof的优先级为2级,比/、%等3级运算符优先级高。
它可以与其他操作符一起组成表达式。
如i*sizeof(int);其中i为int类型变量。
五、sizeof的主要用途 1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。
例如:
void*malloc(size_tsize), size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream)。
2、sizeof的另一个的主要用途是计算数组中元素的个数。
例如:
void*memset(void*s,intc,sizeof(s))。
六、建议 由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。
VC编程技巧:
如何处理自定义消息
ClassWizard不允许增加用户自定义消息,所以你必须手工输入。
输入后,ClassWizard就可以象处理其它消息一样处理你自定义的消息了。
下面是增加自定义消息的步骤:
第一步:
定义消息。
开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
第二步:
实现消息处理函数。
该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULTCMainFrame:
:
OnMyMessage(WPARAMwParam,LPARAMlParam){//TODO:
处理用户自定义消息...return0;}第三步:
在类头文件的AFX_MSG块中说明消息处理函数:
classCMainFrame:
publicCMDIFrameWnd{...//一般消息映射函数protected:
//{{AFX_MSG(CMainFrame)afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnTimer(UINTnIDEvent);afx_msgLRESULTOnMyMessage(WPARAMwParam,LPARAMlParam);//}}AFX_MSGDECLARE_MESSAGE_MAP()}第四步:
在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_TIMER()ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage)//}}AFX_MSG_MAPEND_MESSAGE_MAP()如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
VC编程技巧:
在属性页中添加字体对话框
在属性页中添加字体对话框,MFC提供了三种属性页类:
CFontPropPage、CColorPropPage和CPicturePropPage。
但是,它们只能与OLEAutomation一起使用。
在本文中将介绍如何在属性对话框中添加字体属性页。
解决的办法是你自己建立字体属性页。
为了让你能定制通用对话框的行为,SDK提供了这些对话框的对话框资源。
“ChooseFont”对话框是在Include目录中的FONT.DLG文件中,相应的符号在DLGS.H文件中。
使用这些文件作为出发点,我们可以为字体属性页建立资源,并且添加一个使用这些资源的CPropertyPage继承类。
下面的实现可能是有限的,但也有一定的参考价值。
如果你想增强它,可以查看MFC源程序目录中的CFontPropPage源文件。
第一步:
添加对话资源你可以在DevStudio中打开下面的rc文件DevStudio,然后把对话框资源复制到你的主资源文件中,或者你也可以把该资源文件包含进去。
为了复制资源文件,请在DevStudio中打开“fontpage.rc”文件,然后展开资源的outline。
然后打开ResourceView,以便对话框资源是可见的。
最后,从fontpage.rc中拖动IDD_FONTPAGE资源到你的应用程序ResourceView的资源中。
如果你想包含fontpage资源文件,只要把“fontpage.rc”和“fontpagerc.h”文件(在下面列出)到项目目录中的“res”目录中即可。
然后在该目录中已有的“rc2”文件中添加下面这段。
资源图像也列在下面。
#include"fontpage.rc"ListingofFontPage.rc///////////////////////////////////////////////////////////////////////////ListingofFontPage.rc//#include"winresrc.h"#include"FontPageRc.h"IDD_FONTPAGEDIALOGDISCARDABLE13,54,264,133STYLEWS_CHILD|WS_CAPTION|WS_SYSMENU
CAPTION"Font"FONT8,"Helv"BEGINLTEXT"&Font:
",stc1,6,3,40,9COMBOBOXIDC_FONT,6,13,131,54,CBS_SIMPLE|CBS_AUTOHSCROLL|CBS_SORT|CBS_DISABLENOSCROLL|WS_VSCROLL|WS_TABSTOPLTEXT"FontSt&yle:
",stc2,153,3,44,9COMBOBOXIDC_STYLE,153,13,64,54,CBS_SIMPLE|CBS_DISABLENOSCROLL|WS_VSCROLL|WS_TABSTOPLTEXT"&Size:
",stc3,224,3,30,9COMBOBOXIDC_FONTSIZE,224,13,32,54,CBS_SIMPLE|CBS_DISABLENOSCROLL|WS_VSCROLL|WS_TABSTOPGROUPBOX"Effects",grp1,6,72,84,34,WS_GROUPCONTROL"Stri&keout",IDC_STRIKEOUT,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,10,82,49,10CONTROL"&Underline",IDC_UNDERLINE,"Button",BS_AUTOCHECKBOX,10,94,51,10GROUPBOX"Sample",grp2,98,72,160,49,WS_GROUPCTEXT"AaBbYyZz",IDC_SAMPLE,104,81,149,37,SS_NOPREFIXEND///////////////////////////////////////////////////////////////////////////ListingofFontPageRc.h/////////////////////////////////////////////////////////////////////////#defineIDC_STRIKEOUT0x0410#defineIDC_UNDERLINE0x0411#definegrp10x0430#definegrp20x0431#definestc10x0440#definestc20x0441#definestc30x0442#defineIDC_SAMPLE0x0444#defineIDC_FONT0x0470#defineIDC_STYLE0x0471#defineIDC_FONTSIZE0x0472#defineIDD_FONTPAGE1543/////////////////////////////////////////////////////////////////////////第二步:
在你的项目中包含源文件下面给出了头文件和实现文件。
你只要简单的把它们包含到你的项目中,并且使用CFontPage类就可以了。
该类的实现是比较简单的。
CFontPage构造函数获取一指向LOGFONT结构的指针。
它使用该结构的信息来初始化自己。
如果LOGFONT结构没有提供,则使用窗口的当前字体。
在OnInitDialog()函数中,我们列出了所需字体和字体组合框。
但是,任何字体特性的改变,都要调用OnSelChange()函数来实现。
所有的信息映射入口都指向该函数。
OnSelChange()函数更新内部信息,并且显示样本文本。
FontPage.h#if!
defined(AFX_FONTPAGE_H__DE7EDEB3_056D_11D1_82DF_E2CDC9000000__INCLUDED_)#defineAFX_FONTPAGE_H__DE7EDEB3_056D_11D1_82DF_E2CDC9000000__INCLUDED_#if_MSC_VER>=1000#pragmaonce#endif//_MSC_VER>=1000//FontPage.h:
headerfile/////////////////////////////////////////////////////////////////////////////////CFontPagedialogclassCFontPage:
publicCPropertyPage{DECLARE_DYNCREATE(CFontPage)//Constructionpublic:
voidGetCurrentFont(LPLOGFONTlplf);CFontPage(LOGFONT*plogfont=NULL);~CFontPage();//DialogData//{{AFX_DATA(CFontPage)enum{IDD=IDD_FONTPAGE};CStaticm_staticSample;CComboBoxm_comboStyle;CComboBoxm_comboSize;CComboBoxm_comboFont;BOOLm_bStrikeOut;BOOLm_bUnderline;CStringm_sFont;CStringm_sSize;CStringm_sStyle;//}}AFX_DATA//Overrides//ClassWizardgeneratevirtualfunctionoverrides//{{AFX_VIRTUAL(CFontPage)protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected:
//Generatedmessagemapfunctions//{{AFX_MSG(CFontPage)virtualBOOLOnInitDialog();afx_msgvoidOnSelChange();//}}AFX_MSGDECLARE_MESSAGE_MAP()private:
CFontm_fontSample;intm_cyPixelsPerInch;staticintCALLBACKFontEnumProc(ENUMLOGFONTEX*lpelfe,NEWTEXTMETRICEX*lpntme,intFontType,CFontPage*pFontPage);};//{{AFX_INSERT_LOCATION}}//MicrosoftDeveloperStudiowillinsertadditionaldeclarationsimmediately//beforethepreviousline.#endif//!
defined(AFX_FONTPAGE_H__DE7EDEB3_056D_11D1_82DF_E2CDC9000000__NCLUDED_)
FontPage.cpp//FontPage.cpp:
implementationfile//#include"stdafx.h"#include"resource.h"#include"FontPage.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif
///////////////////////////////////////////////////////////////////////////////CFontPagepropertypageIMPLEMENT_DYNCREATE(CFontPage,CPropertyPage)CFontPage:
:
CFontPage(LOGFONT*plogfont/*=NULL*/):
CPropertyPage(CFontPage:
:
IDD){//{{AFX_DATA_INIT(CFontPage)//}}AFX_DATA_INITLOGFONTlogfont;CWindowDCdc(GetDesktopWindow());m_cyPixelsPerInch=GetDeviceCaps(dc,LOGPIXELSY);if(plogfont==NULL){CFont*pfont=dc.GetCurrentFont();pfont->GetLogFont(&logfont);plogfont=&logfont;}m_fontSample.CreateFontIndirect(plogfont);m_bStrikeOut=plogfont->lfStrikeOut;m_bUnderline=plogfont->lfUnderline;m_sFont=plogfont->lfFaceName;m_sSize.Format("%d",MulDiv(plogfont->lfHeight,72,m_cyPixelsPerInch));m_sStyle=_T("Regular");if(plogfont->lfWeight>=700&&plogfont->lfItalic)m_sStyle=_T("BoldItalic");elseif(plogfont->lfItalic)m_sStyle=_T("Italic");elseif(plogfont->lfWeight>=700)m_sStyle=_T("Bold");}
CFontPage:
:
~CFontPage(){}voidCFontPage:
:
DoDataExchange(CDataExchange*pDX){CPropertyPage:
:
DoDataExchange(pDX);//{{AFX_DATA_MAP(CFontPage)DDX_Control(pDX,IDC_SAMPLE,m_staticSample);DDX_Control(pDX,IDC_STYLE,m_comboStyle);DDX_Control(pDX,IDC_FONTSIZE,m_comboSize);DDX_Control(pDX,IDC_FONT,m_comboFont);DDX_Check(pDX,IDC_STRIKEOUT,m_bStrikeOut);DDX_Check(pDX,IDC_UNDERLINE,m_bUnderline);DDX_CBString(pDX,IDC_FONT,m_sFont);DDX_CBString(pDX,IDC_FONTSIZE,m_sSize);DDV_MaxChars(pDX,m_sSize,LF_FACESIZE);DDX_CBString(pDX,IDC_STYLE,m_sStyle);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CFontPage,CPropertyPage)//{{AFX_MSG_MAP(CFontPage)ON_CBN_SELCHANGE(IDC_FONT,OnSelChange)ON_CBN_SELCHANGE(IDC_STYLE,OnSelChange)ON_CBN_SELCHANGE(IDC_FONTSIZE,OnSelChange)ON_BN_CLICKED(IDC_STRIKEOUT,OnSelChange)ON_BN_CLICKED(IDC_UNDERLINE,OnSelChange)ON_CBN_KILLFOCUS(IDC_FONT,OnSelChange)ON_CBN_KILLFOCUS(IDC_STYLE,OnSelChange)ON_CBN_KILLFOCUS(IDC_FONTSIZE,OnSelChange)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CFontPagemessagehandlersBOOLCFontPage:
:
OnInitDialog(){CPropertyPage:
:
OnInitDialog();CWindowDCdc(this);LOGFONTlogfont;logfont.lfCharSet=DEFAULT_CHARSET;logfont.lfFaceName[0]='\0';logfont.lfPitchAndFamily=0;EnumFontFamiliesEx(dc.m_hDC,&logfont,(FONTENUMPROC)FontEnumProc,(LPARAM)this,0);//FillSizecomboboxwith"common"sizesTCHAR*Defaults[]={_T("8"),_T("9"),_T("10"),_T("11"),_T("12"),_T("14"),_T("16"),_T("18"),_T("20"),_T("22"),_T("24"),_T("26"),_T("28"),_T("36"),_T("48")};for(inti=0;i<(sizeof(Defaults)/sizeof(Defaults[0]));i++)m_comboSize.AddString(Defaults[i]);//FillStylecomboboxwith"common"stylesm_comboStyle.AddString(_T("Regular"));m_comboStyle.AddString(_T("Bold"));m_comboStyle.AddString(_T("Italic"));m_comboStyle.AddString(_T("BoldItalic"));returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE}intCALLBACKCFontPage:
:
FontEnumProc
(ENUMLOGFONTEX*l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 问题 技巧