zoukankan      html  css  js  c++  java
  • 【Demo 0045】仿酷狗屏幕歌词窗体

    今晚用酷狗听歌时看到它的歌词效果做不不错, 真的很棒,所以想玩一玩模仿一下, 就开始分析如何实现,我分析步骤

    1.  实现不被最小化的窗体

        发现显示桌面时它不会最小化,我在桌面窗体中没有看到它的存在, 难到它不是一个窗体吗? 我用SPY++查看,它是一个窗体,但为何它不会被最小化呢,看到这窗体风格我想是不是只

        要设置这些就可以了呢, 开始写程序试,果然是这样的,我才知道只要设了WS_EX_TOPMOST扩展风格之后它就不会被最小化; 

    2.  字体窗体实现

        通过BeginPath和EndPath得到路径再用PathToRegion得到字体的区域并用一个图片填充到区域中最后用SetWindowRgn函数改变窗体成文件区域的形状。 效果应该和这个差不多了。

    按照这个思路, 我写了一个Demo,  关键代码

    1.  实现第一个问题

    DWORD dwStyleEx = WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_TOPMOST|WS_EX_TOOLWINDOW|WS_EX_NOACTIVATE;
    DWORD dwStyle   = WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_SYSMENU;
    HWND hWnd = CreateWindowEx(dwStyleEx, szClsName, szWndCaption, dwStyle, 0, 0, 930, 100, NULL, NULL, hInstance, NULL);

    2.  实现第二个问题(开始用图片,感觉效果不好, 最后用对字体描述和填充的方式)

    case WM_PAINT:
    {
        PAINTSTRUCT pt;
        HDC hDC = BeginPaint(hWnd, &pt);
        
        RECT rtClient;
        GetClientRect(hWnd, &rtClient);
        RECT rtTopUpper, rtBottomRight;
        SetRect(&rtTopUpper, rtClient.left, rtClient.top, rtClient.right, (rtClient.bottom - rtClient.top) / 2);
        SetRect(&rtBottomRight, rtClient.left, (rtClient.bottom - rtClient.top) / 2, rtClient.right, rtClient.bottom);
        const TCHAR* szText1 = _T("Ôٻص½ËýµÄÉíÅÔ");
        const TCHAR* szText2 = _T("¿´ËýµÄÎÂÈáÉÆÁ¼");
                
        LOGFONT LogFont;
        GetObject(GetCurrentObject(hDC, OBJ_FONT), sizeof(LOGFONT), &LogFont);
        _tcscpy(LogFont.lfFaceName, _T("ºÚÌå"));
        LogFont.lfHeight    = 38;
        LogFont.lfWidth        = 19;
        LogFont.lfQuality   = CLEARTYPE_QUALITY;
        HFONT hFont = CreateFontIndirect(&LogFont);
        HFONT hOldFont = (HFONT)SelectObject(hDC, hFont);
        
        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, RGB(0, 0, 255));

        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, RGB(220, 12, 13));

        BeginPath(hDC);
        SetBkMode(hDC, TRANSPARENT);
        DrawText(hDC, szText1, -1, &rtTopUpper, DT_LEFT|DT_SINGLELINE);
        DrawText(hDC, szText2, -1, &rtBottomRight, DT_RIGHT|DT_SINGLELINE);
        EndPath(hDC);
        StrokeAndFillPath(hDC);
        WidenPath(hDC);

        BeginPath(hDC);
        DrawText(hDC, szText1, -1, &rtTopUpper, DT_LEFT|DT_SINGLELINE);
        DrawText(hDC, szText2, -1, &rtBottomRight, DT_RIGHT|DT_SINGLELINE);
        EndPath(hDC);
        HRGN hRgn = PathToRegion(hDC);    
        SetWindowRgn(hWnd, hRgn, FALSE);

        SelectObject(hDC, hOldFont);
        DeleteObject(hFont);
        DeleteObject(hRgn);

        EndPaint(hWnd, &pt);
        return 0;
    }

    写完这个Demo后,感觉效果太差(比酷狗), 1. 字体锯齿感太强,  2.  还没有去实际字慕滚(效果太差了没欲望往后写)3.  拖动效果;  4. 渐变显示效果image

    总体来说思路还是比较靠谱,对实行手段要改一下;  算是先写一个雏形吧, 后期再用GDI+去实现,效果就应该会比较接近,灰太狼一句: “我一定还会回来的…”不达目标誓不休

    演示代码

  • 相关阅读:
    js去掉字符串前后空格三种方法及最佳方案
    javascript笔记:Date对象及操作方法
    高性能网站建设指南总结
    javascript之词法作用域及函数的运行过程
    LETTers比赛第四场N!
    LETTers比赛第三场 1003 大明A+B解题报告
    LETTers比赛第三场 1004 Max Sum Plus Plus 解题报告
    LETTers比赛第三场 1002 Ignatius and the Princess III解题报告
    LETTers第五场Sleeping 解题报告
    LETTers比赛第四场N!的最高位
  • 原文地址:https://www.cnblogs.com/ztercel/p/2170334.html
Copyright © 2011-2022 走看看