编程经验_Visual C++ 6.0_启动程序时伴随主窗口弹出程序说明窗口(2)

来源:互联网 发布:从手机淘宝上怎么退货 编辑:程序博客网 时间:2024/05/21 03:28

    程序启动的时候弹出两个窗口,窗口的位置不太对,怎么设置?

    可以用GetWindowRect()得到窗口(控件也是窗口)的大小和位置,用SetWindowPos()设置窗口的大小位置。只用后者就够了,在CAGADlg类的OnInitDlg()中:

    this->SetWindowPos(NULL, 100, 100, 0, 0, SWP_NOSIZE);

    cad->SetWindowPos(NULL, 100, 100, 0, 0, SWP_NOSIZE);

    第一个参数很有用,可以设置窗口的Z order。我想通过这个参数的设置实现主程序窗口盖在说明窗口上,但是没成功。最后只好实现在主窗口上点一下鼠标左键让说明窗口消失。

    第二、三个参数是位置坐标。

    第四、五个参数是大小,第六个参数SWP_NOSIZE的意思是废掉第四、五个参数,使用VC资源编辑器中的窗口大小。因为我发现这里设置了窗口大小后,窗口中的控件大小没有相应地改变,只设置了对话框一个窗口的大小,对其中的控件窗口没有影响。

 

 

    下一步,给程序说明窗口加上说明信息。

    增加一个Edit控件,属性设置为只读和自动垂直滚动条。用ClassWizard关联一个CString类型的变量m_sProgramInfo。发现在CAboutDlg构造函数中自动生成了代码:

    CString m_sProgramInfo = _T("");

    这个_T("...")是什么意思?查MSDN。这是Microsoft为了便于编程的国际化而提供一种mapping,用#define定义一种字符集,_T()能自动将其中的内容按照这种字符集来编码,当程序要移植到使用另一种字符集的环境中时,只需要修改#define就可以了。

    OK,我往_T("")里面填程序说明,就像在记事本里面写文章一样···两个问题:

    (1)在IDE中直接换行导致编译错误:error C2001: newline in constant

    如果一行太长了写不下,应该用 /(回车字符) 表示换行继续写。这句话以前看到过,但是一直没注意。因为函数参数太长的时候,在逗号前面或后面直接输入回车换一行就行了。函数参数之间插入分隔符会被忽略掉,但是输入字符串常量时插入空格会显示出来,插入换行符会报错,太长了要换一行继续输入,必须用到 /(回车字符) 。

    注意,用 / 后要顶行首写,不然会把空格和制表符都写到CString里面去。

    用 /(回车) 甚至可以把一个函数名从中间劈开写在两行里面。 /(回车字符) 大概就是一个给编译器看的预编译符号,编译器看到 / 就把下一行和上一行合并。注意是 /(回车字符),在 / 后面插入一个空格也会编译报错。

    (2)怎么在Edit控件中显示换行效果

    一开始我是想直接输入换行符,显示出换行符,结果编译报错

    然后我加/n来换行,就像printf里面一样换行。It doesn't work。

    然后我想,那肯定是像文本文件中一样,需要回车换行两个字符来表示换行效果,所以我用 /n/r。还是不行。

    上网一查,原来应该用 /r/n···试一试,OK。

    后来还发现了一个问题,直接在CAboutDlg构造函数里面修改了m_sProgramInfo的值之后发现不能在这个对话框资源上使用ClassWizard了。应该避免直接修改VC自动生成的代码,正确的做法应该是在主窗口的OnInitDlg()中,显示About对话框的时候对该对话框进行设置。

 

    在程序主窗口上点左键让说明窗口消失,这个好办。

    有个细节要注意,DestroyWindow()只是让窗口不再显示,并没有销毁这个对象,所以多次点鼠标左键的时候不会出现空指针的问题。在销毁对象的场合需要注意这个细节。

    但是,在程序主窗口上按F1让说明窗口再出来,遇到麻烦了。

    首先我给WM_KEYDOWN消息增加响应函数,结果发现按下键盘上的F1键根本就没调到这个函数,系统自动去找.HLP文件。

    然后我再给WM_CHAR消息增加响应函数,结果跟上面一样。困惑了,难道键盘输入时发送的是别的消息?那这两个消息做什么用?

原创粉丝点击