VC++深入详解·chapter09·笔记

来源:互联网 发布:java后端工程师简历 编辑:程序博客网 时间:2024/06/06 08:50

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获得程序状态栏对象的指针

原创粉丝点击