有一个CString对象的文字内容,想在Static Text控件内以宋体二号字大小,字体颜色是绿色,从控件的右边飘到左边(类似跑马灯)靠停下来
希望有变量阀值可以调速...ID是IDC_STATIC1感谢了,100分

解决方案 »

  1.   

    1.控制字体和颜色------
    从CStatic派生一个类,添加CFont和COLORREF成员变量,同时添加两个函数,用于设置字体和颜色,重载OnPaint函数,在里面改变字体和颜色即可
    2.从左边到右边,并能控制速度--------
    控制速度,用一个整型变量就行了,并用这个变量作为SetTimer的时间间隔;更改窗口位置,可以用SetWindowPos;从左边到右边,在OnTimer里面,SetWindowPos从左边的坐标到右边的坐标,搞定。无需另开线程,增加难度。
      

  2.   

    最简单的办法是用SetWindowsText来实现,方法如下:
    给你一个函数吧,比如:你的Static控件的ID是IDC_STATIC_HINT,则用如下函数void RunHorseLight(CString strText, int nSpeed)
    {
    for(int i = 1; i < strText.GetLength(); i++)
    {
    CString strOneWord = strText.Mid(i - 1, 1);//注意这里只是对英文,如果是中文还得另处理,因为中文是两个字节
    CString strShowText;
    if(i > 1)
    strShowText = strText.Left(i - 1); CString strBlankSpace = "";
    for(int j = 0; j < nSpeed - i; j++)
    strBlankSpace += " ";//用空格补上能看到从右向左跑马灯的效果
    for(int j = nSpeed; j > 0; j--)
    {
    CString strMid = strBlankSpace.Left(j);
    strShowText = strShowText + strMid + strOneWord;
    GetDlgItem(IDC_STATIC_HINT)->SetWindowText(strShowText);
    Sleep(600);
    }
    }
    }
      

  3.   


    谢谢,再请教:1、CString strOneWord = strText.Mid(i - 1, 1);//注意这里只是对英文,如果是中文还得另处理,因为中文是两个字节如果strText是中文字应该如何处理呢? 2、编译好像有点问题,不过我只是把函数先到了dlg.h先,暂时没做用处编译提示:elworddlg.h(44) : error C2440: “初始化”: 无法从“const char [1]”转换为“ATL::CStringT<BaseType,StringTraits>”
    1>        with
    1>        [
    1>            BaseType=wchar_t,
    1>            StringTraits=StrTraitMFC<wchar_t>
    1>        ]
    1>        class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
    1>        with
    1>        [
    1>            BaseType=wchar_t,
    1>            StringTraits=StrTraitMFC<wchar_t>
    1>        ]
    1>f:\codetest\elword\elword\elworddlg.h(51) : error C2660: “GetDlgItem”: 函数不接受 1 个参数
    1>f:\codetest\elword\elword\elworddlg.h(51) : error C2227: “->SetWindowTextW”的左边必须指向类/结构/联合/泛型类型
    1>elwordDlg.cpp
    1>f:\codetest\elword\elword\elworddlg.h(44) : error C2440: “初始化”: 无法从“const char [1]”转换为“ATL::CStringT<BaseType,StringTraits>”
    1>        with
    1>        [
    1>            BaseType=wchar_t,
    1>            StringTraits=StrTraitMFC<wchar_t>
    1>        ]
    1>        class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
    1>        with
    1>        [
    1>            BaseType=wchar_t,
    1>            StringTraits=StrTraitMFC<wchar_t>
    1>        ]
    1>f:\codetest\elword\elword\elworddlg.h(51) : error C2660: “GetDlgItem”: 函数不接受 1 个参数
    1>f:\codetest\elword\elword\elworddlg.h(51) : error C2227: “->SetWindowTextW”的左边必须指向类/结构/联合/泛型类型
    1>f:\codetest\elword\elword\elworddlg.cpp(72) : error C2509: “PreTranslateMessage”: 成员函数没有在“CelwordDlg”中声明
    1>        f:\codetest\elword\elword\elworddlg.h(8) : 参见“CelwordDlg”的声明
    1>正在生成代码...
    1>生成日志保存在“file://f:\codetest\elword\elword\Debug\BuildLog.htm”
    地44行是这个函数的:CString strBlankSpace = "";
      

  4.   

    与其控制static里面的字移动,还不如控制static控件移动,
    你可以外面用一个带边框的static,里面用一个不带边框的static.CString strBlankSpace = L"";
      

  5.   

    楼主自己动手写一个吧。可通过SetTimer来设置定时器,然后在OnTimer中进行处理。
    如果你用Static控件,为了通用你可以自己派生一个类。
      

  6.   

    谢谢两位,折腾了一下,算是明白了原理....貌似
    CString strBlankSpace = L""

    CString strBlankSpace = (_T(""));
    都可以?
    GetDlgItem(IDC_STATIC1)->SetWindowText(strShowText);
    我控件的ID的确是IDC_STATIC1,第二个参数不知道是什么问题?
    GetDlgItem能接受一个以上参数吗?貌似没有SetWindowText,只有SetWindoTextW,又要怎么转换呢?
    1>f:\codetest\elword\elword\elworddlg.h(50) : error C2660: “GetDlgItem”: 函数不接受1 个参数
    1>:\codetest\elword\elword\elworddlg.h(50) : error C2227: “->SetWindowTextW”的左边必须指向类/结构/联合/泛型类型后面处理的事情关键在这些变化的CString上,控件移动超出我能力范围了囧
    太累,明天再折腾了