MFC 基础

 windows桌面应用分为两种类型: 基于文档视图类型 和 基于对话框类型。 通常具有复杂交互控件的程序即为基于对话框类型,相对而言比较复杂,而基于文档视图类的应用交互形式比较单一,相对简单。下面给出基于mfc框架的最基本的桌面程序示例:

// 1. 创建控制台空项目
// 2. 项目属性--> 高级-->MFC的应用:[使用标准 Windows 库]  改成  [在共享 DLL 中使用 MFC]
// 3. 项目属性-->链接器-->系统-->子系统:[控制台 (/SUBSYSTEM:CONSOLE)] 改成 [窗口 (/SUBSYSTEM:WINDOWS)]#include <afxwin.h>
class BaseWinApp:public CWinApp
{
public:BaseWinApp();virtual BOOL InitInstance() override;
};class BaseMainFrame:public CFrameWnd
{
public:BaseMainFrame();
};BaseMainFrame::BaseMainFrame()
{}BaseWinApp::BaseWinApp()
{}BOOL BaseWinApp::InitInstance()
{BaseMainFrame* pFrame = new BaseMainFrame();pFrame->Create(NULL, "BaseFrame");m_pMainWnd = pFrame;pFrame->ShowWindow(SW_SHOW);pFrame->UpdateWindow();return TRUE;
}BaseWinApp theApp;//全局唯一// 主线程启动顺序(最终进入一个事件循环):
// WinMain: appmodul.cpp
//                 AfxWinMain: winmain.cpp
//                              (CWinApp*)(&theApp)->InitApplication  应用资源初始化,是虚函数,可以在子类中重写,做一些特殊资源的初始化
//                              (CWinThread*)(&theApp)->InitInstance  用户重写的InitInstance
//                              (CWinThread*)(&theApp)->Run: appcore.cpp
//                                                  (CWinThread*)(&theApp)->CWinThread::Run(): thrdcore.cpp  进入事件循环,处理消息// 当消息产生后会在消息循环中侦测到,并在DispatchMessage内部调用对应窗口的处理回调(如AfxWndProc: wincore.cpp)进行消息处理// MFC 中创建线程的两种方法:
//		1. CWinThread* AFXAPI AfxBeginThread(AFX_THREADPROC pfnThreadProc, ...); 调用该接口,传入线程函数,生成一个CWinThread线程管理对象
//		2. CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,...); 继承CWinThread实现新的Thread类,并声明Runtime信息, 传入新类的RuntimeClass,生成一个线程管理对象。(即CWinApp的做法)//	通过这两种方法创建的新线程,与当前线程公用同一个消息队列,以便在两个线程之间完成通信

 基于对话框的应用,可以先看win32 框架下的示例,对程序的运行框架有一个大致的理解:

