VC常见问题108二Word格式文档下载.docx
- 文档编号:16935149
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:22
- 大小:27.56KB
VC常见问题108二Word格式文档下载.docx
《VC常见问题108二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VC常见问题108二Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
由于控件是也是窗口,用户可以调用CWnd:
SetFont指定新字体。
该函数用一个Cfont指针,要保证在控件撤消之前不能撤消字体对象。
下例将下压按钮的字体改为8点Arial字体:
//Declarefontobjectinclassdeclaration(.Hfile).
private:
Cfontm_font
//Setfontinclassimplementation(.Cppfile).Notem_wndButtonisa
//membervariableaddedbyClassWizard.DDXroutineshookthemember
//variabletoadialogbuttoncontrlo.
…
//Createan8-pointArialfont
m_font.CreateFont(MulDiv(8,-pDC
—>
GetDeviceCaps(LOGPIXELSY),72).0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSER,OUT_STROKE_PRECIS,
CLIP_STROKE_PRECIS,DRAFT_QUALITY
VARIABLE_PITCH|FF_SWISS,_T("
Arial"
))
//Setfontforpushbutton.
m_wndButton.SetFont(&
m_font)
(40)如何在OLE控件中使用OLE_COLOR数据类型
诸如COleControl:
GetFortColor和COleControl:
GetBackColor等函数返回OLE_COLOR数据类型的颜色,而GDI对象诸如笔和刷子使用的是COLORREF数据类型,调用COleControl:
TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF类型。
下例创建了一个当前背景颜色的刷子:
voidCSampleControl:
OnDraw(CDC*pdc
constCrect&
rcBounds,constCrect&
rcInvalid
)
//Createabrushofthecuttentbackgroundcolor.
CBrushbrushBack(TranslateColor(GetBackColor()))
//Paintthebackgroundusingthecurrentbackgroundcolor.
pdc—>
FilllRect(rcBounds,&
brushBack)
//otherdrawigncommands
(41)在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd:
DlgDirList或者CWnd:
DlgDirListComboBox,Windows将自动地向列表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文件填充在组合框中:
BOOLCSampleDig:
TCHARszPath[MAX_PATH]={"
c:
\\windows"
intnReslt=DlgDirListComboBox(szPath,IDC_COMBO,IDC_CURIDIR,DDL_READWRITE|DDL_READONLY|DDL_HIDDEN|DDL_SYSTEM|DDL_ARCHIVE)
(42)为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl:
SetRange设置旋转按钮控件的范围,旋转按钮控件的缺省上限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。
下例将旋转按钮控件的范围设置为0到100:
BOOLCAboutDlg:
//setthelowerandupperlimitofthespinbutton
m_wndSpin.SetRange(0,100)
VisualC++4.0Print对话中的Copise旋转按钮控件也有同样的问题:
按下Up按钮时拷贝的数目减少,而按下Down按钮时拷贝的数目增加。
(43)为什么旋转按钮控件不能自动地更新它下面的编辑控件
如果使用旋转按钮的autubuddy特性,则必须保证在对话的标记顺序中buddy窗口优先于旋转按钮控件。
从Layout菜单中选择TabOrder菜单项(或者按下Crtl+D)可以设置对话的标签顺序。
(44)如何用位图显示下压按钮
Windows95按钮有几处新的创建风格,尤其是BS_BITMAP和BS_ICON,要想具有位图按钮,创建按钮和调用CButton:
SetBitmap或CButton:
SetIcon时要指定BS_BITMAP或BS_ICON风格。
首先,设置按钮的图标属性。
然后,当对话初始化时调用CButton:
SetIcon。
注意:
下例用图标代替位图,使用位图时要小心,因为不知道背景所有的颜色——并非每个人都使用浅灰色。
BOOLCSampleDlg:
//settheimagesforthepushbuttons.
m_wndButton1.SetIcon(AfxGetApp()—>
LoadIcon(IDI_IPTION1))
m_wndButton2.SetIcon(AfxGetApp()—>
LoadIcon(IDI_IPTION2))
m_wndButton3.SetIcon(AfxGetApp()—>
LoadIcon(IDI_IPTION3))
(45)如何一个创建三态下压按钮
可以使用新的BS_PUSHBUTTON风格位和检测框以及按钮来创建一个三态下压按钮。
这很容易,只需将检测框和按钮拖拉到对话中并指定属性Push—like即可。
不用任何附加程序就可以成为三态下压按钮。
(46)如何动态创建控件
分配一个控件对象的实例并调用其Create成员函数。
开发者最容易忽略两件事:
忘记指定WS_VISBLE标签和在栈中分配控件对象。
下例动态地创建一个下压按钮控件:
//Inclassdeclaration(.Hfile).
CButton*m_pButton
//Inclassimplementation(.cppfile).
m_pButton=newCButton
ASSERT_VALID(m_pButton)
m_pButton—>
Create(_T("
ButtonTitle"
),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON.Crect(0,0,100,24),this,IDC_MYBUTTON)
(47)如何限制编辑框中的准许字符
如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建标志ES_NUMBERS,它是Windows95新增加的标志,该标志限制编辑控件只按收数字字符。
如果用户需要复杂的编辑控件,可以使用Microsoft的屏蔽编辑控件,它是一个很有用的OLE定制控件。
如果希望不使用OLE定制控件自己处理字符,可以派生一个CEdit类并处理WM_CHAR消息,然后从编辑控件中过滤出特定的字符。
首先,使用ClassWizard建立一个CEdit的派生类,其次,在对话类中指定一个成员变量将编辑控件分类在OnInitdialog中调用CWnd:
SubclassDlgItem.
//Inyourdialogclassdeclaration(.Hfile)
CMyEditm_wndEdit//Instanceofyourneweditcontrol.
//Inyoudialogclassimplementation(.CPPfile)
//Subclasstheeditlontrod.
m_wndEdit.SubclassDlgItem(IDC_EDIT,this)
使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以确定是否修改、传送字符。
下例说明了如何显示字母字符,如果字符是字母字符,则调用CWndOnChar,否则不调用OnChar.
//Onlydisplayalphabeticdharacters.
voidCMyEdit:
OnChar(UINTnChar,UINTnRepCnt,UITNnFlags)
//DetermineifnCharisanalphabeticcharacter.
if(:
IsCharAlpha((TCHAR)nChar))
CEdit:
OnChar(nChar,nRepCnt,nFlags)
如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit:
OnChar,然后CEdit:
OnChar调用CWnd:
Default获取原来的wParam和lParam的值,这样是不行的。
要修改一个字符,需要首先修改nChar,然后用修改过的nChar调用CWnd:
DefWindowProc。
下例说明了如何将字符转变为大写:
//Makeallcharactersuppercase
OnChar(UINTnChar,UINTnRepCnt,UINTnFlags)
//Makesurecharacterisuppercase.
IsCharAlpha(.(TCHAR)nChar)
nChar=:
CharUpper(nChar)
//BypassdefaultOnCharprocessinganddirectlycall
//defaultwindowproc.
DefWindProc(WM_CHAR,nChar,MAKELPARAM(nRepCnt,nFlags))
(48)如何改变控件的颜色
其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反射在控件类中指定颜色。
当控件需要重新着色时,工作框调用父窗口(通常是对话框)的CWnd:
OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。
例如,下述代码将对话中的所有编辑控件文本颜色改为红色:
HBRUSHCAboutDig:
OnCtlColor(CDC*pDCM,CWnd*pWnd,UINTnCtlColor)
HBRUSHhbr=CDialog:
OnCtlColor(pDC,pWnd,nCtlColor)
//Drawredtextforalleditcontrols.
if(nCtlColor==CTLCOLOR_EDIT)
pDC—>
SetTextColor(RGB(255,0,0,))
returnhbr
然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。
控件处理该消息并指定绘画属性更合情合理。
消息反射允许用户这样做。
通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。
创建一个定制彩色列表框控件必须遵循下述步骤。
首先,使用ClassWizard创建一个CListBox的派生类并为该类添加下述数据成员。
classCMyListBoxpublilcCListBox
private
COLORREFm_clrFor//foregroundcolor
COLORREFm_clrBack//backgroundcolor
Cbrushm_brush//backgroundbrush
其次,在类的构造函数中,初始化数据中。
CMyListBox:
CMyListBox()
//Initializedatamembers.
m_clrFore=RGB(255,255,0)//yellowtext
m_clrBack=RGB(0,0,255)//bluebackground
m_brush.CreateSolidBrush(m_clrBack)
最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画属性。
HBRUSHCMyListBox:
CtlColor(CDC*pDC,UINTnCtlColor)
pDC—>
SetTextColor(m_clrFore)
SetBkColor(m_clrBack)
return(HBRUSH)m_brush.GetSafeHandle()
现在,控件可以自己决定如何绘画,与父窗口无关。
(49)当向列表框中添加多个项时如何防止闪烁
:
SetRedraw清除重画标志可以禁止CListBox(或者窗口)重画。
当向列表框添加几个项时,用户可以清除重画标志,然后添加项,最后恢复重画标志。
为确保重画列表框的新项,调用SetRedraw(TRUE)之后调用CWnd:
Invalidate。
//Disableredrawing.
pListBox->
SetRedraw(FALSE)
//Fillinthelistboxgere
//Enabledrwingandmakesurelistboxisredrawn.
SetRedraw(TRUE)
Invalidate()
(50)如何向编辑控件中添加文本
由于没有CEdit:
AppendText函数,用户只好自己做此项工作。
调用CEdit:
SetSel移动到编辑控件末尾,然后调用CEdit:
ReplaceSel添加文本。
下例是AppendText的一种实现方法:
voidCMyEdit:
AppendText(LPCSTRpText)
intnLen=GetWindowTextLength()
SetFocus()
SetSel(nLen,nLen)
ReplaceSel(pText)
(51)如何访问预定义的GDI对象
可以通过调用CDC:
SlectStockObject使用Windows的几个预定义的对象,诸如刷子、笔以及字体。
下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。
//Drawellipseusingstockblackpenandgraybrush.
voidCSampleView:
OnDraw(CDC*pDC)
//Determinesizeofview.
CRectrcView
GetClientRect(rcView)
//Usestockblackpenandstockgraybrushtodrawellipse.
pDC->
SelectStockObject(BLACK_PEN)
SelectStockObject(GRAY_BRUSH)
//Drawtheellipse.
Ellipse(reView)
也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:
voidCsampleView:
//Usebackgroundcolorfortooltipsbrush.
CBrush*pOrgBrush=pDC->
SelectObject(CBrush:
FromHandle(:
GetSysColorBrush(COLOR_INFOBK)))
Ellipse(rcView)
//Restoreoriginalbrush.
SelectObject(pOrgBrush)
(52)如何获取GDI对象的属性信息
可以调用GDIObject:
GetObject。
这个函数将指定图表设备的消息写入到缓冲区。
下例创建了几个有用的辅助函数。
//Determineiffontisbold.
BOOLIsFontBold(constCFont&
font)
LOGFONTstFont
font.GetObject(sizeof(LOGFONT),&
stFont)
return(stFont.lfBold)?
TRUE:
FALSE
//Returnthesizeofabitmap.
CSizeGetBitmapSize(constCBitmap&
bitmap)
BITMAPstBitmap
bitmap.GetObject(sizeof(BITMAP),&
stBitmap)
returnCSize(stBitmap.bmWidth,stBitmap.bmHeight)
//Createapenwiththesamecolorasabrush.
BOOLCreatePenFromBrush(Cpen&
pen,costCbrush&
brush)
LOGBRUSHstBrush
brush.Getobject(sizeof(LOGBRUSH),&
stBrush)
returnpen.Createpen(PS_SOLID,0,stBrush.ibColor)
(53)如何实现一个橡皮区矩形
CRectTracker是一个很有用的类,可以通过调用CRectTracker:
TrackRubberBand响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。
下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。
首先,在文件档中声明一个CRectTracker数据成员:
classCSampleView:
PublicCView
public:
CrectTrackerm_tracker
其次,在文档类的构造函数中初始化CRectTracker对象:
CSampleDoc:
CSampleDOC()
//Initializetrackerposition,sizeandstyle.
m_tracker.m_rect.SetRect(0,0,10,10)
m_tracker.m_nStyle=CRectTracker:
resizeInside|CRectTracker:
dottedLine
然后,在OnDraw函数中画椭圆和踪迹矩形:
CSampleDoc*pDoc=GetDocument()
ASSERT_VALID(pDoc)
//Selectbluebrushintodevicecontext.
CBrushbrush(RGB(0,0,255))
CBrush*pOldBrush=pDC->
SelectObject(&
//drawellipseintrackingrectangle.
CrectrcEllipse
pDoc->
m_tracker.GetTrueRect(rcEllipse)
Ellipse(rcEllipse)
//Drawtrackingrectangle.
m_tracker.Draw(pDC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 常见问题 108