Visual C++编程技巧集二-未转载完全

71 篇文章 0 订阅

原文:点击打开链接

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

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 函数控制系统是重新引导,还是重启 windows.前面已经有人讲过乐,就不再提了。

5.怎样加栽其他的应用程序?

我记得这好象是出场频度很高的问题。

三个SDK函数winexec, shellexecute,createprocess可以使用。

WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用SW_SHOWMAXMIZED方式去加栽一个无最大化按钮的 程序,呵呵就是Neterm,calc等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。ShellExecute较 WinExex灵活一点,可以指定工作目录,下面的Example就是直接打开 c:\temp\1.txt,而不用加栽与txt文件关联的应用程序,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,偶猜就是这么作的啦.

ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\\temp"),SW_SHOWMAXMIZED);

CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example:

STARTUPINFO stinfo; //启动窗口的信息

PROCESSINFO procinfo; //进程的信息

CreateProcess(NULL,_T("notepad.exe"),NULL,NULL.FALSE, NORMAL_PRIORITY_

CLASS,NULL,NULL, &stinfo,&procinfo);

6.确定应用程序的路径

前些天好象有人问过这个问题.

Use GetModuleFileName获得应用程序的路径,然后去掉可执行文件名。

Example:

TCHAR exeFullPath[MAX_PATH]; // MAX_PATHAPI中定义了吧,好象是128

GetModuleFileName(NULL,exeFullPath,MAX_PATH)

7.获得各种目录信息

Windows目录: Use "GetWindowsDirectory

Windows下的system目录: Use "GetSystemDirectory"

temp目录: Use "GetTempPath "

当前目录: Use "GetCurrentDirectory"

请注意前两个函数的第一个参数为 目录变量名,后一个为缓冲区;后两个相反.

8.如何自定义消息

也有人问过的,其实不难。

(1)手工定义消息,可以这么写 #define WM_MY_MESSAGE(WM_USER+100),

MS推荐的至少是WM_USER+100;

(2)写消息处理函数,WPARAM,LPARAM返回LRESULT.

LRESULT CMain::OnMyMessage(WPARAM wparam,LPARAM lParam)

{

//加入你的处理函数

}

(3)在类的AFX_MSG处进行声明,也就是常说的"宏映射"

9.如何改变窗口的图标?

向窗口发送WM_SECTION消息。

Example:

HICON hIcon="AfxGetApp"() ->LoadIcon(IDI_ICON);

ASSERT(hIcon);

AfxGetMainWnd() ->SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon);

10.如何改变窗口的缺省风格?

重栽CWnd:: PreCreateWindow并修改CREATESTRUCT结构来指定窗口风格和其他

创建信息.

Example: Delete "Max" Button and Set Original Window's Position and Size

BOOL CMain:: PreCreateWindow (CREATESTRUCT &cs)

{

cs.style &=~WS_MAXINIZEMOX;

cs.x=cs.y=0;

cs.cx=GetSystemMetrics(SM_CXSCREEN/2);

cs.cy=GetSystemMetrics(SM_CYSCREEN/2);

return CMDIwnd ::PreCreateWindow(cs);

}

11.如何将窗口居中显示?

Easy, Call CWnd:: Center Windows

Example(1): Center Window( ); //Relative to it's parent

// Relative to Screen

Example(2): Center Window(CWnd:: GetDesktopWindow( ));

//Relative to Application's MainWindow

AfxGetMainWnd( ) -> Center Window( );

12.如何让窗口和MDI窗口一启动就最大化和最小化?

先说窗口。

InitStance函数中设定m_nCmdShow的 取值.

m_nCmdShow=SW_SHOWMAXMIZED ; //最大化

m_nCmdShow=SW_SHOWMINMIZED ; //最小化

m_nCmdShow=SW_SHOWNORMAL ; //正常方式

MDI窗口:

如果是创建新的应用程序,可以用 MFC AppWizardAdvanced 按钮并在

MDI子窗口风格组中检测最大化或最小化;还可以重载MDI Window

PreCreateWindow函数,设置WS_MAXMIZE or WS_MINMIZE;

如果从CMDIChildWnd派生,调用OnInitialUpdate函数中的 CWnd::Show

Window来指定MDI Child Window的 风格。

13.如何使程序保持极小状态?

很有意思的 问题

这么办:在恢复程序窗体大小时, Windows会发送WM_QUERY-OPEN消息,

ClassWizard设置成员函数OnQueryOpen() ,add following code:

Bool CMain:: OnQueryOpen( )

{

Return false;

}

14.如何限制窗口的大小?

也就是FixedDialog形式。Windows发送WM_GETMAXMININFO消息来跟踪,

响应它,OnGetMAXMININFO中写代码:

15.如何使窗口不可见?

很简单,SW_HIDE隐藏窗口,可以结合FindWindow,ShowWindow控制.

16.如何使窗口始终在最前方?

两种途径.

BringWindowToTop(Handle);

SetWindowPos函数,指定窗口的 最顶风格,WS_EX_TOPMOST扩展窗口的 风格

Example:

void ToggleTopMost( CWnd *pWnd)

{

ASSERT_VALID(pWnd);

pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)?

&wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE);

}


17、如何创建一个字回绕的CEditView

重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLLWS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style

BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs)

{

//First call basse class .

BOOL bResutl =CEditView : : PreCreateWindow (cs) ;

// Now specify the new window style .

cs.style &= ~ (ES_AUTOHSCROLLWS_HSCROLL);

return bResult ;

}

18、通用控件的显示窗口

MFC提供了几个CView派生的视窗类, 封装了通用控件的功能,但仍然使用工

作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表

控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。

19、移动窗口

调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口

有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口

的大小。

//Move window to positoin 100 , 100 of its parent window .

SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZESWP_NOAORDER);

20、重置窗口的大小

调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用

CWnd : : MoveWindow但必须指定窗口的位置。

// Get the size of the window .

Crect reWindow ;

GetWindowRect (reWindow );

//Make the window twice as wide and twice as tall .

SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2,

reWindow . Height () * 2,

SWP_NOMOVESWP_NOZORDER );

21、如何单击除了窗口标题栏以外的区域使窗口移动

当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理

该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可

以使用ClassWizard处理该信息并调用基类函数, 如果函数返回HTCLIENT则表明

鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。

UINT CSampleDialog : : OnNcHitTest (Cpoint point )

{

UINT nHitTest =Cdialog: : OnNcHitTest (point );

return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ;

}

上述技术有两点不利之处, 其一是在窗口的客户区域双击时, 窗口将极大;

其二, 它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键

使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN

信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION

void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point )

{

CView : : OnLButtonDow (nFlags , pont );

//Fool window into thinking somene clicked on

its caption bar .

GetParent ( )> PostMessage (

WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x , point .y) );

}

该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParent

void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )

{

Cdialog : : OnLButtonDow (nFlags, goint );

//Fool dialog into thinking simeone clicked on its caption bar .

PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , point. y ) )

}

22、如何改变视窗的背景颜色

Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用

ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE

防止Windows擦除窗口。

//Paint area that needs to be erased.

BOOL CSampleView : : OnEraseBkgnd (CDC* pDC)

{

// Create a pruple brush.

CBrush Brush (RGB (128 , 0 , 128) );

// Select the brush into the device context .

CBrush* pOldBrush = pDC>SelcetObject (&brush);

// Get the area that needs to be erased .

CRect reClip ;

pDC>GetCilpBox (&rcClip);

//Paint the area.

pDC> PatBlt (rcClip.left , rcClip.top ,

rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY );

//Unselect brush out of device context .

pDC>SelectObject (pOldBrush );

// Return nonzero to half fruther processing .

return TRUE;

}

23、如何改变窗口标题

调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。

//Set title for application's main window .

AfxGetMainWnd ( )> SetWindowText (_T("Application title") );

//Set title for View's MDI child window .

GetParent ( )> SetWindowText ("_T ("MDI Child new title") );

//Set title for dialog's push button control.

GetDigitem (IDC_BUTTON)> SetWindowText (_T ("Button new title ") );

如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化

的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在

联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。

AfxSetWindowText的实现如下:

voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew )

