AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

Visual C++编程技巧(下)

51自学网 2015-08-30 http://www.wanshiok.com

 

53、如何显示旋转文本

只要用户使用TrueType或者GDI笔或字体就可以显示旋转文本(有些硬件设备也支持旋转光栅字体)。LOGFONT结构中的ifEscapement成员指定了文本行和x轴的角度,角度的单位是十分之一度而不是度,例如,ifEscapement为450表示字体旋转45度。为确保所有的字体沿坐标系统的同一方向旋转,一定要设置ifEscapement成员的CLIP_LH_ANGLES位,否则,有些字体可能反向旋转。下例使用了14点Arial字体每间隔15度画一个串。

void CSampleView:: OnDraw (CDC* pDC)

{

//Determine the size of the window.

CRect rcClient;

GetClientRect (rcClient);

//Create sample string.

CString str (_T ("Wheeee...I am rotating!"));

//Draw transparent, red text.

pDC->SetBkMode (TRANSPARENT);

pDC->SetTextColor (RGB (255,0,0));

CFont font; //font object

LOGFONT stFont; //font definition

//Set font attributes that will not change.

memset (&stFont, 0, sizeof (LOGFONT));

stFont.ifheight=MulDiv (14, -pDC->GetDeviceCaps (LOGPIXELSY), 72);

stFont.ifWeight=FW_NORMAL;

stFont.ifClipPrecision=LCIP_LH_ANGLES;

strcpy (stFont.lfFaceName, "Arial");

//Draw text at 15degree intervals.

for (int nAngle=0; nAngle<3600; nAngle+=150)

{

//Specify new angle.

stFont.lfEscapement=nAngle;

//Create and select font into dc.

font.CreateFontIndirect (&stfont);

CFont* pOldFont=pDC->SelectObject (&font);

//Draw the text.

pDC->SelectObject (pOldFont);

font.DelectObjext ();

}

}

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

调用GDI文本绘画函数时需要展开标签字符,这可以通过调用CDC:: TabbedTextOut或者CDC:: DrawText并指定DT_EXPANDTABS标志来完成。TabbedTextOut函数允许指定标签位的数组,下例指定每20设备单位展开一个标签:

void CSampleView:: OnDraw (CDC* pDC)

{

CTestDoc* pDoc=GetDocument ();

ASSERT_VALID (pDoC);

CString str;

str.Format (_T ("Cathy/tNorman/tOliver"));

int nTabStop=20; //tabs are every 20 pixels

pDC->TabbedtextOut (10, 10, str, 1, &nTabStop, 10);

}

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

调用CDC:: DrawText并指定DT_END_ELLIPSIS标志,这样就可以用小略号取代串末尾的字符使其适合于指定的边界矩形。如果要显示路径信息,指定DT_END_ELLIPSIS标志并省略号取代串中间的字符。

void CSampleView:: OnDraw (CDC* pDC)

{

CTestDoc* pDoc=GetDocument ();

ASSERT_VALID (pDoc);

//Add ellpsis to end of string if it does not fit

pDC->Drawtext (CString ("This is a long string"),

CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS);

//Add ellpsis to middle of string if it does not fit

pDC->DrawText (AfxgetApp () ->m_pszhelpfilePath,

CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS);

}

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

调用CString:: Format,该函数和printf函数具有相同的参数,下例说明了如何使用Format函数:

//Get size of window.

CRect rcWindow;

GetWindowRect (rcWindow);

//Format message string.

CString strMessage;

strMessage.Format (_T ("Window Size (%d, %d)"),

rcWindow.Width (), rcWindow.Height ());

//Display the message.

MessageBox (strmessage);

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

需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值),工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。

//Disable MFC from automatically disabling menu items.

m_bAuoMenuEnable=FALSE;

//Now enable the menu item.

CMenu* pMenu=GetMenu ();

ASSERT_VALID (pMenu);

pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND | MF_ENABLED);

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

给系统菜单添加一个菜单项需要进行下述三个步骤:

首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...

可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;

其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项:

int CMainFrame:: OnCreate (LPCREATESTRUCT lpCreateStruct)

{



//Make sure system menu item is in the right range.

ASSERT (IDM_MYSYSITEM &0xFFF0)==IDM_MYSYSITEM);

ASSERT (IDM-MYSYSITEM<0xF000);

//Get pointer to system menu.

CMenu* pSysmenu=GetSystemmenu (FALSE);

ASSERT_VALID (pSysMenu);

//Add a separator and our menu item to system menu.

CString StrMenuItem (_T ("New menu item"));

pSysMenu->Appendmenu (MF_SEPARATOR);

pSysMenu->AppendMenu (MF_STRING, IDM_MYSYSITEM, strMenuitem);



}

现在,选择系统菜单项时用户应进行检测。使用ClassWizard处理

WM_SYSCOMMAND消息并检测用户菜单的nID参数:

void CMainFrame:: OnSysCommand (UINT nID,LPARAM lParam)

{

//Determine if our system menu item was selected.

if ( (nID & 0xFFF0)==IDM_MYSYSITEM)

{

//TODO-process system menu item

}

else

CMDIFrameWnd:: OnSysCommand (nID, lParam);

}

最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这可以通过增加一个包含系统菜单基ID的串表的入口来实现。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:Visual&nbsp;C++编程技巧(中)  下一篇:MFC中常用类,宏,函数介绍