荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: cay (放我一马), 信区: Program
标  题: 『VC++技术内幕』学习笔记(10)  作者 雷神
发信站: 荔园晨风BBS站 (Tue Jan 22 23:51:12 2002), 转信

原作者姓名 雷神
文章原始出处 http://www.ai361.com
正文
『VC++技术内幕』学习笔记(10)
雷神
第十篇:模式对话框和通用控件(下)
大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇
提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞
了个计算器,前不久在学扩展CBUTTON类时也是用计算器程序,为什么?按钮多呗
,雷神最终做出了一个圆形按钮,液晶显示的计算器,感觉真的不错。学编程就是
要编写代码,代码写的多少和编程水平是成正比的。
由对话框编辑器和Class Wizard生成的对话框可以很轻松的不需编写很多的代码而
获得很多的功能,但如果我们想对对话框进一步的改进则需要手工编程了。
我们以上一篇的电脑体育彩票选号小程序为例进行一系列的改进工作。
改进一:截获退出控制权
当我们的光标不在选号按钮上时(例如在文本框内),当按下回车(Enter)键则
回退出程序的运行,还有当你按下ESC键时也会退出。为什么?因为当用户按下回
车键时Windows就会自动查找“输入焦点”在哪个按钮上,如果所有的按钮都没有
获得输入焦点,Windows会自动的寻找程序资源指定的默认按钮,如果对话框没有
默认按钮,系统会调用OnOK函数。ESC键也会触发对OnCancel函数的调用,从而导
致控制从对话框中退出。如果我们想截获退出控制权该如何做呢?用哑函数,就是
将按下Enter和ESC后的处理函数写成空函数。
步骤1、由于我们的对话框没有OK和CANCEL按钮,我们只能手工添加代码。在
guessDlg.h文件的类声名重载:virtual void OnOK()和virtual void
OnCancel();两个虚函数。
class CGuessDlg : public CDialog
{
    .......

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CGuessDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV
support
    virtual void OnOK();
    virtual void OnCancel();
    //}}AFX_VIRTUAL
    .......
};
步骤2、在guessDlg.cpp文件加入两个哑函数OnOK和OnCancel。
void CGuessDlg::OnOK ()
{
}
void CGuessDlg::OnCancel()
{
}
好了在编译运行,按ESC和在文本框内点一下鼠标,按下回车(Enter)键,上一篇
的问题不存在了,程序不会退出,彻底退不出了,只能通过任务管理器退了,这可
不行,我们还需要继续改进。
步骤3、添加一个按钮,叫退出。加入这个按钮的消息控制函数如下:
void CGuessDlg::OnButton2()
{
    CDialog::OnOK();
}
这回可以了,我们已经掌握了对话框退出控制权。

改进二:改变对话框的外观
我们可以改变对话框的背景颜色,或对话框中的控件颜色以使得程序界面不至于千
篇一律,如何做呢?每个控件和对话框在显示之前回发送WM_CTLCOLOR消息,如果
派生对话框类对WM_CTLCOLOR消息进行了映射,就可以设定文本的前景色和背景色
。同时还可以为控件或对话框的非文本区域选择一个刷子。
WM_CTLCOLOR消息对应的函数为OnCtlColor,OnCtlColor函数的原型为:afx_msg
HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );其中参数pDC是
:一个指向设备环境的指针。pWnd:指定特定的控件。nCtlColor:指明控件类型。
 可以有以下类型:
CTLCOLOR_BTN            button control
CTLCOLOR_DLG            dialog box
CTLCOLOR_EDIT           edit control
CTLCOLOR_LISTBOX        list box
CTLCOLOR_MSGBOX         message box
CTLCOLOR_SCROLLBAR      scroll bar
CTLCOLOR_STATIC         static text, frame, or rectangle
现在为了突出显示文本框的显示号码,我们将文本框的文字背景设为黄色。
步骤1、添加一个成员变量 HBRUSH m_hBrush;
步骤2、用Class Wizard为CGuessDlg加入WM_CTLCOLOR消息,并编辑OnCtlColor函
数:
HBRUSH CGuessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if(nCtlColor==CTLCOLOR_EDIT){
        pDC->SetBkColor (RGB(255,255,0));//EDIT控件文字背景为黄色
        return m_hBrush;
    }
    return CDialog::OnCtlColor (pDC,pWnd,nCtlColor);
}
编译运行,怎么样,文本框内的文字均变为黄底了。关于对话框的外观我们将在以
后再说。

改进三、增加进度条。
程序在随机产生号码时没有任何提示,我们不知道程序是否在运行,怎么办?我们
增加一个进度条控件,用来观察程序的运行状况。
步骤1、在对话框编辑器中增加一个进度条控件(Progress),并在CGuessDlg为进
度条增加一个成员变量。int  m_nProgress;
步骤2、将CGuessDlg::OnButton1()用下面代码替换。
void CGuessDlg::OnButton1()
{
    m_nProgress=0;//初始进度条为0
    CProgressCtrl *pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
    pProg->SetRange (0,70);//设定进度条范围为0-70
    int temp,pnum[35],num[7]; //临时变量,临时数组
    for(int i=0;i<35;i++)    //赋值,以作选号用
        pnum[i]=i+1;
    //***选号过程:***//
    for(i=0;i<7;i++)
    {
        srand( (unsigned)time( NULL ) );
        //srand(3);
        temp=rand(); //取随机种子数
        temp=temp%36+1; //取小于35的数组元素
        while(pnum[temp]==0)//如果是已被选过的元素,重选
        {
            srand( (unsigned)time( NULL ) );
            temp=rand();
            temp=temp%36+1;
        }
        m_nProgress+=10;//进度加10
        num[i]=temp; //选定一个号码
        pnum[temp]=0; //给该元素置0,表示已被选过
        UpdateData(TRUE);//刷新
        pProg->SetPos (m_nProgress);

    }
    /*** 在选完号码后,应该为它们排一下序:***/
    //排序部分无变化省略。
}
编译运行它,好了,有了进度显示我们可以知道程序的运行情况了。
在这篇笔记中我们通过对上一篇所写的小程序的改进,掌握了一些改进对话框的方
法,不用书上的例子是想给大家多个例子参考,不过书上的例子一定要掌握。好了
关于模式对话框我们已经掌握,下一篇我们将继续学习无模式对话框。

未完待续
下一篇:无模式对话框
正文完



--

      放弃是最容易的事

      Email: caiji@163.net     QQ: 80123     ICQ:17061700

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.168]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店