VC视频教程笔记!(8-9课)

作者在 2009-03-09 09:33:42 发布以下内容

第8课    对话框
1.如何改变按纽的字体?在对话框的属性中改变字体的属性即可
2.逃跑按纽的实现
    1.从CButton派生一个类,CWeixinBtn
    2.将IDC_EDIT1关联成员变量m_btn1,类型为CWeixinBtn,注意要包含头文件。
    3.在CWeixinBtn中加一个指针成员变量CWeixinBtn *pWeixinBtn,然后将其地址初始化。
    4.在新类中增加鼠标移动的消息处理。
3.属性表单
    1.插入属性页资源。Insert->new Resource->Dialog
    2.当选择Classwizard菜单时,系统提示是否为创建新的类,我们将其从CPropertyPage派生!这样可以为

方便为其增加消息响应函数。
    3.插入新的从CPropertySheet派生的类,在类中增加3个CPropertyPage的实例。
    4.在view中增加菜单项,当点击时显示属性表单,出现中文乱码,修改CPropertyPage属性为中文,另外将

其字体设为宋体。
    5.在CPropertyPage中设置SetWizardButtons可将其属性改为上一步、完成!
    6.为IDC_RADIO1关联成员变量,需要先设置Group属性才行。另外别忘记调用UpdateData().
    7.为CPropertyPage增加虚函数,OnWizardNext,如果用户点击下一步时,不想让他进入下一步,刚返回-1


    8.将用户的选择输出到屏幕上,此时可以在View中增加几个成员变量,用来接收用户选择的数据。
4.memset()的用法! memset(m_bLike,0,sizeof(m_bLike));

第9课
1.修改外观和图标可以在MainFrm中进行,而修改背景和光标只能在View中进行。为什么?因为view的显示挡

在了MainFrame的前面。
    a.在MainFrame中
        PreCreateWindow()中,在窗口创建之前,用重新注册窗口类的方法,比较麻烦。在PreCreateWindow

()中修改
        也可以用简单的方法,用全局函数
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,
// LoadIcon(NULL,IDI_WARNING));
       在窗口创建之后,在OnCreate()中修改
//SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
//SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);
// SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
    b.在View中
      PreCreateWindow()中
//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
// LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),NULL);
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
      OnCreate()中
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_HELP));
2.创建一个不断变化的图标。用定时器和SetClassLong完成
    a.准备三个图标文件,放在RES文件夹,Insert->Resource-三个图标,
    b.在CMainFrame中增加图标句柄数组,m_hIcons[3]
m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE

(IDI_ICON1));//MAKEINTRESOURCE是一个宏,它将整数转化为Win32的资源类型,简单的说它是一个类型转换

#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
m_hIcons[1]=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//此处需要用到

theAPP对象,故要在文件中声明extern CStyleApp theApp;
m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));
然后将其初始化
    c.然后在定时器中实现
3.工具栏的编程
    a.加入分隔符的方法,向右拖动即可;
    b.删除按纽的方法,拖出即可。
4.创建一个新的工具栏的方法
    a.插入一个工具栏,画出其图形。
    b.在头文件中,定义CToolBar m_newToolBar
    c.在MainFrm.cpp的OnCreate()中调用
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_newToolBar.LoadToolBar(IDR_TOOLBAR1))
{
    TRACE0("Failed to create toolbar\n");
    return -1;        // fail to create
}   
    d.点击“新的工具栏”菜单时,隐藏工具栏。两种方法
    第一种/*if(m_newToolBar.IsWindowVisible())
{
    m_newToolBar.ShowWindow(SW_HIDE);
}
else
{
    m_newToolBar.ShowWindow(SW_SHOW);
}
RecalcLayout();
DockControlBar(&m_newToolBar);*/
    第二种ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);
    e.将菜单增加复选标记。在OnUpdateUI中加入代码
      pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
5.状态栏编程
    a.Indicator[]数组中有状态栏的信息
    如果要增加,可以在String Table中加入一个IDS_Timer,然后将其加入到[]中。
    b.在时间栏显示时间,代码略,比较简单
6.进度栏
    a.增加成员变量,CProgressCtrl m_progress
    b.OnCreate中 m_progress.Create(WS_CHILD | WS_VISIBLE,// | PBS_VERTICAL,
    rect,&m_wndStatusBar,123);
m_progress.SetPos(50);*/

    c.将其创建到状态栏的方法!如果在OnCreate()中创建,则不成立,因为获取矩形大小时失败。
      解决办法,用自定义消息:
      在MainFrm.h中#define UM_PROGRESS    WM_USER+1
afx_msg void OnProgress();
      在MainFrm.cpp中
ON_MESSAGE(UM_PROGRESS,OnProgress)
然后实现这个函数
void CMainFrame::OnProgress()
{
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
    rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
}
       最后在OnCreate中调用 PostMessage(UM_PROGRESS);//不能用SendMessage()
     d.解决重绘时进度栏改变的问题。在OnPain()中重写代码
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect);
m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
    rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
然后在定时器消息处理函数中加入
m_progress.StepIt();
     e.显示鼠标位置。在View中增加OnMouseMove()处理函数
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
//((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
//((CMainFrame*)GetParent())->SetMessageText(str);
//((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
7.加入启动画面
    Project-Component and ->Visual C++ Components->SplashScreen->插入

VC++ | 阅读 3505 次
文章评论,共0条
游客请输入验证码
浏览196726次