本文配套程序下载地址为: http://pan.baidu.com/share/link?shareid=358034&uk=3995556177

界面的xml配好后,就开始写实现代码。先上代码


class CMainFrameWnd : public CWindowWnd, public INotifyUI, public IMessageFilterUI
{
public:
    CMainFrameWnd() { m_fixed = FALSE; m_errorcode = 0;};
    LPCTSTR GetWindowClassName() const { return _T("UIMainFrame"); };
    UINT GetClassStyle() const { return UI_CLASSSTYLE_DIALOG; };
    void OnFinalMessage(HWND /*hWnd*/)
    {
        m_pm.RemovePreMessageFilter(this);
        delete this;
    }

void Init()
    {
        CContainerUI* pAccountCombo;
        pAccountCombo = static_cast<CContainerUI*>(m_pm.FindControl(_T("ContainerUIStep2")));
        pAccountCombo->SetVisible(FALSE);
        pAccountCombo = static_cast<CContainerUI*>(m_pm.FindControl(_T("ContainerUIStep1")));
        pAccountCombo->SetVisible(TRUE);
        pAccountCombo = static_cast<CContainerUI*>(m_pm.FindControl(_T("ContainerUIStep3")));
        pAccountCombo->SetVisible(FALSE);

}

void BtnClose_Click()
     {
          PostQuitMessage(0);
     }

void BtnWin7_Click()
     {
          m_bOsType = WIN_WIN7;
          CLabelUI* pAccountEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("LabelUIDescription")));
          pAccountEdit->SetText(_T("正在下载 Win7 系统到您的计算机..."));

CContainerUI* pAccountCombo = static_cast<CContainerUI*>(m_pm.FindControl(_T("ContainerUIStep2")));
          pAccountCombo->SetVisible(TRUE);
          pAccountCombo = static_cast<CContainerUI*>(m_pm.FindControl(_T("ContainerUIStep1")));
          pAccountCombo->SetVisible(FALSE);

CProgressUI* pProcess = static_cast<CProgressUI*>(m_pm.FindControl(_T("ProgressDownload")));
          pProcess->SetValue(0);
          CLabelUI* pWaitLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("LabelWaiting")));
          pWaitLabel->SetText(_T("开始下载, 请耐心等待..."));

g_status = TO_GET_CONFIG; // start
          ::SetTimer(m_hWnd, TIMER_ID_CHECKDOWNLOADWND, 1000, NULL);
     }

void Notify(TNotifyUI& msg)
    {
        if( msg.sType == _T("click") )
          {
               // 关闭按钮
            if( msg.pSender->GetName() == _T("BtnClose") )
            {
                BtnClose_Click();
                return;
            }
            else if ( msg.pSender->GetName() == _T("BtnXP"))
               {
                    BtnXP_Click();
                return;
               }
               else if (msg.pSender->GetName() == _T("BtnWin7") )
               {
                    BtnWin7_Click();
                return;
               }
               // 重启动完成安装
               else if (msg.pSender->GetName() == _T("ButtonUIReboot"))
               {
                    ButtonUIReboot_Click();
                return;
               }
               
        }
        else if( msg.sType == _T("itemselect") )
        {
            if( msg.pSender->GetName() == _T("accountcombo") )
            {
                CEditUI* pAccountEdit = static_cast<CEditUI*>(m_pm.FindControl(_T("accountedit")));
                if( pAccountEdit )
                    pAccountEdit->SetText(msg.pSender->GetText());
            }
        }
    }

LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
          SetIcon(IDI_ICON_WINGIRL);      // 加上以后运行的时候有图标

LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
        styleValue &= ~WS_CAPTION;
        ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

m_pm.Init(m_hWnd);
        m_pm.AddPreMessageFilter(this);
        CDialogBuilder builder;
        CControlUI* pRoot;
          if (IsWindowsVistaUp())
               pRoot = builder.Create(_T("UIMainWin7.xml"), (UINT)0, NULL, &m_pm);
          else
               pRoot = builder.Create(_T("UIMainXP.xml"), (UINT)0, NULL, &m_pm);
        ASSERT(pRoot && "Failed to parse XML");
        m_pm.AttachDialog(pRoot);
        m_pm.AddNotifier(this);

Init();
        return 0;
    }

LRESULT OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        if( ::IsIconic(*this) ) bHandled = FALSE;
        return (wParam == 0) ? TRUE : FALSE;
    }

LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        return 0;
    }

LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        return 0;
    }

LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        POINT pt;
        pt.x = GET_X_LPARAM(lParam);
        pt.y = GET_Y_LPARAM(lParam);
        ::ScreenToClient(*this, &pt);

RECT rcClient;
        ::GetClientRect(*this, &rcClient);

RECT rcCaption = m_pm.GetCaptionRect();
        if( pt.x >= rcClient.left + rcCaption.left
            && pt.x < rcClient.right - rcCaption.right
            && pt.y >= rcCaption.top
            && pt.y < rcCaption.bottom )
        {
            CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
               if (!m_fixed)
                    if( pControl && _tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 )
                         return HTCAPTION;
        }

return HTCLIENT;
    }

void ShowMessage(CString msg)
     {
          CLabelUI* pAccountEdit = static_cast<CLabelUI*>(m_pm.FindControl(_T("LabelWaiting")));
          pAccountEdit->SetText(msg);
     }

LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        SIZE szRoundCorner = m_pm.GetRoundCorner();
        if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) )
        {
            CRect rcWnd;
            ::GetWindowRect(*this, &rcWnd);
            rcWnd.Offset(-rcWnd.left, -rcWnd.top);
            rcWnd.right++;
            rcWnd.bottom++;
            HRGN hRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
            ::SetWindowRgn(*this, hRgn, TRUE);
            ::DeleteObject(hRgn);
        }

bHandled = FALSE;
        return 0;
    }
    //

// ...
//
}

问题来了,程序编译出来后,没有图标,而且运行时在任务栏也没有图标。然后看了所有的duilib例子,都是这样。于是研究了一下,在资源文件中加入图标,并在oncreate中调用SetIcon(IDI_ICON_XXX),问题就解决了。

之前看到同事做的工具,觉得duilib功能还差很多,比如不支持动画,界面设计工具功能简单。但是现在用duilib开发了这个软件后,发现duilib实际上挺好用的。虽然duilib的界面设计工具不怎么好用,但是直接写xml界面也简单。而且可以先用设计工具设计局部,然后把代码拷贝到界面xml文件中。我在设计界面的过程中就常用这个小技巧。

小妞会装机 -- 一个装机软件的开发笔记( 四)相关推荐

  1. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...

  2. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

  3. 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩 纹理映射技术 二

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  4. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  5. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

  6. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)    邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...

  7. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  8. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  9. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8547531 作者:毛星云(浅墨) ...

最新文章

  1. 11.如何在非固定大小的地图图片上正确渲染ROS小车的位置和运行轨迹
  2. 0-100之间的素数、判断素数的基本和优化方法
  3. MySQL 索引方式
  4. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
  5. 27、ArrayList和LinkedList的区别
  6. php操作memcache缓存基本方法
  7. 蒜黄香菇炒肉 【原创】
  8. Myeclipse J2EE Project, 折腾死我了。
  9. IE浏览器提示对象不支持“append”属性或方法
  10. mybatis同时查询未知个数的表中数据(表名做为参数传递,联合查询union)
  11. K3WISE老单序时簿开发示例:增加功能性按钮
  12. mysql网站倒计时代码_最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
  13. Docker码头工人之将爬虫放入docker运行
  14. 2021-2027全球与中国抽屉五金市场情况与未来趋势研究报告
  15. 笔记本BIOS能检测到固态,进入系统后磁盘管理不显示固态硬盘
  16. java.net.UnknownHostException:
  17. ViewFlipper用法
  18. 安工大2020计算机调剂,2020考研最新调剂信息,安大、安工大、东北林大211等高校调剂信息...
  19. Windows10、centos7双系统修改默认启动引导选项
  20. New type of dark energy could solve Universe expansion mystery

热门文章

  1. JVM优化,以及垃圾回收的相关面试题请注意查收!
  2. 通过商鞅变法企业可以学到的实施ERP软件精华
  3. Dancer--introduction小议❷
  4. Kotlin KTX 扩展库
  5. 楼下李奶奶的无界零售时刻
  6. 出位的template.js 基于jquery的模板渲染插件,简单、好用
  7. 张驰课堂:一文看懂SPC(六西格玛工具)
  8. 一招完美删除顽固文件或文件夹
  9. 主动扫描-Nmap-端口、系统、服务扫描
  10. 目标检测trick汇总