环境:Win10, x64, VS2017, NX1907
记录日期:2020/09/17
目标:实现下图效果
实现思路:
说明一下,我通常用C++开发NX,但是C++ 界面库集成到NX功能上有很多限制,比如:
1. Qt, Qt 的确很容易上手,也容易出效果,但集成到NX那就是个坑,因为兼容性太差了,
想要使用Qt进行NX二次开发的小伙伴,用Qt单独做工具被NX调用还可以,如果只是想用Qt的界面还是算了......
2. MFC, MFC经常被吐槽难用,的确如此,但在NX集成中没有问题,最起码可以实现
3. NX UI, NX界面有个限制条件,不可能同时打开两个对话框, 其他API也没找到进度条之类的
综上,还是老实用MFC吧,补充一点,如果做NX二次开发,Windows API 和 MFC 还是要了解一下的
代码:
1. MFC 程序中加入代码:
BOOL CProcessBarDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
LPCTSTR lstrMsg = (LPCTSTR)(pCopyDataStruct->lpData);
CString strMsg(lstrMsg);
//转成INT
int percent = atoi(CT2A(strMsg));
if (percent < 0 || percent >100)
{
return FALSE;
}
m_progressBar.SetPos(percent);
CString percentStr;
percentStr.Format(_T("%d"), percent);
percentStr = percentStr + CString("%");
m_processText.SetWindowTextW(percentStr);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
2. NX 程序中加入代码:
void ProgressManagerData::SetProgressPercent(int percent)
{
if (percent < 0 || percent >100)
{
return;
}
LRESULT copyData;
CWnd *progressWnd = CWnd::FindWindow(NULL, L"NX进度条");
if (NULL != progressWnd)
{
//传入的数据
CString percentStr;
percentStr.Format(_T("%d"), percent);
percentStr = percentStr + CString("%");
//数据转换
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = (percentStr.GetLength() + 1) * sizeof(TCHAR);
cpd.lpData = (void*)percentStr.GetBuffer(cpd.cbData);
copyData = progressWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cpd);
percentStr.ReleaseBuffer();
}
}
补充:
NX 进度条不支持多进程多线程
测试项目链接: