《MFC Windows程序设计》读书笔记(3)

2020-04-14 01:06

《MFC Windows程序设计》读书笔记 重剑无锋 原创

CWaitCursor的构造函数显示沙漏型光标,析构函数还原原来的光标 手动还原光标:wait.Restore();

3.1.11 鼠标杂录

::GetSystemMetrics(SM_MOUSEPRESENT); BOOL ::GetCursorPos(LPPOINT lpPoint); BOOL ::SetCursorPos(int X,int Y);

// 系统是否连接了鼠标 // 获取光标位置

// 设置光标位置

第4章. 菜单

4.1 菜单基础

CMenu类的m_hMenu是HMENU句柄

4.1.1 创建菜单

回忆一下,在RC文件中,菜单的定义语句有哪些 特别注意:

默认ID:IDR_MAINFRAME & \\t

SEPARATOR GRAYED CHECKED !

菜单ID的有效范围:0x8000~0xdfff

4.1.2 加载并显示菜单

1. 将菜单挂接到窗口上,用CFrameWnd::Create

CFrameWnd::Create ( LPCTSTR lpszClassName,

LPCTSTR lpszWindowName,

// 类名 // 窗口标题栏 // 窗口样式 // 窗口位置 // 父窗口 // 菜单资源 // 扩展样式 // 结构指针

第11页 共 55页

DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, DWORD dwExStyle = 0,

LPCTSTR lpszMenuName = NULL, CCreateContext* pContext = NULL

《MFC Windows程序设计》读书笔记 重剑无锋 原创

); 方法为:

CFrameWnd::Create( NULL , 标题栏名称,WS_OVERLAPPEDWINDOW,rectDefault,NULL,

MAKEINTRESOURCE( IDR_MAINFRAME)) ;

2. 将菜单挂接到窗口上,用CFrame::LoadFrame

virtual BOOL CFrame::LoadFrame (UINT nIDResource,

DWORD dwDefaultStyle =WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE, CWnd *pParentWnd=NULL,

CCreateContext* pContext=NULL );

3. 将菜单挂接到窗口上,用菜单对象

CMenu menu;

menu.LoadMenu(菜单ID); SetMenu(&menu); menu.Detach(); 早地被删除。

// 将菜单从CMenu对象上卸下,防止它在menu超出范围时过

4. 在多个菜单之间切换

SetMenu(菜单对象的指针); DrawMenuBar();

// 重画菜单栏。除非窗口不在屏幕上,否则一定要调用

5. 菜单对象的删除

如果菜单对象是窗口的数据成员,就不需要显式调用DestroyMenu(),而是自动析构。

4.1.3 响应菜单命令

WM_INITMENT

// 选中一个最高级菜单项 // 显式子菜单之前 // 加亮条上下移动时

// 选中命令,wParam的低位是命令ID // 选中关闭,结束应用程序,发送WM_QUIT // 结束应用程序的执行

WM_INITMENUPOPUP WM_MENUSELECT WM_COMMAND WM_CLOSE WM_QUIT

4.1.4 命令范围

三种情况:

1、一个命令,一个映射宏,一个消息处理函数

第12页 共 55页

《MFC Windows程序设计》读书笔记 重剑无锋 原创

2、一个命令,一个映射宏,大家公用一个消息处理函数 3、多个命令,一个映射宏,大家公用一个消息处理函数 ON_COMMAND_RANGE( 起始ID,终止ID,处理函数) ??

void CmainWindow::OnColor( UINT nID ) {

m_nCurrentColor = nID – ID_COLOR_RED ; };

4、记住如何取wParam的低位 在消息处理函数内部:

UINT nID = (UINT) LOWORD( GetCurrentMessage()->wParam );

4.1.5 更新菜单中的菜单项

1. 在命令响应函数中

pMenu->CheckMenuItem( 菜单ID , MF_UNCHECKED ); // 或MF_CHECKED

2. 响应WM_INITMENUPOPUP消息

ON_WM_INITMENUPOPUP()

...

void CMainWindow::OnInitMenuPopup( CMenu* pPopupMenu ,

UINT nIndex , BOOL bSysMenu )

{

if ( !bSysMenu && ( nIndex == COLOR_MENU_INDEX ))

pPopupMenu->CheckMenuItem( ID_COLOR_RED , MF_UNCHECKED );

}

3. 响应WM_INITMENUPOPUPON_UPDATE_COMMAND_UI宏

消息,使用

ON_COMMAND_RANGE( ID_COLOR_RED , ID_COLOR_BLUE , OnColor ) ON_UPDATE_COMMAND_UI( ID_COLOR_RED , OnUpdateRed )

...

void CMainWindows::OnColor( UINT nID ) {

m_nCurrentColor = nID – ID_COLOR_RED ; }

void CMainWindow::OnUpdateRed( CCmdUI* pCmdUI ) {

pCmdUI->SetCheck( m_nCurrentColor == 0 ) ;

第13页 共 55页

《MFC Windows程序设计》读书笔记 重剑无锋 原创

}

4. 跟SetCheck对等的函数

CCmdUI::Enable() CCmdUI::SetRadio() CCmdUI::SetText()

4.1.6 更新范围

ON_UPDATE_COMMAND_UI_RANGE( 起始ID,终止ID,处理函数) void CMainWindow::处理函数( CCmdUI* pCmdUI )

4.1.7 键盘加速键

加速键也引发WM_COMMAND消息

1. 加速键表资源

在RC文件中

IDR_MAINFRAME ACCELERATORS BEGIN

“C” , ID_EDIT_COPY , VIRTKEY , CONTROL

VK_INSERT , ID_EDIT_COPY , VIRTKEY , CONTROL END

其中的菜单ID位置处,甚至可以不是菜单ID,即让加速键脱离菜单使用

2. 加载加速键

1、LoadAccelTable ( MAKEINTRESOURCE( IDR_MAINFRAME )) ;

2、LoadFrame ( IDR_MAINFRAME , WS_OVERLAPPEDWINDOW , NULL , NULL ); 菜单资源、加速键资源可以公用一个ID , 则这条语句一次就能将二者调进来了。

3. 从CWnd派生的类使用加速键

这种情况与从CFrameWnd派生的类使用加速键的方法不一样。 1、给派生类添加一个m_hAccelTable的数据成员;

2、在应用程序生存期的初期,调用API函数::LoadAccelerators加载加速键表,将该函数返回的句柄复制给m_hAccelTable;

3、在窗口类中重载PreTranslateMessage(),并调用将句柄存储在m_hAccelTable中的::TranslateAccelerator,将::TranslateAccelerator的返回值作为PreTranslateMessage()的返回值,如果::TranslateAccelerator已经将消息发出,则不需要再转换和发送消息了。

具体使用时,可以参见P167的代码

第14页 共 55页

《MFC Windows程序设计》读书笔记 重剑无锋 原创

第5章. MFC集合类

5.1 数组

背下以下代码:

int* m_pData ;

m_pData = new int[nSize] ; ...

delete[] m_pData ; m_pData = NULL ;

5.1.1 MFC数组类

一般的:CArray类 非模版化的数组类: CByteArray CUIntArray 重要函数: SetSize

GetSize SetAt

RemoveAt

// 或CPtrArray array

GetUpperBound []运算符

GetAt

InsertAt RemoveAll 例:

CObArray array;

int nSize = array.GetSize();

for (int i = 0 ; i < nSize ; i++ ) delete array[i]; array.RemoveAll();

CWordArray CStringArray

CDWordArray CPtrArray

CObArray

5.1.2 动态调整数组大小

? MFC增大数组的过程: 1、分配新的内存缓冲区 2、将元素从旧的缓冲区复制过来 ? 默认增量

如果指定数组尺寸时为0,并且没有调用SetSize,则默认的增加量是4项 ? 函数举例 SetSize( 10 ) ; SetAtGrow();

// 10个元素

// 10个元素,但有一万个元素空间 // 必要时,自动增加内存空间

SetSize( 10 , 10000 ) ;

第15页 共 55页


《MFC Windows程序设计》读书笔记(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:3-4岁敏感期

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

马上注册会员

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