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)

10:注册与呼叫:

订阅:

NotifyManager()->Subscribe(_T("DESTROY_TIME_WINDOW"), this,

&WastedTimeDlg::DestroyTimeWindow);

发布(呼叫):

NotifyManager()->Notify(_NOTICE_5);

相关推荐
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit2 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1133 小时前
Linux进程与线程编程详解
linux·c++
A7bert7774 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902704 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii