小妞会装机 -- 一个装机软件的开发笔记( 四)
界面的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文件中。我在设计界面的过程中就常用这个小技巧。
小妞会装机 -- 一个装机软件的开发笔记( 四)相关推荐
- 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩:纹理映射技术(二)...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 邮箱: happylifemxy@163.com 本篇文章里,我们首先对Direct3D之中固定功能流水线中的 ...
- 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...
- 【Visual C++】游戏开发笔记四十三 浅墨DirectX教程十一 为三维世界添彩 纹理映射技术 二
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- JNI开发笔记(四)--实现一个简单的JNI工程并生成so库
实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨) 邮箱: happylifemxy@163.com 本篇文章里,我们对Direct3D之中固定功能流水线中的3D ...
- 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8547531 作者:毛星云(浅墨) ...
最新文章
- 11.如何在非固定大小的地图图片上正确渲染ROS小车的位置和运行轨迹
- 0-100之间的素数、判断素数的基本和优化方法
- MySQL 索引方式
- 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解
- 27、ArrayList和LinkedList的区别
- php操作memcache缓存基本方法
- 蒜黄香菇炒肉 【原创】
- Myeclipse J2EE Project, 折腾死我了。
- IE浏览器提示对象不支持“append”属性或方法
- mybatis同时查询未知个数的表中数据(表名做为参数传递,联合查询union)
- K3WISE老单序时簿开发示例:增加功能性按钮
- mysql网站倒计时代码_最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
- Docker码头工人之将爬虫放入docker运行
- 2021-2027全球与中国抽屉五金市场情况与未来趋势研究报告
- 笔记本BIOS能检测到固态,进入系统后磁盘管理不显示固态硬盘
- java.net.UnknownHostException:
- ViewFlipper用法
- 安工大2020计算机调剂,2020考研最新调剂信息,安大、安工大、东北林大211等高校调剂信息...
- Windows10、centos7双系统修改默认启动引导选项
- New type of dark energy could solve Universe expansion mystery