{

itn nNewLen= Istrlen (Ipaznew);

TCHAR szOld [256];

//fast check to see if text really changes (reduces flash in the controls )

if (nNewLen >_contof (szOld)||

: : GetWindowText (hWndCrtl , szOld , _countof (szOld) !=nNewLen||

Istrcmp (szOld , IpszNew )! = 0

{

//change it

: : SetWindowText (hWndCtrl , IpszNew );

}

}

24、如何防止主框窗口在其说明中显示活动的文档名

创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位, 如果不希望在

说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置

CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。

BOOL CMain : : PreCreateWindow (CREATESTRUCT&cs)

{

//Turn off FWS_ADDTOTITLE in main .

cs.styel & = ~FWS_ADDTOTITLE ; 

return CMDIWnd : : PreCreateWindow (cs );

}

关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调

CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。

25、如何获取有关窗口正在处理的当前消息的信息

调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用

ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage

来确定所选中的菜单项。

viod CMain : : OnCommmonMenuHandler ( )

{

//Display selected menu item in debug window .

TRACE ("Menu item %u was selected . \n" ,

GetCruuentMessage ( )> wParam );

}

26、如何创建一个不规则形状的窗口

可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一

个指定的区域,实际上使窗口成为指定的不规则形状。

使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删

除所在的缺省控件、标题以及边界。

给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。

Class CRoundDlg : public CDialog

{

private :

Crgn m_rgn : // window region

} ;

修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给

窗口:

BOOL CRoundDlg : : OnInitDialog ( )

{

CDialog : : OnInitDialog ( ) ;

//Get size of dialog .

CRect rcDialog ;

GetClientRect (rcDialog );

// Create region and assign to window .

m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) , rcDialog .Height ( ) );

SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );

return TRUE ;

}

通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例

子程序是修改OnPaint函数使窗口形状看起来象一个球形体。

voik CRoundDlg : : OnPaint ( )

{

CPaintDC de (this) ; // device context for painting .

//draw ellipse with out any border

dc. SelecStockObject (NULL_PEN);

//get the RGB colour components of the sphere color

COLORREF color= RGB( 0 , 0 , 255);

BYTE byRed =GetRValue (color);

BYTE byGreen = GetGValue (color);

BYTE byBlue = GetBValue (color);

// get the size of the view window

Crect rect ;

GetClientRect (rect);

// get minimun number of units

int nUnits =min (rect.right , rect.bottom );

//calculate he horiaontal and vertical step size

float fltStepHorz = (float) rect.right /nUnits ;

float fltStepVert = (float) rect.bottom /nUnits ;

int nEllipse = nUnits/3; // calculate how many to draw

int nIndex ; // current ellipse that is being draw

CBrush brush ; // bursh used for ellipse fill color

CBrush *pBrushOld; // previous brush that was selected into dc

//draw ellipse , gradually moving towards upper-right corner

for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)

{

//creat solid brush

brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).

( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) );

//select brush into dc

pBrushOld= dc .SelectObject (&brhsh);

//draw ellipse

dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,

rect. right -( (int) fltStepHorz * nIndex )+ 1,

rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;

//delete the brush

brush.DelecteObject ( );

}

}

最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。

UINT CRoundDlg : : OnNchitTest (Cpoint point )

{

//Let user move window by clickign anywhere on the window .

UINT nHitTest = CDialog : : OnNcHitTest (point) ;

rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;

}

27、如何在代码中获取工具条和状态条的指针

缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条

有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说

明了如何通过一起调用CWnd: : GetDescendantWindowAfxGetMainWnd来获取这些

子窗口的指针:

//Get pointer to status bar .

CStatusBar * pStatusBar =

(CStatusBar *) AfxGetMainWnd ( )> GetDescendantWindow

(AFX_IDW_STUTUS_BAR);

//Get pointer to toolbar .

CToolBar * pToolBar =

(CToolBar * ) AfxGetMainWnd ( )> GetDescendantWindow (AFX_IDW_TOOLBAR);

28、如何使能和禁止工具条的工具提示

如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止

工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle

CControlBar : : SetBarStyle建立一个完成此功能的成员函数:

void CMain : : EnableToolTips ( BOOL bDisplayTips )

{

ASSERT_VALID (m_wndToolBar);

DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) ;

if (bDisplayTips)

dwStyle=CBRS_TOOLTIPS ;

else

dwStyle & = ~ CBRS_TOOLTIPS ;

m_wndToolBar.SetBarStyle (dwStyle );

}

29、如何设置工具条标题

工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设置标题,例子如下:

int CMain : : OnCreate (LPCREATESTRUCT lpCreateStruct )

{

// Set the caption of the toolbar .

m_wndToolBar.SetWindowText (_T "Standdard");

30、如何创建和使用无模式对话框

MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几

个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用

ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:

模式对话通过调用CDialog : : EndDialog来中止,无模式对话则是调用

CWnd: : DestroyWindow来中止的,函数CDialog : : OnOKCDialog : : OnCancel

调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。

void CSampleDialog : : OnOK ( )

{

// Retrieve and validate dialog data .

if (! UpdateData (TRUE) )

{

// the UpdateData rountine will set focus to correct item

TRACEO (" UpdateData failed during dialog termination .\n") ;

return ;

}

//Call DestroyWindow instead of EndDialog .

DestroyWindow ( ) ;

}

void CSampleDialog : : OnCancel ( )

{

//Call DestroyWindow instead of EndDialog .

DestroyWindow ( ) ;

}

其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd : : PostNcDestroy,可以重置该函数并执行清除操作,诸如删除this指针。

void CSampleDialog : : PostNcDestroy ( )

{

// Declete the C++ object that represents this dialog .

delete this ;

}

最后,要创建无模式对话。可以调用CDialog : : DoModal创建一个模式对放, 要创建一个无模式对话则要调用CDialog: : Create。下面的例子说明了应用程序是如何创建无模式对话的:

void CMain : : 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选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。

首先,给对话基类增加一人成员变量CBursh :

class CMyFormView : public CFormView

{

private :

CBrush m_ brush ; // background brush

} ;

其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。

CMyFormView : : CMyFormView ( )

{

// Initialize background brush .

m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )

}

最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor参量。

HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )

{

// Determine if drawing a dialog box . If we are , return +handle to

//our own background brush . Otherwise let windows handle it .

if (nCtlColor = = CTLCOLOR _ DLG )

return (HBRUSH) m_brush .GetSafeHandle ( ) ;

return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );

}

33、如何获取一个对话控件的指针

有两种方法。其一,调用CWnd: : GetDlgItem,获取一个CWnd*指针调用成员函数。下例调用GetDlgItem,将返回值传给一个CSpinButtonCtrl*以便调用CSpinButtonCtrl : : SetPos函数:

BOOL CSampleDialog : : OnInitDialog ( )

{

CDialog : : OnInitDialog ( ) ;

//Get pointer to spin button .

CSpinButtonCtrl * pSpin - ( CSpinButtonCtrl *) GetDlgItem (IDC_SPIN) ;

ASSERT _ VALID (pSpin) ;

//Set spin button's default position .

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指针,要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为8Arial字体:

//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_PITCHFF_SWISS, _T ("Arial") );

//Set font for push button .

m_wndButton . SetFont (&m _font );

}

36、如何在OLE控件中使用OLE_COLOR数据类型

诸如COleControl : : GetFortColorCOleControl : : 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: : DlgDirListComboBoxWindows 将自动地向列表框或组合框填充可用的驱动器名或者指定目录中的文件,下例将Windows目录中的文件填充在组合框中:

BOOL CSampleDig : : OnInitDialog ( )

{

CDialog : : OnInitDialog ( )

TCHAR szPath [MAX_PATH] = {"c:\\windows"} ;

int nReslt = DlgDirListComboBox (szPath , IDC_COMBO , IDC_CURIDIR,

DDL_READWRITEDDL_READONLYDDL_HIDDEN

DDL_SYSTEMDDL_ARCHIVE ) ;

return TRUE ;

}

38、为什么旋转按钮控件看起来倒转

需要调用CSpinCtrl : : SetRange设置旋转按钮控件的范围,旋转按钮控件的缺省上限为0,缺省下限为100,这意味着增加时旋转按控件的值由100变为0。下例将旋转按钮控件的范围设置为0100

BOOL CAboutDlg : : OnInitDialog ( )

{

CDialog : : OnInitDialog ( )

//set the lower and upper limit of the spin button

m_wndSpin . SetRange ( 0 ,100 ) ;

return TRUE ;

}

Visual C++ 4.0 Print对话中的Copise旋转按钮控件也有同样的问题:按下Up按钮时拷贝的数目减少,而按下Down按钮时拷贝的数目增加。

39为什么旋转按钮控件不能自动地更新它下面的编辑控件

如果使用旋转按钮的autu buddy特性, 则必须保证在对话的标记顺序中buddy窗口优先于旋转按钮控件。从Layout菜单中选择Tab Order菜单项(或者按下Crtl+D)可以设置对话的标签顺序。

40、如何用位图显示下压按钮

Windows 95按钮有几处新的创建风格,尤其是BS_BITMAPBS_ICON,要想具有位图按钮,创建按钮和调用CButton : : SetBitmapCButton : : SetIcon时要指定BS_BITMAPBS_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 ;

}

41、如何一个创建三态下压按钮

可以使用新的BS_PUSHBUTTON风格位和检测框以及按钮来创建一个三态下压按钮。这很容易,只需将检测框和按钮拖拉到对话中并指定属性Pushlike即可。不用任何附加程序就可以成为三态下压按钮。

42、如何动态创建控件

分配一个控件对象的实例并调用其Create成员函数。开发者最容易忽略两件事:忘记指定WS_VISBLE标签和在栈中分配控件对象。下例动态地创建一个下压按钮控件:

//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_CHILDWS_VISIBLEBS_PUSHBUTTON.

Crect ( 0, 0, 100 , 24) , this , IDC _MYBUTTON )

43、如何限制编辑框中的准许字符

如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建标志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获取原来的wParamlParam的值 ,这样是不行的。要修改一个字符,需要首先修改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 )) ;

}

44、如何改变控件的颜色

有两种方法。其一,可以在父类中指定控件的颜色,或者利用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 ()

}

现在,控件可以自己决定如何绘画,与父窗口无关。

45、当向列表框中添加多个项时如何防止闪烁

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

46、如何向编辑控件中添加文本

由于没有CEdit:: AppendText函数,用户只好自己做此项工作。调用CEdit:: SetSel移动到编辑控件末尾,然后调用CEdit:: ReplaceSel添加文本。下例是AppendText的一种实现方法:

void CMyEdit:: AppendText (LPCSTR pText)

{

int nLen="GetWindowTextLength" ();

SetFocus ();

SetSel (nLen, nLen);

ReplaceSel (pText);

}

47、如何访问预定义的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);

}

48、如何获取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);

}


