MFC/QT 一些快要遗忘的细节:
1:企业应用中,MFC平台除了用常见的对话框模式还有一种常用的就是单文档模式,
维护别人的代码,不容易区分,其实找与程序同名的cpp就知道了,比如项目名称为
DoCMFCDemo,那么就看BOOL CDocMFCDemoApp::InitInstance()函数部分就可以了:
单文档:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CMainUIModuleDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CMainUIModuleView));
if (!pDocTemplate) return FALSE;
AddDocTemplate(pDocTemplate);
多文档:
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_DocMFCDemoTYPE,
RUNTIME_CLASS(CDocMFCDemoDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CDocMFCDemoView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
2:获取类名:
#define getModule(class_name) getModuleInterface<class_name>(#class_name)
3:全局静态变量的初始化在main函数之前,
4: 属性,原来可以这样写:
class PROPERTYBROWSERSHARED_EXPORT propertyBase
{
public:
propertyBase();
virtual ~propertyBase();
virtual void InitPropertyBrowser(QtTreePropertyBrowser* pw, QtVariantPropertyManager* pManager, QtVariantPropertyManager* pManager_Editor) {};
virtual void SavePropertyBrowser(QtTreePropertyBrowser* pw) {};
virtual QString getKey(QString key)
{
return "propertyBase" + key;
}
protected:
std::map<QString, QtVariantProperty*> m_propertyMap;
};
#define ADD_PROPERTY_COMMON(MANAGER_PTR, GROUP_PTR, VAL_TYPE,VAL_NAME,VAL) {\
item = MANAGER_PTR->addProperty(VAL_TYPE, VAL_NAME);\
item->setValue(VAL);\
GROUP_PTR->addSubProperty(item);\
m_propertyMap[getKey(VAL_NAME)] = item;\
}
#define ADD_PROPERTY_COMBOBOX(MANAGER_PTR, GROUP_PTR,QSTRING_LIST,VAL_NAME,VAL) {\
item = MANAGER_PTR->addProperty(QtVariantPropertyManager::enumTypeId(), VAL_NAME);\
QStringList enumNames = QSTRING_LIST;\
item->setData("key",QSTRING_LIST);\
item->setAttribute(QLatin1String("enumNames"), enumNames);\
item->setValue(VAL);\
GROUP_PTR->addSubProperty(item);\
m_propertyMap[getKey(VAL_NAME)] = item;\
}
#define CREATE_PROPERTY_GROUP(MANAGER_PTR, GROUP_PTR ,VAL_NAME) {\
GROUP_PTR = MANAGER_PTR->addProperty(QtVariantPropertyManager::groupTypeId(), VAL_NAME);\
pw->addProperty(GROUP_PTR);\
}
5:Tomato,Visual Assist X, 如果运行之后,在win10+ 环境中不见安装界面弹出来,别急,将兼容属性设置为win7就可以安装了。
6:时间差计算:
#pragma once
#include
#include
using namespace std::chrono;
class Txtimer
{
public:
using s = std::ratio; //==>typedef std::ratio
using ms = std::ratio;
using us = std::ratio;
using ns = std::ratio;
public:
Txtimer() :tpStart(high_resolution_clock::now()), tpStop(tpStart) {
};
public:
void start() { tpStart = high_resolution_clock::now(); }
void restart() { tpStart == high_resolution_clock::now(); }
void stop() {
tpStop = high_resolution_clock::now();
}
template
auto delta() const { return duration(high_resolution_clock::now()-tpStart).count(); }
template
auto delta_restart() {
auto ts = duration
start();
return ts;
}
template
auto stop_delta() {
stop();
return duration(tpStop - tpStart).count();
}
template
auto stop_delta_start() {
stop();
auto ts = duration(tpStop, tpStart).count();
start();
return ts;
}
private:
time_point tpStart;
time_point tpStop;
};
7:MSDN 在线:
https://learn.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=msvc-170
8:更改编辑界面上的组件顺序:
鼠标点击在某个组件(如button)上,同时ctrl+D ,便 出现了所有组件的oder序号,要想改变这些顺序,只需松开ctrl+D,然后按自己需要先后顺序点界面上的组件,完成之后再次按ctrl+D即可
9: MFC 的UpdateData函数,关于这个参数,容易搞混:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
UpdateData(TRUE)
——刷新控件的值到对应的变量。(外部输入值交给内部变量)
即:控件的值—>变量。
UpdateData(FALSE)
—— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
即:变量值—>控件显示。
简单一些:
读取窗口的数据之前,先:UpdateData(TRUE)
将窗口变量的值更改了,要显示出来,就用UpdateData(FALSE)