您的位置:首页 > 编程语言 > C语言/C++

vc++常用技巧总结四

2011-09-22 18:59 441 查看
(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 ("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的串表的入口来实现。

(63) 如何确定顶层菜单所占据的菜单行数

这可以通过简单的减法和除法来实现。首先,用户需要计算主框窗口的高度和客户区;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度。下例成员函数是一个计算主框菜单所占据的行数的代码实现。

int CMainFrame:: GetMenuRows ()

{

CRect rcFrame,rcClient

GetWindowRect (rcFrame)

GetClientRect (rcClient)

return (rcFrame.Height () -rcClient.Height () - :: GetSystemMetrics(SM_CYCAPTION) - (:: getSystemMetrics(SM_CYFRAME) *2)) / :: GetSystemMetrics(SM_CYMENU)

}

(64) 在用户环境中如何确定系统显示元素的颜色

调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何在MFC函数CMainFrameWnd:: OnNcPaint中调用该函数设置窗口标题颜色。

void CMiniFrameWnd:: OnNcPaint ()

{



dc.SetTextColor (:: GetSysColor (m_bActive ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT))



(65) 如何查询和设置系统参数

在Windows 3.1 SDK中介绍过SDK函数SystemParametersInfo,调用该函数可以查询和设置系统参数,诸如按键的重复速率设置、鼠标双击延迟时间、图标字体以及桌面覆盖位图等等。

//Create a font that is used for icon titles.

LOGFONT stFont

∶: SystemParametersInfo (SPIF_GETICONTITLELOGFONT, sizeof (LOGFONT), &stFont, SPIF_SENDWININICHANGE)

m_font.CreateFontIndirect (&stFont)

//Change the wallpaper to leaves.bmp.

∶ : SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, _T (" forest.bmp"), SPIF_UPDATEINIFILE)

(66) 如何确定当前屏幕分辨率

调用SDK函数GetSystemMetrics,该函数可以检索有关windows显示信息,诸如标题大小、边界大小以及滚动条大小等等。

//Initialize CSize object with screen size.

CSize sizeScreen (GetSystemMetrics (SM_CXSCREEN),

GetSystemMetrics (SM_CYSCREEN))

(67) 如何使用一个预定义的Windows光标

调用CWinApp:: LoadStandardCursor并传送光标标识符。

BOOL CSampleDialog:: OnSetCursor (CWnd* pWnd,

UINT nHitTest, UINT

message)

{

//Display wait cursor if busy.

if (m_bBusy)

{

SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT))

return TRUE

}

return CDialog:: OnSetCursor (pWnd. nHitTest,message)

}

(68) 如何检索原先的Task Manager应用程序使用的任务列表

原先的Task Manager应用程序显示顶层窗口的列表。为了显示该列表,窗口必须可见、包含一个标题以及不能被其他窗口拥有。调用CWnd:: GetWindow可以检索顶层窗口的列表,调用IsWindowVisible、GetWindowTextLength以及GetOwner可以确定窗口是否应该在列表中。下例将把TaskManager窗口的标题填充到列表中。

void GetTadkList (CListBox&list)

{

CString strCaption

//Caption of window.

list.ResetContent ()

//Clear list box.

//Get first Window in window list.

ASSERT_VALID (AfxGetMainWnd ())

CWnd* pWnd=AfxGetMainWnd () ->GetWindow (GW_HWNDFIRST)

//Walk window list.

while (pWnd)

{

// I window visible, has a caption, and does not have an owner?

if (pWnd ->IsWindowVisible()

&& pWnd ->GetWindowTextLength ()

&&! pWnd ->GetOwner ())

{

//Add caption o window to list box.

pWnd ->GetWindowText (strCaption)

list.AddString (strCaption)

}

//Get next window in window list.

pWnd=pWnd ->GetWindow(GW_HWNDNEXT)

}

}

(69) 如何确定Windows和Windows系统目录

有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory,下例说明了如何使用这两个函数:

TCHAR szDir [MAX_PATH]

//Get the full path of the windows directory.

∶ : GetWindowsDirectory (szDir, MAX_PATH)

TRACE ("Windows directory %s/n", szDir)

//Get the full path of the windows system directory.

∶ : GetSystemDirectory (szDir, MAX_PATH)

TRACE ("Windows system directory %s/n", szDir)

(70) 在哪儿创建临文件

调用SDK函数GetTemPath可以确定临时文件的目录,该函数首先为临时路径检测TMP环境变量:如果没有指定TMP,检测TMP环境变量,然后返回到当前目录。下例说明了如何创建一个临时文件。



//get unique temporary file.

CString strFile

GetUniqueTempName (strFile)

TRY

{

//Create file and write data.Note that file is closed

//in the destructor of the CFile object.

CFile file (strFile,CFile ::modeCreate | CFile:: modeWrite)

//write data

}

CATCH (CFileException, e)

{

//error opening file

}

END_CATCH



Void GetuniqueTempName (CString& strTempName)

{

//Get the temporary files directory.

TCHAR szTempPath [MAX_PATH]

DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath)

ASSERT (dwResult)

//Create a unique temporary file.

TCHAR szTempFile [MAX_PATH]

UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempfile)

ASSERT (nResult)

strTempName=szTempFile

}

(71) 我怎样才能建立一个等待光标?

调 用 BeginWaitCursor 函数来启动等待光标,调用EndWaitCursor函数来结束等待光标。要注意,二者都要调用 app 的成员函数,如下所示:

AfxGetApp()->BeginWaitCursor();

// 要做的事

AfxGetApp()->EndWaitCursor();

(72)我在MDI框架中有个form视窗。它有个取消按钮,我需要当用户按取消按钮时可关闭form视窗。我应该如何关闭该文档?

调用OnCloseDocument函数。

(73)如何访问桌面窗口

静态函数CWnd::GetDesktopWindow 返回桌面窗口的指针。下例说明了MFC函数CFrameWnd::BeginModalStae是如何使用该函数进入内部窗口列表的。

void CFrameWnd::BeginModalState ()

{



//first count all windows that need to be disabled

UINT nCount=0

HWND hWnd= :: GetWindow (:: GetDesktopWindow(), GW_CHILD)

while (hWnd!=NULL)

{

if (:: IsWindowEnabled (hwnd)

&& CWnd::FromHandlePermanent (hWnd)!=NULL

&& AfxIsDescendant (pParent->m_hWnd, hWnd)

&& :: SendMessage (hWnd, WM_DISABLEMODAL, 0, 0)==0)

{

++nCount

}

hWnd=:: GetWindow (hWnd, GW_HWNDNEXT)

}



(74) 什么是COLORREF? 我该怎样用它?

COLORREF 是 一个32-bit整型数值,它代表了一种颜色。你可以使用RGB函数来初始化COLORREF。例如:

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

RGB函数接收三个0-255数值,一个代表红色,一个代表绿色,一个代表蓝色。在上面的例子中,红色和蓝色值都为0,所以在该颜色中没有红色和蓝色。绿色为最大值255。所以该颜色为绿色。0,0,0为黑色,255,255,255为白色。

另一种初始化COLORREF的方法如下所示:

CColorDialog colorDialog;

COLORREF color;

if( colorDialog.DoModal() == IDOK )

{

color = colorDialog.GetColor();

}

这 段代码使用了MFC中的颜色对话框,它需要文件。

(75) AppWizard所产生的STDAFX文件是干什么用的?

它主要是协助产生预编译头文件的。通常你是不需要修改它的。

(76) 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。为什么会这么糟?

CDWordArray 是很好用的,只是因为你没有指定数组的最大尺寸。因此,当你添加新元素时,该类会从堆中重新分配空间。不幸的是,该类会在每次插入新元素时都为数组重新分配空间。如果你向它添加了很多新元素,所有这些分配和复制数组的操作会就会使它变慢。解决该问题的方法是,你可以使用SetSize函数的第二个参数来改变这种重新分配的频率。例如,如果你把该参数设置为500,则每次数组空间超出时它才重新分配并添加500个新空间,而不是1个。这样一来,你就可以不用重新分配而添加了另外499个元素空间,这也会大大提高程序的运行速度。

(77) 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开?

在 视 中 的 OnInitialUpdate 函 数 中 调 用 GetParentFrame 函 数。GetParentFrame会返回一指向一保存有该视的框架窗口的指针。然后调用在框架窗口上调用MoveWindow。

(78)在我的程序的某些部分,我可以调用MessageBox 函数来建立一个信息对话框,例如在视类中。但是,在其它部分我却不能,如文档类中。为什么?我怎样才能在我的应用程序类中建立一个信息对话框?

MessageBox函数来自CWnd类,所以你只能在从CWnd继承的类(如CView)中调用它。但是,MFC也提供了AfxMessageBox函数,你可以在任何地方调用它。

(79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿?

把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:

CMyApp *app = (CMyApp *)AfxGetApp();

app->MyGlobalVariable = ...

转载于:http://blog.csdn.net/lchen_fhhls/article/details/3935804
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: