导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

★分享:Visual C++编程技巧★

uoyevoli 2004-04-05 12:10:37
Visual C++编程技巧
(文章来自安全焦点)
1. 如何获取应用程序的实例句柄?
应用程序的实例句柄保存在CWinAppIm_hInstance 中,可以这么调用
AfxGetInstancdHandle获得句柄.
Example: HANDLE hInstance=AfxGetInstanceHandle();
2. 如何通过代码获得应用程序主窗口的指针?
主窗口的指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //使程序最大化.
3. 如何在程序中获得其他程序的图标?
两种方法:
(1) SDK函数SHGetFileInfo 或使用ExtractIcon获得图标资源的handle,
(2) SDK函数SHGetFileInfo获得有关文件的很多信息,如大小图标,属性,类型等.
Example(1): 在程序窗口左上角显示NotePad图标.
void CSampleView: OnDraw(CDC * pDC)
{
if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0,
&stFileInfo,sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon);
}
}
Example(2): 同样功能,Use ExtractIcon Function
void CSampleView:: OnDraw(CDC *pDC)
{
HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
说明: 获得notepad.exe 的路径正规上来说用GetWindowsDirectory 函数得到,如果是
调用win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程
序,考虑应该全面点.
4. 如何编程结束应用程序?如何编程控制windows 的重新引导?
这是个很简单又是编程中经常要遇到的问题.
第一问,向窗口发送WM_CLOSE消息,调用CWnd::OnClose成员函数.允许对用户提示
是否保存修改过的数据.
Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);
还可以创建一个自定义的函数Terminate Window
void Terminate Window(LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);
if (pWnd)
pWnd ->SendMessage(WM_CLOSE);
}
说明: FindWindow 函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要
检测Notepad 是不是已运行而事先不知道Notepad 的标题栏,这时FindWindow 就无能
为力了,可以通过枚举windows 任务列表的办法来实现。在机械出版社"Windows 95
API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。
第二问,Use ExitWindowsEx Function 函数控制系统是重新引导,还是重启windows.
前面已经有人讲过乐,就不再提了。
5. 怎样加栽其他的应用程序?
我记得这好象是出场频度很高的问题。
三个SDK函数winexec, shellexecute,createprocess可以使用。
WinExec 最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说
一下,比如泥用SW_SHOWMAXMIZED 方式去加栽一个无最大化按钮的程序,呵呵就是
Neterm,calc 等等,就不会出现正常的窗体,但是已经被加到任务列表里了。
ShellExecute较WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开
c:\temp\1.txt,而不用加栽与txt 文件关联的应用程序,很多安装程序完成后都会打开
...全文
172 点赞 收藏 26
写回复
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
fhqiplj 2004-06-11
非常感谢

