学习vc++常用技巧总结(6)

2019-01-12 12:27

(54) 如何更新翻转背景颜色的文本

调用CDC:: SetBkmode并传送OPAQUE用当前的背景颜色填充背景,或者调用CDC::SetBkMode并传送TRANSPAARENT使背景保持不变,这两种方法都可以设置背景模式。下例设置背景模式为TRANSPARENT,可以两次更新串,用花色带黑阴影更新文本。黑色串在红色串之后,但由于设置了背景模式仍然可见。

void CSampleView:: OnDraw (CDC* pDC) {

//Determint size of view. CRect rcView

GetClientRect (rcVieew)

//Create sample string to display.

CString str (_T (\...\//Set the background mode to transparent. pDC->SetBKMode (TRANSPARENT)

//Draw black shadow text. rcView.OffsetRect (1, 1)

pDc->SetTextColor (RGB (0, 0, 0))

pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER)

//Draw red text.

rcView.OffsetRect (-1,-1)

pDc->SetTextColor (RGB (255, 0, 0))

pDC->DrawText (str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER) }

(55) 如何创建一个具有特定点大小的字体 可以指定字体逻辑单位的大小,但有时指定字体的点的大小可能会更方便一些。可以如下将字体的点转换为字体的高度:

int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72) 下例创建了一个8点的Apial字体: …

CClientDC dc (AqfxGetMainWnd ())

m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T(\

(56) 如何计算一个串的大小

函数CDC:: Det text Extent 根据当前选择的字体计算一个串的高度和宽度。如果使用的不是系统字体而是其他字体,则在调用GetTextExtent之前将字体选进设备上下文中是很重要的,否则计算高度和宽度时将依据系统字体,由此得出的结果当然是不正确的。下述样板程序当改变下压按钮的标题时动态调整按钮的大小,按钮的大小由按钮的字体和标题的大小而定。响应消息WM_SETTEXT时调用OnSetText,该消息使用ON_MESSAE宏指令定义的用户自定义消息。

LRESULT CMyButton:: OnSettext (WPARAM wParam, LPARAM lParam) {

//Pass message to window procedure.

LRESULT bResult=CallWindowProc (*GetSuperWndProcAddr(), m_hWnd, GetCurrentMessage() ->message,wParam,lParam) //Get title of push button. CString strTitle

GetWindowText (strTitle)

//Select current font into device context. CDC* pDC=GetDc () CFont*pFont=GetFont ()

CFont*pOldFont=pDC->SelectObject (pFont)

//Calculate size of title.

CSize size=pDC->GetTextExent (strTitle,strTitle.GetLength())

//Adjust the button's size based on its title. //Add a 5-pixel border around the button.

SetWindowPos (NULL, 0, 0, size.cx+10, size.cy+10, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE) //Clean up.

pDC->SelectFont (pOldFont) ReleaseDC (pDC)

return bResult }

(57) 如何显示旋转文本

只要用户使用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 (\...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, \

//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() } }

(58) 如何正确显示包含标签字符的串

调用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 (\int nTabStop=20 //tabs are every 20 pixels

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

(59) 如何快速地格式化一个CString对象

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

//Get size of window. CRect rcWindow

GetWindowRect (rcWindow) //Format message string. CString strMessage

strMessage.Format (_T (\

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

//Display the message. MessageBox (strmessage)

(60) 串太长时如何在其末尾显示一个省略号

调用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 (\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) }

(61) 为什么即使调用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)

(62) 如何给系统菜单添加一个菜单项

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

首先,使用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 (\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.


学习vc++常用技巧总结(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:导学案 谏太宗十思疏

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: