Win32++:可替代MFC的Windows桌面应用开发框架
写在前面
有过Win32编程经验的朋友都知道,使用Windows提供的API开发桌面应用是相当繁琐的,创建一个功能简单能接收并处理消息的窗口至少也得几百行代码。创建一个可视化的窗口一般要以下几个步骤:
- 第一步:定义入口函数WinMain
- 第二步:注册窗口类,在这一步你可以指定窗口类的菜单、光标、窗口过程函数等属性。
- 第三步:定义窗口过程函数。
- 第四步:创建窗口、显示窗口、更新窗口。
- 第五步:消息循环。
虽然这些步骤向导会为我们完成,但是由于windows系统是基于消息的,而且消息种类繁多,我们不得不通过大量的switch…case语句对不同的消息进行处理。
为了方便程序员编写Windows应用,微软提供了一套基类库,简称MFC,使用MFC框架结合强大的集成开发工具Visual Studio,大大的简化了Windows桌面应用开发的难度。MFC对Windows API做了较深层次的封装,导致部分程序员对MFC的理解仅仅局限于工具的使用,他们只知道如何使用向导创建项目,如何使用向导添加一个消息处理函数,对MFC的消息映射、动态创建、文档视图结构等完全不了解。MFC目前在处于绝对垄断的地位,市面上绝大多数windows应用都使用MFC编写,Windows桌面应用开发第三方框架也比较少,其中Win32++是非常不错的一款。
使用Win32++优势
官网中提到,对于专业的开发人员来说,MFC无疑是最好的程序库,而且有微软这样强大的后盾。win32++面向的则是想使用更接近底层API编程方式的用户,对与想学习Win32 API的封装技巧以及Windows应用工作原理的新手来说,win32++也是不错的选择。
对于新手来说Win32++有以下几方面的优势:
Win32++入门较为简单,MFC试图使用向导自动生成一些代码并且使用宏来隐藏一些复杂的操作,对于经验丰富的程序员来说效率非常高,但是对于新手来说他们对这些生成的代码并不能够理解,这并不是什么好事情。
这套库本身是对Win32 API做了轻量级的封装,提供源码,代码相当整洁,而MFC显得过于庞大。
我们无需过多学习就可以使用这套库,而MFC的学习难度远远大于Win32++.
除了Visual Studio,Win32++可以使用免费的编译器编译。MFC依赖于Visual Studio,而且Visual Studio不便宜,从节省开发成本的角度考虑,Win32++也是不错的选择。Win32++集成开发工具可使用开源的Code::Blocks或Dev-C++等。
Win32++下载与使用
win32++官方网站:http://win32-framework.sourceforge.net/
下载地址:http://sourceforge.net/projects/win32-framework/
下载后解压,进入include目录,如下图所示,这便是Win32++框架的全部,相关类的声明和定义都写在头文件中,源码阅读起来较为方便,使用起来也比较方便,无需编译成lib文件,项目中直接引入这些头文件即可。
创建对话框应用
1.新建Win32应用,在stdafx.h引入win32++头文件。
2.创建对话框资源ID为IDD_DIALOG1 ,添加相应控件,如下图所示。
3.编写程序代码。
// main.cpp
#include "stdafx.h"
#include "resource.h"
// 定义CMyDialog对话框类
class CMyDialog : public CDialog
{
public:
CMyDialog(UINT nResID);
virtual ~CMyDialog();
protected:
virtual void OnDestroy();
virtual BOOL OnInitDialog();
virtual INT_PTR DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
virtual void OnOK();
private:
void OnButton();
HMODULE m_hInstRichEdit;
};
class CDialogApp : public CWinApp
{
public:
CDialogApp();
virtual ~CDialogApp();
virtual BOOL InitInstance();
CMyDialog* GetDialog() {return &m_MyDialog;}
private:
CMyDialog m_MyDialog;
};
inline CDialogApp* GetDialogApp() { return static_cast<CDialogApp*>(GetApp()); }
CDialogApp::CDialogApp() : m_MyDialog(IDD_DIALOG1)
{
}
BOOL CDialogApp::InitInstance()
{
//显示模态对话框
m_MyDialog.DoModal();
return TRUE;
}
CDialogApp::~CDialogApp()
{
}
CMyDialog::CMyDialog(UINT nResID) : CDialog(nResID)
{
m_hInstRichEdit = ::LoadLibrary(_T("RICHED32.DLL"));
if (!m_hInstRichEdit)
::MessageBox(NULL, _T("CMyDialog::CRichView Failed to load RICHED32.DLL"), _T(""), MB_ICONWARNING);
}
CMyDialog::~CMyDialog()
{
::FreeLibrary(m_hInstRichEdit);
}
void CMyDialog::OnDestroy()
{
// 退出应用程序
::PostQuitMessage(0);
}
INT_PTR CMyDialog::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DialogProcDefault(uMsg, wParam, lParam);
}
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (LOWORD(wParam))
{
case IDC_BUTTON1: OnButton(); return TRUE;
}
return FALSE;
}
BOOL CMyDialog::OnInitDialog()
{
// 设置图标
SetIconLarge(IDW_MAIN);
SetIconSmall(IDW_MAIN);
// 在Listbox中添加数据
for (int i = 0 ; i < 8 ; i++)
SendDlgItemMessage(IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) _T("List Box"));
return true;
}
void CMyDialog::OnOK()
{
MessageBox(_T("OK Button Pressed. Program will exit now."), _T("Button"), MB_OK);
CDialog::OnOK();
}
void CMyDialog::OnButton()
{
SetDlgItemText(IDC_STATIC3, _T("Button Pressed"));
TRACE("Button Pressed\n");
}
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
// 启动Win32++
CDialogApp theApp;
// 运行应用程序
return theApp.Run();
}
// 捕捉异常
catch (std::exception &e)
{
// 打印异常信息
e.what();
return -1;
}
}
Win32++大多数类都和MFC重名,这样我们就不需要花时间去记忆这些类名。这里我们自己定义了两个类CMyDialog和CDialogApp分别从CDialog和CWinApp继承。
在CMyDialog类中重写父类的OnInitDialog和OnCommand函数,这两个函数都是虚函数,OnInitDialog用于完成对话框的初始化工作,例如在文本框中增加文字、在ListBox中添加一些数据等操作,OnCommand函数则是用于处理对话框消息,在本例中我们將ID为IDC_BUTTON1的案例的消息交由CMyDialog类的成员函数OnButton处理。
CDialogApp中定义了CMyDialog类型成员变量m_MyDialog。
CDialogApp::CDialogApp() : m_MyDialog(IDD_DIALOG1)
{
}
CDialogApp构造函数中,为m_MyDialog成员变量指定对话框资源ID为IDD_DIALOG1,在CDialogApp类的对象构造时同时也会初始化m_MyDialog对象。
BOOL CDialogApp::InitInstance()
{
//显示模态对话框
m_MyDialog.DoModal();
return TRUE;
}
CDialogApp类重写了父类的InitInstance函数,并在InitInstance函数中调用m_MyDialog的DoModal函数显示模态对话框。
int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
// 启动Win32++
CDialogApp theApp;
// 运行应用程序
return theApp.Run();
}
// 捕捉异常
catch (std::exception &e)
{
// 打印异常信息
e.what();
return -1;
}
}
在入口函数WinMain中定义CDialogApp 对象theApp,调用父类的Run函数运行程序。
编译运行
效果如下:
Win32++:可替代MFC的Windows桌面应用开发框架的更多相关文章
- API、Win32 SDK、Win32项目、MFC、Windows窗体应用程序的区别
[原]API.Win32 SDK.Win32项目.MFC.Windows窗体应用程序的区别 首先来看一下每一个术语的定义: API:Application Programming Interface. ...
- 0x01 译文:Windows桌面应用Win32开发简介
本节课将简单介绍下使用C++开发Windows桌面应用的一些基础知识 目录: 准备你的开发环境 Windows 代码规范 操作字符串 什么是一个Window? WinMain:程序的入口点 1. 准备 ...
- 工作自动化,替代手工操作,使用python操作MFC、windows程序
目录 背景--为什么要自动化操作? 方法--怎么实现自动化操作? 查找窗体 发送消息 获取文本 总结 背景--为什么要自动化操作? 工作中总是遇到反复重复性的工作?怎么用程序把它变成自动化操作?将程序 ...
- 0x00 译文:Windows桌面应用入门选择
当你想要创建一个新的桌面应用的时候,第一个你需要做的决定是使用Win32 和COM 还是使用.NET两个选项. C++ 和 Win32 使你“离奖牌更近”,并使你可以获得最佳的应用性能..NET 使你 ...
- WIN32 API ------ 最简单的Windows窗口封装类
1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C+ ...
- Win32 DLL和MFC DLL 中封装对话框
现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题.这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题. ...
- Visual C++ Windows 桌面应用程序样例(摘抄)
//================================== //Windows应用程序框架结构(例子) //参考:<Visual C++宝典>陈国建等编著 //======= ...
- 对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- Python基础系列讲解-自动控制windows桌面
原链接:https://zhuanlan.zhihu.com/p/73001806 在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程 ...
随机推荐
- Darwin流媒体server在windows下搭建
简单介绍 主页: http://dss.macosforge.org/ Darwin Streaming Server (DSS) is an open sourceproject intende ...
- 棋盘覆盖问题python3实现
在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖全部棋盘上的其余全部方格,不能重叠. 代码例如以下: def chess(tr,tc,pr,pc,size): globa ...
- httputil用http获取请求的工具类
package com.xiaocan.demo.util; import java.io.IOException; import java.io.InputStream; import java.u ...
- Java Servlet 3.0 新特性
Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...
- [原创]微信小程序 实现 圆环 百分百效果
1.最终效果 2.技术点:a. css3 clip-path , b.根据角度和直边计算另一个直边的长度 3.实现思路: a.3个层(灰色圆形层, 红色圆形层,白色圆形层) ,其中灰色和红色层大小一 ...
- php创建图像具体步骤
php 的图像处理在验证码是最常见的,下面说下使用php创建图像的具体步骤. 简要说明:PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG(推荐), JPEG, WBM ...
- iOS开发——GCD总结
Grand Central Dispatch,简称GCD,在异步执行任务的技术之一. 一般将应用程序中记述的线程管理用的代码在系统级中实现,开发者只需要定义想执行的任务并追加到适当的Dispatch ...
- HDU-2222 Keywords Search 字符串问题 AC自动机
题目链接:https://cn.vjudge.net/problem/HDU-2222 题意 给一些关键词,和一个待查询的字符串 问这个字符串里包含多少种关键词 思路 AC自动机模版题咯 注意一般情况 ...
- 【Tool】Linux下的Spark安装及使用
1. 确保自己的电脑安装了JAVA Development Kit JDK, 用来编译Java应用, 如 Apache Ant, Apache Maven, Eclipse. 这里是我们安装Spark ...
- SCIP,Clp,Gurobi和Cplex安装
SCIP安装 1.在自己的家目录下建立目录scip,并将获得的压缩包考入该文件夹并解压缩 tar -zxvf scipoptsuite-5.0.0.tgz 2.进入目录scipoptsuite-5.0 ...