《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页