1、SetWindowLong:
1> 改变指定窗口的属性
2> 原型:LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);
3> eg:改变控件的窗口过程:
WNDPROC prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (LONG)NewProc); (258)
改变窗口属性:
SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE) & ~WS_MAXIMIZEBOX); (315)
2、GetWindowLong:
1> 获取指定(现有)窗口的信息
2> 原型:LONG GetWindowLong(HWND hWnd, int nIndex)
3、AfxGetInstanceHandle():获取当前应用程序的实力句柄(WinMain的参数hInstance)
4、更改SDI的初始菜单:在App类的InitInstance中,把IDR_MAINFRAME换成自定义的MenuID即可。
5、修改应用程序窗口的外观:
1> 在窗口创建之前修改:在CMainFrame::PreCreateWindow中修改cs
2> 在窗口创建之后修改:在CMainFrame::OnCreate中,利用SetWindowLong实现
6、修改窗口的光标、图标和背景:
1> 在窗口创建之前修改:
(1)在CMainFrame::PreCreateWindow中自定义一个WNDCLASS,注册后,cs.lpszClass设置为自定义窗口类
(2)在CMainFrame::PreCreateWindow中利用全局函数AfxRegisterWndClass来设定窗口的类型、光标、背景和图标
2> 在窗口创建之后修改:在CMainFrame::OnCreate中,利用全局API函数:SetClassLong实现(该函数用来重置指定窗口所属窗口类的WNDCLASSEX结构体)中指定数据成员的属性。)
7、修改窗口的图标:在框架类中修改窗口的光标、背景:在视类中
8、固定工具栏:(CMainFrame::OnCreate中设置)
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //使工具栏可以停靠
EnableDocking(CBRS_ALIGN_ANY); //使主框架可以被停靠
DockControlBar(&m_wndToolBar); //使工具栏停靠在主框架窗口上.
将这为三句注释后,工具栏前的把手会消失,工具栏就不能被拖动了。
9、GWL:GetWindowLong
GCL:GetClassLong
10、MFC编程中,一个ID可以表示多种资源。如MFC为我们自动创建的工具栏和主菜单的资源ID是一样的。
11、工具栏编程:
1> 相关类:CToolBar
2> 工具栏是把常用的菜单命令集合起来,以按钮的形式提供给用户使用
3> 创建自定义的工具栏:在frame类的OnCreate中创建、关联并设置停靠。利用OnCreate函数中的已后代码,copy、paste后修改一下即可。注:别忘了设置停靠
4> 隐藏和显示功能:
1)工具栏本身也是一个窗口,可以调用CWnd类的ShowWindow函数让其显示或隐藏:ShowWindow(SW_HIDE/SW_SHOW)
2)工具栏的IsWindowVisible函数判断工具栏的状态
3)当窗口上的工具栏被隐藏或显示后,停靠在窗口上的其他控制条对象的位置可能会有所变动,这时需要调用框架类的RecalcLayout成员函数来重新调整它们的位置。
4)一个函数搞定隐藏与显示功能:CFrameWnd::ShowControlBar
eg:ShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(), FALSE);
12、状态栏编程:
1> 相关类:CStatusBar
2> frame类的OnCreate函数中有系统创建状态栏的代码,其中用SetIndicators函数设置状态栏指示器,其实参indicators数组定义在frame的.cpp上部
3> 若想修改状态栏的外观,如添加或减少状态栏上的窗格,则只需在indicators数组中添加或减少响应的字符串资源ID即可
4> SetPaneText成员函数:将字符串显示到状态栏的窗格上。
eg:m_wndStatusBar.SetPaneText(1, str);
5> CommandToIndex成员函数:通过指定资源ID来得到相应的索引。
eg:int index=m_wndStatusBar.CommandToIndex(IDS_TIMER);
6> SetPaneInfo成员函数:可以为指定的窗格设置新的ID、样式和宽度。
7> 结合SetTimer在状态栏上显示动态时间
eg:m_wndStatusBar.SetPaneInfo(index, IDS_TIMER, SBPS_NORMAL, sz.cx);
8> GetItemRect成员函数:获得状态栏窗格的区域
原型:void GetItemRect(int nIndex, LPRECT lpRect) const;
13、进度栏编程:
1> 相关类:CProgressCtrl
2> StepIt成员函数:使进度栏动起来
3> SetStep成员函数:设定步长
4> SetRange成员函数:设定范围
5> 在状态栏上创建活动的进度条:
1)在frame类中定义:CProgressCtrl m_wndStatusBar;
2)在WM_PAINT消息的响应函数OnPaint中创建:
CRect rect;
m_wndStatusBar.GetItemRect(2, &rect);
if(!m_progress.m_hWnd)
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH, rect, &m_wndStatusBar, 123);
else
m_progress.MoveWindow(rect);
m_progress.SetPos(50);
3)在OnTimer中:m_progress.StepIt();//按指定时间(SetTimer)前进指定长度(成员SetStep)
14、CFrameWnd::RecalcLayout
virtual void RecalcLayout(BOOL bNotify = TRUE);
参数: bNotify 决定活动的项目是否接收布局改变通知。如果为TRUE,则此项被通知,否则不通知。
说明:
当标准控件条正在开/关或框架窗口重新设置大小时,由框架调用。此成员函数的缺省实现调用CWnd的成员函数RepositionBars来在框架和主客户窗口中重新定位各种控件条,主客户窗口通常是CView或MDICLIENT。
覆盖此函数,在框架窗口设计改变时控制外观形式和动作。例如在使控件条开或闭或加入另一个控件条时调用它。
它是用来将Toolbar、DialogBar等可浮动的东西安排位置、处理和View、Frame之间的位置关系的,例如你直接用 m_wndToolbar.Show
Window(WM_HIDE)隐藏了工具条,那就最好调用这个函数重新安排一下剩下的Bar和View之间的位置
15、获得系统当前时间,并格式化后生成一字符串:
CTime t=CTime::GetCurrentTime(); //static
CString str=t.Format("%H:%M:%S");
m_wndStatusBar.SetPaneText(1, str);
16、通过为菜单项添加UPDATE_COMMAND_UI消息的响应,可以非常方便地为该菜单项设置或取消复选标记。
17、获取当前应用程序的实力句柄:(WinMain函数的第一个实参/CWinApp类的数据成员m_hInstance,标识了应用程序当前的实例)
1> AfxGetInstanceHandle()
2> theApp.m_hInstance
3> AfxGetApp()->m_hInstance
18、MAKEINTRESOURCE宏:用于将资源ID转换为相应的资源标识字符串。
原型:LPTSTR MAKEINTRESOURCE( WORD wInteger);
19、自定义消息:
1> #define UM_PROGRESS WM_USER+1 //自定义消息,一般以UM_为前缀;在框架类.h中
2> afx_msg void OnProgress(WPARAM, LPARAM); //添加消息响应函数原型声明
3> ON_MESSAGE(UP_PROGRESS, OnProgress) //添加消息映射;自定义消息的消息映射使用映射宏ON_MESSAGE
4> LRESULT CMainFrame::OnProgress(WPARAM, LPARAM); //添加消息响应函数的实现;自定义消息响应函数的返回类型为LRESULT;
有时需要WPARAM和LPARAM形参
5> 发送消息:
SendMessage(UM_PROGRESS); //直接把消息发给消息相应函数,由消息响应函数处理完成之后,SendMessage函数才返回
PostMessage(UM_PROGRESS); //把消息放到消息队列中,然后立即返回,之后程序通过GetMessage函数按顺序把消息一条一条取出来
20、在状态栏上显示鼠标当前坐标:
在视类中捕获WM_MOUSEMOVE,并在其响应函数中:
CString str;
str.Format(_T("x=%d, y=%d"), point.x, point.y);
1> ((CMainFrame* )GetParent())->m_wndStatusBar.SetWindowTextW(str); //设置状态栏窗口文本
2> ((CMainFrame* )GetParent())->SetMessageText(str); //CFrameWnd的成员SetMessageText直接在状态栏的第一个窗格上放置文本
3> ((CMainFrame* )GetParent())->GetMessageBar()->SetWindowTextW(str); //CFrameWnd的成员GetMessageBar可以返回状态栏对象的指针
4> GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowTextW(str); //CWnd的成员GetDescendantWindow获得程序状态栏对象的指针
VC++深入详解·chapter09·笔记
最新推荐文章于 2018-12-23 10:38:59 发布