前言 第1章 消息框和对话框 1.如何在窗口程序中创建消息框 2.如何使用资源字符串设置消息框内容 3.如何在消息框中动态显示资源字符串 4.如何设置消息提示框的标题文字 5.如何使消息提示框的标题右对齐 6.如何在消息提示框中绘制表格 7.如何在消息提示框中设置图标 8.如何在消息提示框中显示问号图标 9.如何在消息提示框中设置按钮 10.如何在消息提示框中显示“是”、“否”按钮 11.如何在消息提示框中显示“重试”、“取消”按钮 12.如何设置消息提示框的默认选择按钮 13.如何确定用户在消息框中选择的按钮 14.如何设置“文件”对话框的标题文字 15.如何设置“文件”对话框的过滤器 16.如何设置“文件”对话框的初始目录 17.如何设置“文件”对话框的初始文件名 18.如何使“文件”对话框自动添加扩展名 19.如何实现“文件”对话框的多重选择功能 20.如何在“文件”对话框中选择多个文件 21.如何从“文件”对话框中获取文件标题名 22.如何从“文件”对话框中获取文件扩展名 23.如何在“文件”对话框中预览位图文件 24.如何创建一个文件“保存”对话框 25.如何在程序启动时弹出“文件”对话框 26.如何从“文件夹”对话框中选择文件夹 27.如何在“文件夹”对话框中新建文件夹 28.如何使用“颜色”对话框设置颜色 29.如何在“颜色”对话框中显示帮助按钮 30.如何禁止显示“颜色”对话框的自定义颜色 31.如何禁止“颜色”对话框的自定义颜色按钮 32.如何使用“字体”对话框设置字体和颜色 33.如何使用“查找与替换”对话框 34.如何显示操作系统默认的“关于”对话框 第2章 常用控件和组件 35.如何设置按钮控件的标签文本 36.如何设置按钮控件的显示字体 37.如何动态禁用和启用按钮控件 38.如何动态隐藏和显示按钮控件 39.如何在按钮控件上动态加载图标 40.如何在按钮控件上动态加载位图 4 1.如f可制作图标和文本共存的按钮 42.如何制作不规则的多边形按钮 43.如何制作GIF动画效果的按钮 44.如何制作AVI视频效果的按钮 45.如何在程序中动态创建按钮控件 46.如何在视图窗口中创建按钮控件 47.如何获取鼠标指向的按钮控件标题 48.如何创建文本和颜色共存的ComboBox 49.如何创建自动完成列表项的ComboBox 50.如何使ComboBox控件自动适应列表项 5l.如何使ComboBox控件自动装入文件名列表 52.如何在编辑框中限制输入的字符类型 53.如何为编辑框添加自动完成匹配功能 54.如何设置编辑框的背景颜色和文本颜色 55.如何使编辑框的宽度自动适应窗体大小 56.如何获取在编辑框中选择的文本内容 57.如何获取在编辑框中显示文本行数 58.如何重置编辑框默认的右键菜单 59.如何显示载有RichEdit控件的对话框 60.如何在RichEdit中实现查找和定位字符 61.如何在RichEdit中混合显示图片和文本 62.如何使List列表控件支持整行选择 63.如何使用List列表控件填充表格数据 64.如何使用数据库记录填充List列表控件 65.如何创建单元格可编辑的List列表控件 66.如何在ListBox中查找指定的字符串 67.如何为超长的ListBox列表项添加提示 68.如何将ListBox转换成CheckListBox 69.如何在视图窗口中绘制ListBox控件 70.如何使用Progress控件显示完成进度 71.如何使用Scroll控件控制滚动范围值 72.如何使用Slider控件控制滑动刻度值 73.如何使用Tab标签页(选项卡)控件 74.如何使用Tree控件显示目录树形结构 75.如何为树控件的子节点添加复选功能 76.如何为控件添加浮动提示窗口功能 77.如何使用回车键切换窗体控件焦点 78.如何遍历应用程序窗体中的各个控件 79.如何使窗体中的控件跟随鼠标移动而移动 80.如何设置静态文本控件的背景和文本颜色 81.如何通过控件实现鼠标拖动文本效果 第3章 标题栏和菜单栏 82.如何获取程序窗口标题栏的高度 83.如何获取程序窗口标题栏的按钮尺寸 84.如何获取程序窗口标题栏的文字 85.如何获取程序窗口标题栏的文字颜色 86.如何设置程序窗口标题栏的文字颜色 87.如何在窗口标题栏中滚动显示文字 88.如何在对话框程序中设置标题栏文字 89.如何在单文档程序中设置标题栏文字 90.如何禁止在窗口标题栏上显示文档名 91.如何自定义单文档程序窗口的标题栏 92.如何取消单文档程序标题栏的右键菜单 93.如何隐藏或显示应用程序的标题栏 94.如何获取IE浏览器窗口的标题栏文字 95.如何修改IE浏览器的标题栏内容 96.如何禁止标题栏响应鼠标双击事件 97.如何在标题栏右键菜单中新增菜单项 98.如何禁止单文档程序的关闭按钮 99.如何禁止单文档程序的最大化按钮 100.如何禁止单文档程序的最小化按钮 101.如何获取顶层菜单所占的行数 102.如何获取单文档程序菜单栏的高度 103.如何获取菜单项的标题文本内容 104.如何以渐变色绘制选择的菜单项 105.如何在组菜单项的左侧绘制纵向标题 106.如何在菜单项中同时显示图标和文本 107.如何在单文档程序主菜单中删除菜单 108.如何在单文档程序主菜单中增加菜单 109.如何启用和禁用主菜单组中的子菜单 110.如何删除单文档程序的主菜单 111.如何根据数据库记录动态创建菜单 112.如何取消无消息响应菜单的状态限制 113.如何显示或隐藏菜单项的复选标记 114.如何创建单选按钮效果的菜单组 115.如何在“最近的文件”子菜单中显示记录 116.如何在视图窗口中创建弹出式跟踪菜单 117.如何在视图窗口中创建上下文快捷菜单 118.如何禁止运行默认系统菜单按钮命令 119.如何设置默认系统菜单的字体为粗体 120.如何为默认系统菜单文字添加下划线 121.如何增加对话框应用程序的系统菜单项 122.如何删除对话框程序的系统菜单项 l23.如何在对话框应用程序中加载菜单 124.如何为不同控件添加不同的右键菜单 125.如何在操作系统任务栏上添加托盘菜单 126.如何触发操作系统的“开始”菜单 127.如何隐藏IE浏览器的右键菜单组 第4章 工具栏和状态栏 128.如何获取工具栏中的图标资源 129.如何在工具栏上设置背景图像 130.如何在工具栏上加载动画窗口 131.如何在工具栏上加载组合框控件 132.如何在工具栏上加载孚体组合框 133.如何为工具栏添加动态真彩按钮 134.如何为工具栏按钮设置下拉箭头 135.如何为工具栏按钮添加下压效果 136.如何在工具栏上显示图标和文字 137.如何设置工具栏按钮的标题文字 138.如何设置工具栏按钮的提示信息 139.如何为对话框工具栏按钮添加提示 140.如何隐藏工具栏按钮的提示信息 141.如何在工具栏上增加删除按钮 142.如何动态隐藏或显示工具栏按钮 143.如何动态启用或禁用工具栏按钮 144.如何动态改变工具栏按钮的位置 145.如何对工具栏中的按钮进行分组 146.如何在对话框程序中加载工具栏 147.如何隐藏或显示应用程序的工具栏 148.如何在程序主窗口中停靠工具栏 149.如何使用对话栏实现工具栏效果 150.如何在IE浏览器工具栏上添加按钮 l51.如何使用代码设置工具栏图标 152.如何使用代码获取工具栏指针 153.如何使用代码获取状态栏指针 154.如何隐藏或显示应用程序的状态栏 155.如何在状态栏中增加新的窗格 156.如何更新状态栏窗格中的显示内容 157.如何同步状态栏与对话框窗体的改变 158.如何在状态栏窗格中显示当前时间 159.如何在状态栏窗格中显示鼠标位置 160.如何在状态栏窗格中滚动显示文本 161.如何在状态栏窗格中加载进度条 162.如何在状态栏窗格中加载图像 163.如何在状态栏窗格中播放视频动画 第5章 光标和图标的应用 164.如何获取系统默认的光标大小 165.如何装入操作系统预置的光标 166.如何设置当前程序显示的光标 167.如何创建沙漏效果的等待光标 168.如何使用十字光标定位画线坐标 169.如何使用动画文件设置程序光标 170.如何捕捉光标指向的热区范围 171.如何将光标限制在指定范围内 172.如何获取光标当前的活动范围 173.如何获取系统默认的图标大小 174.如何获取可执行文件中的图标 175.如何提取动态链接库中的图标 176.如何提取图标文件中的图标 177.如何以发送消息方式设置图标 178.如何使程序标题栏中的图标旋转 179.如何在操作系统托盘中设置图标 第6章 程序主窗口界面 180.如何创建一个向导式的对话框窗体 181.如何创建一个属性页的对话框窗体 182.如何创建列表视图类型的程序窗体 183.如何创建不规则的对话框窗体 184.如何创建圆角状的非矩形窗体 185.如何使用文字线条填充窗体轮廓 186.如何根据图片的形状创建程序窗体 187.如何在窗体中创建切分多视图窗口 188.如何在窗体中创建切分同视图窗口 189.如何判断程序窗体是否为切分窗体 190.如何设置单文档程序窗体的背景颜色 191.如何在对话框窗体中创建渐变色背景 192.如何随机更换对话框窗体的背景图像 193.如何设置HTML对话框窗体的背景图像 l94.如何获取默认的程序窗体边界宽度 195.如何获取窗体水平滚动条箭头宽度 196.如何获取窗体垂直滚动条箭头宽度 197.如何设置多文档程序的主窗口标题 198.如何设置多文档程序的子窗口标题 199.如何设置多文档程序的主窗口图标 200.如何设置多文档程序的子窗口图标 201.如何限制多文档程序子窗口的大小 202.如何禁止用户拖动标题栏移动窗体 203.如何闪烁应用程序窗体的标题栏 204.如何定制窗体的边框线和标题栏 205.如何拖动没有标题栏的程序窗体. 206.如何拖动非标题栏区域移动窗体 207.如何拖动对话框主窗体移动程序 208.如何动态隐藏或显示应用程序窗体 209.如何动态移动和改变程序窗体的位置 210.如何动态改变应用程序窗口的大小 211.如何限制改变应用程序窗口的大小 212.如何限制应用程序窗口的缩放范围 213.如何固定单文档程序窗体的大小 214.如何使用网页作为程序的主窗体 215.如何发送消息最大化显示程序窗口 216.如何发送消息最小化隐藏程序窗口 217.如何发送消息还原(恢复)程序窗口 218.如何使MDI程序子窗口最大化启动 219.如何使SDI程序窗口最大化启动 220.如何使SDI程序窗口最小化启动 221.如何以不同方式居中显示程序窗口 222.如何使单文档程序窗口最顶层显示 223.如何实现全屏显示应用程序窗口 224.如何使程序窗口以任意透明度显示 225.如何透明显示程序窗口的部分区域 226.如何将程序的窗口缩放到托盘显示 227.如何获取在任务栏显示的窗口程序 228.如何将其他窗口程序调至前台显示 229.如何以淡入的效果显示程序窗口 230.如何以淡出的效果隐藏程序窗口 231.如何以扩展的效果显示程序窗口 232.如何以动画收缩效果隐藏程序窗口 233.如何以扩展收缩效果展开程序窗口 234.如何以异步方式控制显示程序窗口 235.如何设置对话框程序窗口的启动位置 236.如何在上次关闭位置启动程序窗体 237.如何显示和关闭非模式对话框 238.如何在对话框程序中加入闪屏效果 239.如何在单文档程序中加入闪屏效果 240.如何使程序窗口自动适应图像尺寸 241.如何使用桌面区域填充程序窗口 242.如何在程序视图窗口中添加插入符 243.如何实现QQ抽屉导航效果的界面 244.如何使用树形视图导航程序界面 第7章 程序管理和控制 245.如何捕获按下的Home等功能键 246.如何捕获按下的Air或Shift+Alt组合键 247.如何捕获按下的Ctrl或Clrl+Alt组合键 248.如何捕获按下的Ctrl或Ctrl+Shift组合键 249.如何捕获用户按下键盘的任一按键 250.如何使用钩子技术监视键盘的按键操作 251.如何使用小键盘数字键模拟鼠标单击 252.如何禁止使用Esc键关闭对话框程序 253.如何禁止使用Air+F4组合键关闭程序 254.如何使用回车键切换编辑框的输入焦点 255.如何为应用程序自定义加速键 256.如何创建热键及其消息处理函数 257.如何判断是否同时按下了鼠标键和Ctrl键 258.如何判断鼠标按键是否单击了标题栏 259.如何跟踪显示鼠标移动的当前位置 260.如何在桌面上创建应用程序快捷方式 261.如何查询快捷方式所属的源程序名称 262.如何禁止在任务栏显示单文档程序标题 263.如何禁止多文档程序启动时创建新文档 264.如何直接以发送消息方式关闭程序 265.如何重定向菜单消息命令到对话框 266.如何添加命令响应范围消息处理函数 267.如何在应用程序中创建自定义消息 268.如何在应用程序中寄送自定义消息 269.如何使用定时器响应间隔发生的操作 270.如何使用互斥量禁止运行多个实例 271.如何使用映射文件禁止运行多个实例 272.如何在应用程序中执行其他应用程序 273.如何查找当前系统停止响应的程序 274.如何判断指定窗口程序是否已经运行 275.如何使单文档程序启动时显示对话框 276.如何在程序运行时禁止关闭计算机 277.如何在关闭单文档程序时给予提示 278.如何处理Windows程序的命令行参数 279.如何在应用程序中运行命令行命令 280.如何获取执行程序的版权声明信息 281.如何创建最简单的MFC应用程序 282.如何使:MFC程序架构支持一档多视 283.如何在MFC:程序中浏览PDF格式文件 第8章 打印机和打印实现 第9章 进程和线程管理 第10章 文件读写操作 第11章 文件和文件夹管理 第12章 字符串和数据转换 第13章 操作系统维护 第14章 计算机设备管理 第15章 文字和图像显示 第16章 音频和视频 第17章 网络通信 第18章 数据库管理 第19章 数据库访问 第20章 数据库查询 第21章 Word和Excel应用 第22章 WMI查询和管理 第23章 注册表综合应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值