#include <windows.h>
#include <iostream>
#include "resource.h"//要给项目添加资源文件//本例需要在资源文件中添加一个Dialog控件(ID为IDD_DIALOG1)和一个Menu控件(ID为IDR_MENU1,MENU中要增加菜单栏和菜单项)HINSTANCE g_hInstance = NULL;
HWND hddd = NULL;INT_PTR CALLBACK DlgProc(HWND hwndlg,UINT msgID,WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_SYSCOMMAND:if (wParam == SC_CLOSE){HWND pHwnd = GetParent(hwndlg);DestroyWindow(hwndlg);EnableWindow(pHwnd, TRUE);}else//不知道如何处理的消息,则让框架处理return FALSE;break;case WM_DESTROY:MessageBox(NULL,L"Dialog Destroyed",L"Notify",MB_OK);break;case WM_COMMAND:if(wParam == IDOK)MessageBox(NULL, L"User Confirmed",L"Dialog Result",  MB_OK);else if(wParam == IDCANCEL)MessageBox(NULL, L"User Denied",  L"Dialog Result",MB_OK);break;default:return FALSE;break;}return TRUE;
}void OnNoModel(HWND hWnd)
{HWND pHwnd = GetParent(hWnd);EnableWindow(pHwnd,FALSE);//HWND hDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DlgProc);// 等效步骤①②③④⑤⑥//创建对话窗对象,并和对话框控件(资源中创建,ID为IDD_DIALOG1)绑定HRSRC hRs = FindResource(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG1),RT_DIALOG);//①HGLOBAL hGl = LoadResource(g_hInstance,hRs);//②LPDLGTEMPLATE pTemplate = (LPDLGTEMPLATE)LockResource(hGl);//③HWND hDlg = CreateDialogIndirect(g_hInstance,pTemplate,hWnd, DlgProc);//④UnlockResource(hGl);//⑤FreeResource(hGl);//⑥hddd = hDlg;ShowWindow(hDlg, SW_SHOW);//立即返回不阻塞
}void OnCommand(HWND hWnd,WPARAM wParam )
{WORD ID = LOWORD(wParam);//控件IDWORD Code = HIWORD(wParam);//通知类型switch (ID){case ID_FFF:// 资源文件中定义菜单栏下拉的菜单选项对应的资源ID,点击该菜单项将创建一个对话框出来OnNoModel(hWnd);break;default:break;}
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{LRESULT lRet = 0;switch (msgID){case WM_DESTROY:PostQuitMessage(0);break;case WM_COMMAND:OnCommand(hWnd,wParam);break;default:lRet = DefWindowProc(hWnd, msgID, wParam, lParam);break;}return lRet;
}int CALLBACK WinMain(HINSTANCE hIns,HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow)
{g_hInstance = hIns;WNDCLASS wc = {};wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName =L"Main";//wc.lpszMenuName = NULL;// IDR_MENU1 在资源文件中添加一个菜单资源,资源ID为IDR_MENU1wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);HWND hWnd = CreateWindowEx(0,L"Main",L"window",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hIns,NULL);ShowWindow(hWnd,SW_SHOW);UpdateWindow(hWnd);MSG nMsg = {};// AllocConsole();//打日志用// FILE* f = NULL;// freopen_s(&f,"CONOUT$", "w", stdout);while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数处理}//fclose(f);return 0;
}

对话框程序示例

#include <afxwin.h>
#include <afxcmn.h>
#include "resource.h"//本例需要在资源文件中添加一个Dialog控件(ID为IDD_DIALOG1) class MainDialog : public CDialog
{DECLARE_MESSAGE_MAP()enum { IDD = IDD_DIALOG1 };
public:MainDialog():CDialog(IDD){}void OnIdle(){}//可在此处理低优先级任务
protected:BOOL OnInitDialog() override{return CDialog::OnInitDialog();}void OnClosed(void){::DestroyWindow(this->m_hWnd);}void AFX_MSG_CALL OnSysCommand(UINT msgID, LPARAM lParam){DWORD cmdType = msgID & 0xFFF0;switch (cmdType){case SC_CLOSE://处理标题栏的关闭事件OnClosed();break;default:CDialog::OnSysCommand(msgID, lParam);break;}}void DoDataExchange(CDataExchange* pDX) override{}
};
BEGIN_MESSAGE_MAP(MainDialog, CDialog)ON_WM_SYSCOMMAND()
END_MESSAGE_MAP()class BaseWinApp :public CWinApp
{
public:BaseWinApp();virtual BOOL InitInstance() override;virtual BOOL OnIdle(LONG lCount) override;
};BaseWinApp::BaseWinApp()
{InitApplication();
}BOOL BaseWinApp::InitInstance()
{MainDialog* pFrame = new MainDialog();pFrame->Create(IDD_DIALOG1,NULL);m_pMainWnd = pFrame;pFrame->ShowWindow(SW_SHOW);//LONG wProc = GetWindowLongPtr(pFrame->m_hWnd, GWLP_WNDPROC);//that should be AfxWndProc//WNDPROC fun = AfxWndProc;//BOOL bRet = fun == (WNDPROC)wProc;//delete pFrame;return TRUE;
}BOOL BaseWinApp::OnIdle(LONG lCount)
{if (m_pMainWnd != NULL)((MainDialog*)m_pMainWnd)->OnIdle();return CWinThread::OnIdle(lCount);
}BaseWinApp theApp;

单文档程序示例


#include <afxwin.h>
#include <afxext.h>
#include "resource.h"//本例需要在资源文件中添加一个Menu控件(ID为IDR_MENU1) 和一个String Table(添加字符串资源:ID=AFX_IDS_UNTITLED, Value=61443,Caption=自定义)class CMyDoc :public CDocument
{DECLARE_DYNCREATE(CMyDoc)
};
IMPLEMENT_DYNCREATE(CMyDoc,CDocument)class CMyView :public CView
{DECLARE_DYNCREATE(CMyView)
public:virtual void OnDraw(CDC* pDC);
};
void CMyView::OnDraw(CDC* pDC)
{pDC->TextOut(100,100,"this is a view wnd");
}
IMPLEMENT_DYNCREATE(CMyView, CView)class CMyFrameWnd : public CFrameWnd
{DECLARE_DYNCREATE(CMyFrameWnd)
};
IMPLEMENT_DYNCREATE(CMyFrameWnd, CFrameWnd)class CMyWinApp : public CWinApp
{
public:virtual BOOL InitInstance();
};BOOL CMyWinApp::InitInstance()
{/************  方式一 Begin************************************///CSingleDocTemplate* pTemplate = new CSingleDocTemplate(IDR_MENU1,//    RUNTIME_CLASS(CMyDoc),//	RUNTIME_CLASS(CMyFrameWnd), //    RUNTIME_CLASS(CMyView));//AddDocTemplate(pTemplate);//OnFileNew();/************  方式一 End************************************/	/**********************方式二 Begin: **************************/ CMyFrameWnd* pFrame = new CMyFrameWnd;CMyDoc* pDoc = new CMyDoc;CCreateContext cct;cct.m_pCurrentDoc = pDoc;cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&cct);m_pMainWnd = pFrame;/**********************方式二 End **************************/m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;
}CMyWinApp theApp;

多文档程序示例

#include <afxwin.h>
#include <afxext.h>
#include "resource.h"
//本例需要在资源文件中添加两个Menu控件(ID为IDR_MENU1和IDR_MENU2) 和一个String Table(添加字符串资源:ID=AFX_IDS_UNTITLED, Value=61443,Caption=自定义)class CMyDoc :public CDocument
{DECLARE_DYNCREATE(CMyDoc)
};
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)class CMyView :public CView
{DECLARE_DYNCREATE(CMyView)
public:virtual void OnDraw(CDC* pDC);
};
void CMyView::OnDraw(CDC* pDC)
{pDC->TextOut(100, 100, "I am a view wnd");
}
IMPLEMENT_DYNCREATE(CMyView, CView)class CMyChild :public CMDIChildWnd
{DECLARE_DYNCREATE(CMyChild)
};
IMPLEMENT_DYNCREATE(CMyChild, CMDIChildWnd)class CMyFrameWnd : public CMDIFrameWnd
{
public:CMyFrameWnd() :CMDIFrameWnd() {}BOOL PreCreateWindow(CREATESTRUCT& cs) override{m_strTitle = "MasterWnd";//修改主窗口标题return CMDIFrameWnd::PreCreateWindow(cs);}
public:DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyFrameWnd, CMDIFrameWnd)
END_MESSAGE_MAP()class CMyWinApp : public CWinApp
{
public:virtual BOOL InitInstance();
};BOOL CMyWinApp::InitInstance()
{CMyFrameWnd* pFrame = new CMyFrameWnd();pFrame->LoadFrame(IDR_MENU1);//MENU1为主框架窗口的菜单(MENU1至少需要两个菜单栏)m_pMainWnd = pFrame;CMultiDocTemplate* pTemplate = new CMultiDocTemplate(IDR_MENU2,//MENU2为子框架窗口的菜单RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMyChild),RUNTIME_CLASS(CMyView));AddDocTemplate(pTemplate);OnFileNew();//创建三个子窗口OnFileNew();OnFileNew();m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;
}CMyWinApp theApp;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

npm无法加载文件 因为此系统禁止运行脚本

安装nodejs后遇到问题&#xff1a; 在项目里【node -v】可以打印出来&#xff0c;【npm -v】打印不出来&#xff0c;显示npm无法加载文件 因为此系统禁止运行脚本。 但是在winr&#xff0c;cmd里【node -v】,【npm -v】都也可打印出来。 解决方法&#xff1a; cmd里可以打印出…

JVM春招快速学习指南

1.说在前面 在Java相关岗位的春/秋招面试过程中&#xff0c;JVM的学习是必不可少的。本文主要是通过《深入理解Java虚拟机》第三版来介绍JVM的学习路线和方法&#xff0c;并对没有过JVM基础的给出阅读和学习建议&#xff0c;尽可能更加快速高效的进行JVM的学习与秋招面试的备战…

认识Electron 开启新的探索世界一

一、Electron轻松入门 1.搭建开发环境&#xff1a; 一般情况下开发者会使用node.js来创建electron项目&#xff0c;node.js是一个基于Chrome V8引擎的javascript运行环境&#xff0c;所以首先需要到官网去下载安装node.js 下载链接&#xff1a;https://nodejs.org/enhttps://no…

MySQL下载过程

MySQL Enterprise Edition Downloads | Oracle mysql官方下载网址&#xff08;9.2版本&#xff09; 下面的示例是5.7的包&#xff0c;过程是一样的 port&#xff1a;3308&#xff08;默认的是3306&#xff0c;笔者下了一个占用了该端口&#xff09; root&#xff1a;123456 问题…

【学术投稿】第五届计算机网络安全与软件工程(CNSSE 2025)

重要信息 官网&#xff1a;www.cnsse.org 时间&#xff1a;2025年2月21-23日 地点&#xff1a;中国-青岛 简介 第五届计算机网络安全与软件工程&#xff08;CNSSE 2025&#xff09;将于2025年2月21-23日在中国-青岛举行。CNSSE 2025专注于计算机网络安全、软件工程、信号处…

Qt:QWidget核心属性

目录 QWidget核心属性 enab geometry WindowFrame的影响 windowTitle windowIcon qrc文件管理资源 windowOpacity cursor font toolTip focusPolicy styleSheet QWidget核心属性 在Qt中使用QWidget类表示"控件"&#xff0c;如按钮、视图、输入框、滚动…

Linux TCP 编程详解与实例

一、引言 在网络编程的领域中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;协议因其可靠的数据传输特性而被广泛应用。在 Linux 环境下&#xff0c;使用 C 或 C 进行 TCP 编程可以实现各种强大的网络应用。本文将深入探讨 Linux TCP 编程的各个方面&…

论文笔记:Rethinking Graph Neural Networks for Anomaly Detection

目录 摘要 “右移”现象 beta分布及其小波 实验 《Rethinking Graph Neural Networks for Anomaly Detection》&#xff0c;这是一篇关于图&#xff08;graph&#xff09;上异常节点诊断的论文。 论文出处&#xff1a;ICML 2022 论文地址&#xff1a;Rethinking Graph Ne…

神经网络常见激活函数 6-RReLU函数

文章目录 RReLU函数导函数函数和导函数图像优缺点pytorch中的RReLU函数tensorflow 中的RReLU函数 RReLU 随机修正线性单元&#xff1a;Randomized Leaky ReLU 函数导函数 RReLU函数 R R e L U { x x ≥ 0 a x x < 0 \rm RReLU \left\{ \begin{array}{} x \quad x \ge 0…

Vue(6)

一.路由板块封装 &#xff08;1&#xff09;路由的封装抽离 目标&#xff1a;将路由板块抽离出来 好处&#xff1a;拆分板块&#xff0c;利于维护 // 路由的使用步骤 5 2 // 5个基础步骤 // 1. 下载 v3.6.5 // 2. 引入 // 3. 安装注册 Vue.use(Vue插件) // 4. 创建路由对象…

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

【东莞常平】戴尔R710服务器不开机维修分享

1&#xff1a;2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机&#xff0c;于是经老客户介绍找到我们。 2&#xff1a;服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3&#xff1a;客户反馈的故障问题为&#xff1a;…

Spring AI -使用Spring快速开发ChatGPT应用

前言 Spring在Java生态中一直占据大半江山。最近我发现Spring社区推出了一个Spring AI项目&#xff0c;目前该项目还属于Spring实验性项目&#xff0c;但是我们可以通过该项目&#xff0c;可以非常快速的开发出GPT对话应用。 本篇文章将会对SpringAI进行简单的介绍和使用&#…

经典排序算法复习----C语言

经典排序算法复习 分类 交换类 冒泡快排 分配类 计数排序基数排序 选择类 选择排序 堆排序 归并类 归并排序 插入类 直接插入排序 希尔排序 折半插入排序 冒泡排序 基于交换。每一轮找最大值放到数组尾部 //冒泡排序 void bubSort(int* arr,int size){bool sorte…

BFS解决拓扑排序(3题)

目录 拓扑排序 1.如何排序&#xff1f; 2.如何形成拓扑排序 3.如何建图 1.看数据稠密度 2. 根据算法流程灵活建图 1.课程表 2.课程表2 3.火星词典 拓扑排序 找到做事情的先后顺序&#xff0c;拓扑排序的结果可能不是唯一的 1.如何排序&#xff1f; 1.找出图中入度为…

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…

Unity项目接入xLua的一种流程

1. 导入xlua 首先导入xlua&#xff0c;这个不用多说 2. 编写C#和Lua交互脚本 基础版本&#xff0c;即xlua自带的版本 using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System; using System.IO;[Serializable] public…

四次挥手详解

文章目录 一、四次挥手各状态FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、双方同时调用close()&#xff0c;FIN_WAIT_1状态后进入CLOSING状态CLOSING状态 三、TIME_WAIT状态详解(1) TIME_WAIT状态下的2MSL是什么MSL &#xff08;报文最大生存时间&#xff09;为…

【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言 本文主要介绍我最近开发的一个个人实战项目&#xff0c;“基于深度学习的人脸门禁 IPC 智能安防监控系统”&#xff0c;全程满帧流畅运行。这个项目我目前全网搜了一圈&#xff0c;还没发现有相关类型的开源项目。这个项目只要稍微改进下&#xff0c;就可以变成市面上目前…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 创建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…