回复
kugou123 2004-06-11
收藏……
回复
artliu520 2004-06-11
楼主超强啊!
回复
fun1357 2004-06-11
mark
回复
inutility 2004-04-14
mark
回复
agong1980 2004-04-14
好 我顶
回复
ddslayers 2004-04-09
mark
回复
ao 2004-04-07
mark
回复
liangpd 2004-04-07
thx,后面还有吗?
回复
angelcool 2004-04-07
study
thanks
回复
public 2004-04-07
mark
回复
九重霄 2004-04-07
sc
回复
13159860901 2004-04-07
学习中
谢谢各位大哥指点
回复
NOMADBLUE 2004-04-07
study
回复
NOMADBLUE 2004-04-07
MARK
回复
我不要昵称 2004-04-07
mark
回复
uoyevoli 2004-04-05
return TRUE ;
}
Visual C++ 4.0 Print对话中的Copise旋转按钮控件也有同样的问题:按下Up 按钮时
拷贝的数目减少,而按下Down 按钮时拷贝的数目增加。
39. 为什么旋转按钮控件不能自动地更新它下面的编辑控件
如果使用旋转按钮的autu buddy特性, 则必须保证在对话的标记顺序中buddy窗口优
先于旋转按钮控件。从Layout 菜单中选择Tab Order 菜单项(或者按下Crtl+D)可以
设置对话的标签顺序。
40. 如何用位图显示下压按钮
Windows 95按钮有几处新的创建风格,尤其是BS_BITMAP和BS_ICON,要想具有位图按
钮,创建按钮和调用CButton : : SetBitmap 或CButton : : SetIcon时要指定BS_BITMAP
或BS_ICON风格。
首先,设置按钮的图标属性。
然后,当对话初始化时调用CButton: : SetIcon。注意:下例用图标代替位图,使用位
图时要小心,因为不知道背景所有的颜色——并非每个人都使用浅灰色。
BOOL CSampleDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( ) ;
//set the images for the push buttons .
m_wndButton1.SetIcon (AfxGetApp ( ) —> LoadIcon (IDI _ IPTION1) )
m_wndButton2.SetIcon (AfxGetApp ( ) —> LoadIcon (IDI _ IPTION2) )
m_wndButton3.SetIcon (AfxGetApp ( ) —> LoadIcon (IDI _ IPTION3) )
return TRUE ;
} //In class declaration (.H file ).
private :
CButton* m _pButton ;
//In class implementation (.cpp file ) .
m_pButton =new CButton ;
ASSERT_VALID (m_pButton);
m_pButton —>Create (_T ("Button Title ") , WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON.
Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )
41. 如何限制编辑框中的准许字符
如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建
标志ES_NUMBERS,它是Windows 95 新增加的标志,该标志限制编辑控件只按收数字字
符。如果用户需要复杂的编辑控件,可以使用Microsoft 的屏蔽编辑控件,它是一个很
有用的OLE定制控件。
如果希望不使用OLE 定制控件自己处理字符,可以派生一个CEdit 类并处理WM_CHAR
消息,然后从编辑控件中过滤出特定的字符。首先,使用ClassWizard 建立一个CEdit
的派生类,其次,在对话类中指定一个成员变量将编辑控件分类在OnInitdialog 中调
用CWnd: : SubclassDlgItem .
//In your dialog class declaration (.H file )
private :
CMyEdit m_wndEdit ; // Instance of your new edit control .
//In you dialog class implementation (.CPP file )
BOOL CSampleDialog : : OnInitDialog ( )
{

//Subclass the edit lontrod .
m_wndEdit .SubclassDlgItem (IDC_EDIT,this );

}
使用ClassWizard 处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以
确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调
用CWnd ; OnChar,否则不调用OnChar.
//Only display alphabetic dharacters .
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
{
//Determine if nChar is an alphabetic character .
if (: : IsCharAlpha ( ( TCHAR) nChar ) )
CEdit : : OnChar (nChar, nRepCnt , nFlags );
}
如果要修改字符,则不能仅仅简单地用修改过的nChar 调用CEdit : : OnChar,然后
CEdit: : OnChar调用CWnd: : Default 获取原来的wParam 和lParam 的值,这样是
不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar 调用CWnd: :
DefWindowProc。下例说明了如何将字符转变为大写:
//Make all characters uppercase
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
{
//Make sure character is uppercase .
if (: : IsCharAlpha ( .( TCHAR) nChar)
nChar=: : CharUpper (nChar ) ;
//Bypass default OnChar processing and directly call
//default window proc.
DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;
)
42. 如何改变控件的颜色
有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0 新的消息反射在
控件类中指定颜色。当控件需要重新着色时,工作框调用父窗口(通常是对话框)的
CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属性。例如,
下述代码将对话中的所有编辑控件文本颜色改为红色:
HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)
{
HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );
//Draw red text for all edit controls .
if (nCtlColor= = CTLCOLOR_EDIT )
pDC —> SetTextColor (RGB (255 , 0 , 0 , ) ) ;
return hbr ;
}
然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,这种方法
不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。消息反射允
许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理则发送给控件。创建
一个定制彩色列表框控件必须遵循下述步骤。
首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据成员。
class CMyListBox ; publilc CListBox
{

private:
COLORREF m_clrFor ; // foreground color
COLORREF m_clrBack ; //background color
Cbrush m_brush ; //background brush

} ;
其次,在类的构造函数中,初始化数据中。
CMyListBox : : CMyListBox ()
{
//Initialize data members .
m_clrFore =RGB (255 , 255 , 0) ; // yellow text
m_clrBack=RGB (0 , 0 , 255) ; // blue background
m_brush . CreateSolidBrush (m _clrBack );
}
最后,使用ClassWizard 处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新的绘画
属性。
HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
{
pDC—>SetTextColor (m_clrFore);
pDC—>SetBkColor (m_clrBack);
return (HBRUSH) m_brush.GetSafeHandle ()
}
现在,控件可以自己决定如何绘画,与父窗口无关。
43. 当向列表框中添加多个项时如何防止闪烁
调用CWnd::SetRedraw 清除重画标志可以禁止CListBox(或者窗口)重画。当向列表
框添加几个项时,用户可以清除重画标志,然后添加项,最后恢复重画标志。为确保重
画列表框的新项,调用SetRedraw (TRUE) 之后调用CWnd::Invalidate。
//Disable redrawing.
pListBox->SetRedraw (FALSE);
//Fill in the list box gere
//Enable drwing and make sure list box is redrawn.
pListBox->SetRedraw (TRUE);
pListBox->Invalidate ();
44. 如何向编辑控件中添加文本
由于没有CEdit:: AppendText 函数,用户只好自己做此项工作。调用CEdit:: SetSel
移动到编辑控件末尾,然后调用CEdit:: ReplaceSel 添加文本。下例是AppendText 的
一种实现方法:
void CMyEdit:: AppendText (LPCSTR pText)
{
int nLen=GetWindowTextLength ();
SetFocus ();
SetSel (nLen, nLen);
ReplaceSel (pText);
}
45. 如何访问预定义的GDI 对象
可以通过调用CDC:: SlectStockObject使用Windows 的几个预定义的对象,诸如刷子、
笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。
//Draw ellipse using stock black pen and gray brush.
void CSampleView:: OnDraw (CDC* pDC)
{
//Determine size of view.
CRect rcView;
GetClientRect (rcView);
//Use stock black pen and stock gray brush to draw ellipse.
pDC->SelectStockObject (BLACK_PEN);
pDC->SelectStockObject (GRAY_BRUSH)
//Draw the ellipse.
pDC->Ellipse (reView);
}
也可以调用新的SDK 函数GetSysColorBrush 获取一个系统颜色刷子,下例用背景色在
视窗中画一个椭圆:
void CsampleView:: OnDraw (CDC* pDC)
{
//Determine size of view.
CRect rcView;
GetClientRect (rcView);
//Use background color for tooltips brush.
CBrush * pOrgBrush=pDC->SelectObject (
CBrush::FromHandle (::GetSysColorBrush (COLOR_INFOBK)));
//Draw the ellipse.
pDC->Ellipse (rcView);
//Restore original brush.
pDC->SelectObject (pOrgBrush);
}
46. 如何获取GDI对象的属性信息
可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到缓冲区。下
例创建了几个有用的辅助函数。
//Determine if font is bold.
BOOL IsFontBold (const CFont&font)
{
LOGFONT stFont;
font.GetObject (sizeof (LOGFONT), &stFont);
return (stFont.lfBold)? TRUE: FALSE;
}
//Return the size of a bitmap.
CSize GetBitmapSize (const CBitmap&bitmap)
{
BITMAP stBitmap;
bitmap.GetObject (sizeof (BITMAP), &stBitmap);
return CSize (stBitmap.bmWidth, stBitmap. bmHeight);
}
//Create a pen with the same color as a brush.
BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)
{
LOGBRUSH stBrush;
brush.Getobject (sizeof (LOGBRUSH), &stBrush);
return pen. Createpen (PS_SOLID, 0, stBrush.ibColor);
}
47. 如何实现一个橡皮区矩形
CRectTracker 是一个很有用的类,可以通过调用CRectTracker:: TrackRubberBand 响
应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动和重
置视窗中的蓝色椭圆的大小是很容易的事情。
首先,在文件档中声明一个CRectTracker数据成员:
class CSampleView : Public CView
{

public :
回复
uoyevoli 2004-04-05
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE
_COLOR数据类型的颜色,而GDI 对象诸如笔和刷子使用的是COLORREF数据类型,调用
COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF 类型。
下例创建了一个当前背景颜色的刷子:
void CSampleControl : : OnDraw (CDC* pdc, const Crect& rcBounds, const Crect&
rcInvalid )
{
//Create a brush of the cuttent background color .
CBrush brushBack (TranslateColor (GetBackColor ( ) ) );
//Paint the background using the current background color .
pdc—> FilllRect (rcBounds , &brushBack) ;
//other drawign commands

}
37. 在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列
表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文
件填充在组合框中:
BOOL CSampleDig : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;
int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,
DDL_READWRITE |DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_ARCHIVE ) ;
return TRUE ;
}
38. 为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转按钮控件的缺省上
限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按
钮控件的范围设置为0到100:
BOOL CAboutDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
//set the lower and upper limit of the spin button
m_wndSpin . SetRange ( 0 ,100 ) ;
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE
_COLOR数据类型的颜色,而GDI 对象诸如笔和刷子使用的是COLORREF数据类型,调用
COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF 类型。
下例创建了一个当前背景颜色的刷子:
void CSampleControl : : OnDraw (CDC* pdc, const Crect& rcBounds, const Crect&
rcInvalid )
{
//Create a brush of the cuttent background color .
CBrush brushBack (TranslateColor (GetBackColor ( ) ) );
//Paint the background using the current background color .
pdc—> FilllRect (rcBounds , &brushBack) ;
//other drawign commands

}
37. 在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列
表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文
件填充在组合框中:
BOOL CSampleDig : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;
int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,
DDL_READWRITE |DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_ARCHIVE ) ;
return TRUE ;
}
38. 为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转按钮控件的缺省上
限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按
钮控件的范围设置为0到100:
BOOL CAboutDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
//set the lower and upper limit of the spin button
m_wndSpin . SetRange ( 0 ,100 ) ;
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE
_COLOR数据类型的颜色,而GDI 对象诸如笔和刷子使用的是COLORREF数据类型,调用
COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF 类型。
下例创建了一个当前背景颜色的刷子:
void CSampleControl : : OnDraw (CDC* pdc, const Crect& rcBounds, const Crect&
rcInvalid )
{
//Create a brush of the cuttent background color .
CBrush brushBack (TranslateColor (GetBackColor ( ) ) );
//Paint the background using the current background color .
pdc—> FilllRect (rcBounds , &brushBack) ;
//other drawign commands

}
37. 在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列
表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文
件填充在组合框中:
BOOL CSampleDig : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;
int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,
DDL_READWRITE |DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_ARCHIVE ) ;
return TRUE ;
}
38. 为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转按钮控件的缺省上
限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按
钮控件的范围设置为0到100:
BOOL CAboutDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
//set the lower and upper limit of the spin button
m_wndSpin . SetRange ( 0 ,100 ) ;
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE
_COLOR数据类型的颜色,而GDI 对象诸如笔和刷子使用的是COLORREF数据类型,调用
COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF 类型。
下例创建了一个当前背景颜色的刷子:
void CSampleControl : : OnDraw (CDC* pdc, const Crect& rcBounds, const Crect&
rcInvalid )
{
//Create a brush of the cuttent background color .
CBrush brushBack (TranslateColor (GetBackColor ( ) ) );
//Paint the background using the current background color .
pdc—> FilllRect (rcBounds , &brushBack) ;
//other drawign commands

}
37. 在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列
表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文
件填充在组合框中:
BOOL CSampleDig : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;
int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,
DDL_READWRITE |DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_ARCHIVE ) ;
return TRUE ;
}
38. 为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转按钮控件的缺省上
限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按
钮控件的范围设置为0到100:
BOOL CAboutDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
//set the lower and upper limit of the spin button
m_wndSpin . SetRange ( 0 ,100 ) ;
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE
_COLOR数据类型的颜色,而GDI 对象诸如笔和刷子使用的是COLORREF数据类型,调用
COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF 类型。
下例创建了一个当前背景颜色的刷子:
void CSampleControl : : OnDraw (CDC* pdc, const Crect& rcBounds, const Crect&
rcInvalid )
{
//Create a brush of the cuttent background color .
CBrush brushBack (TranslateColor (GetBackColor ( ) ) );
//Paint the background using the current background color .
pdc—> FilllRect (rcBounds , &brushBack) ;
//other drawign commands

}
37. 在不使用通用文件打开对话的情况下如何显示一个文件列表
调用CWnd: : DlgDirList或者CWnd: : DlgDirListComboBox, Windows 将自动地向列
表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文
件填充在组合框中:
BOOL CSampleDig : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;
int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,
DDL_READWRITE |DDL_READONLY|DDL_HIDDEN|
DDL_SYSTEM|DDL_ARCHIVE ) ;
return TRUE ;
}
38. 为什么旋转按钮控件看起来倒转
需要调用CSpinCtrl : : SetRange 设置旋转按钮控件的范围,旋转按钮控件的缺省上
限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按
钮控件的范围设置为0到100:
BOOL CAboutDlg : : OnInitDialog ( )
{
CDialog : : OnInitDialog ( )
//set the lower and upper limit of the spin button
m_wndSpin . SetRange ( 0 ,100 ) ;
回复
uoyevoli 2004-04-05
ASSERT_VALID (m_wndToolBar);
DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ;
if (bDisplayTips)
dwStyle |=CBRS_TOOLTIPS ;
else
dwStyle & = ~ CBRS_TOOLTIPS ;
m_wndToolBar.SetBarStyle (dwStyle );
}
void CSampleDialog : : PostNcDestroy ( )
{
// Declete the C++ object that represents this dialog .
delete this ;
}
最后,要创建无模式对话。可以调用CDialog : : DoModal 创建一个模式对放, 要创
建一个无模式对话则要调用CDialog: : Create。下面的例子说明了应用程序是如何创
建无模式对话的:
void CMainFrame : : OnSampleDialog ( )
{
//Allocate a modeless dialog object .
CSampleDilog * pDialog =new CSampleDialog ;
ASSERT_VALID (pDialog) ;
//Create the modeless dialog .
BOOL bResult = pDialog —> Creste (IDD_IDALOG) ;
ASSERT (bResult ) ;
}
31. 如何在对话框中显示一个位图
这要归功于Win 32先进的静态控件和Microsoft 的资源编辑器, 在对话框中显示位图
是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、
位图以及增强型元文件。
32. 如何改变对话或窗体视窗的背景颜色
调用CWinApp : : SetDialogBkColor 可以改变所有应用程序的背景颜色。第一个参数
指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和
黄色文本。
BOOL CSampleApp : : InitInstance ( )
{

//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

}
需要重画对话(或对话的子控件)时,Windows 向对话发送消息WM_CTLCOLOR,通常用
户可以让Windows 选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一
个红色背景对话的步骤。
void CSampleDialog : : PostNcDestroy ( )
{
// Declete the C++ object that represents this dialog .
delete this ;
}
最后,要创建无模式对话。可以调用CDialog : : DoModal 创建一个模式对放, 要创
建一个无模式对话则要调用CDialog: : Create。下面的例子说明了应用程序是如何创
建无模式对话的:
void CMainFrame : : OnSampleDialog ( )
{
//Allocate a modeless dialog object .
CSampleDilog * pDialog =new CSampleDialog ;
ASSERT_VALID (pDialog) ;
//Create the modeless dialog .
BOOL bResult = pDialog —> Creste (IDD_IDALOG) ;
ASSERT (bResult ) ;
}
31. 如何在对话框中显示一个位图
这要归功于Win 32先进的静态控件和Microsoft 的资源编辑器, 在对话框中显示位图
是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、
位图以及增强型元文件。
32. 如何改变对话或窗体视窗的背景颜色
调用CWinApp : : SetDialogBkColor 可以改变所有应用程序的背景颜色。第一个参数
指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和
黄色文本。
BOOL CSampleApp : : InitInstance ( )
{

//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

}
需要重画对话(或对话的子控件)时,Windows 向对话发送消息WM_CTLCOLOR,通常用
户可以让Windows 选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一
个红色背景对话的步骤。
pSpin —> SetPos (10) ;
return TRUE ;
}
其二, 可以使用ClassWizard 将控件和成员变量联系起来。在ClassWizard 中简单地
选择Member Variables标签,然后选择Add Variable …按钮。如果在对话资源编辑器
中,按下Ctrl键并双击控件即可转到Add Member Variable对话。
34. 如何禁止和使能控件
控件也是窗口,所以可以调用CWnd : : EnableWindow使能和禁止控件。
//Disable button controls .
m_wndOK.EnableWindow (FALSE ) ;
m_wndApply.EnableWindow (FALSE ) ;
35. 如何改变控件的字体
由于控件是也是窗口,用户可以调用CWnd: : SetFont指定新字体。该函数用一个Cfont
指针,要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为8点Arial
字体:
//Declare font object in class declaration (.H file ).
private :
Cfont m_font ;
// Set font in class implementation (.Cpp file ). Note m_wndButton is a
//member variable added by ClassWizard.DDX routines hook the member
//variable to a dialog button contrlo.
BOOL CSampleDialog : : OnInitDialog ( )
{

//Create an 8-point Arial font
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") );
//Set font for push button .
m_wndButton . SetFont (&m _font );

}
36. 如何在OLE控件中使用OLE_COLOR数据类型
回复
weakwater 2004-04-05
up&mark
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……