Python 中的高级斗技,让函数返回结果的技巧

MFC工具条按钮开发:从零手搓消息驱动与资源管理 在Windows桌面应用开发中,消息驱动机制与资源管理是构建交互界面的核心基础。其原理在于应用程序通过消息循环响应用户输入与系统事件,而资源(如图标、位图、字符串)则作为独立数据被封装与管理,实现界面与逻辑的分离。掌握这一机制的技术价值在于,开发者能深入理解Windows GUI程序的工作流程,构建出响应迅速、资源高效的应用程序。无论是传统的MFC桌面软件,还是需要精细控制UI元素的工具开发,这一基础都至关重要。本文聚焦于MFC框架下的工具条(Toolbar)控件,通过手动创建按钮、加载位图资源、绑定命令I 阅读详情

640?wx_fmt=jpeg

毫无疑问,函数是 Python 语言里最重要的概念之一。在编程时,我们将真实世界里的大问题分解为小问题,然后通过一个个函数交出答案。函数即是重复代码的克星,也是对抗代码复杂度的最佳武器。

如同大部分故事都会有结局,绝大多数函数也都是以返回结果作为结束。函数返回结果的手法,决定了调用它时的体验。所以,了解如何优雅的让函数返回结果,是编写好函数的必备知识。

Python 的函数返回方式

Python 函数通过调用 return 语句来返回结果。使用 returnvalue 可以返回单个值,用 returnvalue1,value2 则能让函数同时返回多个值。

如果一个函数体内没有任何 return 语句,那么这个函数的返回值默认为 None。除了通过 return 语句返回内容,在函数内还可以使用抛出异常(raise Exception)的方式来“返回结果”。

接下来,我将列举一些与函数返回相关的常用编程建议。

编程建议

1. 单个函数不要返回多种类型

Python 语言非常灵活,我们能用它轻松完成一些在其他语言里很难做到的事情。比如:让一个函数同时返回不同类型的结果。从而实现一种看起来非常实用的“多功能函数”。

就像下面这样:

def get_users(user_id=None):	
    if user_id is None:	
        return User.get(user_id)	
    else:	
        return User.filter(is_active=True)	
# 返回单个用户	
get_users(user_id=1)	
# 返回多个用户	
get_users()

当我们需要获取单个用户时,就传递 user_id 参数,否则就不传参数拿到所有活跃用户列表。一切都由一个函数 get_users 来搞定。这样的设计似乎很合理。

然而在函数的世界里,以编写具备“多功能”的瑞士军刀型函数为荣不是一件好事。这是因为好的函数一定是 “单一职责(Single responsibility)” 的。单一职责意味着一个函数只做好一件事,目的明确。这样的函数也更不容易在未来因为需求变更而被修改。

而返回多种类型的函数一定是违反“单一职责”原则的,好的函数应该总是提供稳定的返回值,把调用方的处理成本降到最低。像上面的例子,我们应该编写两个独立的函数 get_user_by_id(user_id)、 get_active_users()来替代。

2. 使用 partial 构造新函数

假设这么一个场景,在你的代码里有一个参数很多的函数 A,适用性很强。而另一个函数 B 则是完全通过调用 A 来完成工作,是一种类似快捷方式的存在。

比方在这个例子里, double 函数就是完全通过 multiply 来完成计算的:

def multiply(x, y):	
    return x * y	
def double(value):	
    # 返回另一个函数调用结果	
    return multiply(2, value)

对于上面这种场景,我们可以使用 functools 模块里的 partial() 函数来简化它。

partial(func,*args,**kwargs) 基于传入的函数与可变(位置/关键字)参数来构造一个新函数。所有对新函数的调用,都会在合并了当前调用参数与构造参数后,代理给原始函数处理。

利用 partial 函数,上面的 double 函数定义可以被修改为单行表达式,更简洁也更直接。

import functools	
double = functools.partial(multiply, 2)

建议阅读:partial 函数官方文档

3. 抛出异常,而不是返回结果与错误

我在前面提过,Python 里的函数可以返回多个值。基于这个能力,我们可以编写一类特殊的函数:同时返回结果与错误信息的函数。

def create_item(name):	
    if len(name) > MAX_LENGTH_OF_NAME:	
        return None, 'name of item is too long'	
    if len(CURRENT_ITEMS) > MAX_ITEMS_QUOTA:	
        return None, 'items is full'	
    return Item(name=name), ''	
def create_from_input():	
    name = input()	
    item, err_msg = create_item(name)	
    if err_msg:	
        print(f'create item failed: {err_msg}')	
    else:	
        print(f'item<{name}> created')

在示例中, create_item 函数的作用是创建新的 Item 对象。同时,为了在出错时给调用方提供错误详情,它利用了多返回值特性,把错误信息作为第二个结果返回。

乍看上去,这样的做法很自然。尤其是对那些有 Go 语言编程经验的人来说更是如此。但是在 Python 世界里,这并非解决此类问题的最佳办法。因为这种做法会增加调用方进行错误处理的成本,尤其是当很多函数都遵循这个规范而且存在多层调用时。

Python 具备完善的异常(Exception)机制,并且在某种程度上鼓励我们使用异常(官方文档关于 EAFP 的说明)。所以,使用异常来进行错误流程处理才是更地道的做法。

引入自定义异常后,上面的代码可以被改写成这样:

class CreateItemError(Exception):	
    """创建 Item 失败时抛出的异常"""	
def create_item(name):	
    """创建一个新的 Item	
    :raises: 当无法创建时抛出 CreateItemError	
    """	
    if len(name) > MAX_LENGTH_OF_NAME:	
        raise CreateItemError('name of item is too long')	
    if len(CURRENT_ITEMS) > MAX_ITEMS_QUOTA:	
        raise CreateItemError('items is full')	
    return Item(name=name)	
def create_for_input():	
    name = input()	
    try:	
        item = create_item(name)	
    except CreateItemError as e:	
        print(f'create item failed: {err_msg}')	
    else:	
        print(f'item<{name}> created')

使用“抛出异常”替代“返回 (结果, 错误信息)”后,整个错误流程处理乍看上去变化不大,但实际上有着非常多不同,一些细节:

  • 新版本函数拥有更稳定的返回值类型,它永远只会返回 Item 类型或是抛出异常

  • 虽然我在这里鼓励使用异常,但“异常”总是会无法避免的让人 感到惊讶,所以,最好在函数文档里说明可能抛出的异常类型

  • 异常不同于返回值,它在被捕获前会不断往调用栈上层汇报。所以 create_item 的一级调用方完全可以省略异常处理,交由上层处理。这个特点给了我们更多的灵活性,但同时也带来了更大的风险。

Hint:如何在编程语言里处理错误,是一个至今仍然存在争议的主题。比如像上面不推荐的多返回值方式,正是缺乏异常的 Go 语言中最核心的错误处理机制。另外,即使是异常机制本身,不同编程语言之间也存在着差别。

异常,或是不异常,都是由语言设计者进行多方取舍后的结果,更多时候不存在绝对性的优劣之分。但是,单就 Python 语言而言,使用异常来表达错误无疑是更符合 Python 哲学,更应该受到推崇的。

4. 谨慎使用 None 返回值

None 值通常被用来表示“某个应该存在但是缺失的东西”,它在 Python 里是独一无二的存在。很多编程语言里都有与 None 类似的设计,比如 JavaScript 里的 null、Go 里的 nil 等。因为 None 所拥有的独特 虚无 气质,它经常被作为函数返回值使用。

当我们使用 None 作为函数返回值时,通常是下面 3 种情况。

1. 作为操作类函数的默认返回值

当某个操作类函数不需要任何返回值时,通常就会返回 None。同时,None 也是不带任何 return 语句函数的默认返回值。

对于这种函数,使用 None 是没有任何问题的,标准库里的 list.append()、 os.chdir() 均属此类。

2. 作为某些“意料之中”的可能没有的值

有一些函数,它们的目的通常是去尝试性的做某件事情。视情况不同,最终可能有结果,也可能没有结果。而对调用方来说,“没有结果”完全是意料之中的事情。对这类函数来说,使用 None 作为“没结果”时的返回值也是合理的。

在 Python 标准库里,正则表达式模块 re 下的 re.search、 re.match 函数均属于此类,这两个函数在可以找到匹配结果时返回 re.Match 对象,找不到时则返回 None。

3. 作为调用失败时代表“错误结果”的值

有时, None 也会经常被我们用来作为函数调用失败时的默认返回值,比如下面这个函数:

def create_user_from_name(username):	
    """通过用户名创建一个 User 实例"""	
    if validate_username(username):	
        return User.from_username(username)	
    else:	
        return None	
user = create_user_from_name(username)	
if user:	
    user.do_something()

当 username 不合法时,函数 create_user_from_name 将会返回 None。但在这个场景下,这样做其实并不好。

不过你也许会觉得这个函数完全合情合理,甚至你会觉得它和我们提到的上一个“没有结果”时的用法非常相似。那么如何区分这两种不同情形呢?关键在于:函数签名(名称与参数)与 None 返回值之间是否存在一种“意料之中”的暗示。

让我解释一下,每当你让函数返回 None 值时,请仔细阅读函数名,然后问自己一个问题:假如我是该函数的使用者,从这个名字来看,“拿不到任何结果”是否是该函数名称含义里的一部分?

分别用这两个函数来举例:

  • re.search():从函数名来看, search,代表着从目标字符串里去搜索匹配结果,而搜索行为,一向是可能有也可能没有结果的,所以该函数适合返回 None

  • create_user_from_name():从函数名来看,代表基于一个名字来构建用户,并不能读出一种 可能返回、可能不返回的含义。所以不适合返回 None

对于那些不能从函数名里读出 None 值暗示的函数来说,有两种修改方式。第一种,如果你坚持使用 None 返回值,那么请修改函数的名称。比如可以将函数 create_user_from_name() 改名为 create_user_or_none()。

第二种方式则更常见的多:用抛出异常(raise Exception)来代替 None 返回值。因为,如果返回不了正常结果并非函数意义里的一部分,这就代表着函数出现了“意料以外的状况”,而这正是 Exceptions 异常 所掌管的领域。

使用异常改写后的例子:

class UnableToCreateUser(Exception):	
    """当无法创建用户时抛出"""	
def create_user_from_name(username):	
    ""通过用户名创建一个 User 实例"	
    :raises: 当无法创建用户时抛出 UnableToCreateUser	
    """	
    if validate_username(username):	
        return User.from_username(username)	
    else:	
        raise UnableToCreateUser(f'unable to create user from {username}')	
try:	
    user = create_user_from_name(username)	
except UnableToCreateUser:	
    # Error handling	
else:	
    user.do_something()

与 None 返回值相比,抛出异常除了拥有我们在上个场景提到的那些特点外,还有一个额外的优势:可以在异常信息里提供出现意料之外结果的原因,这是只返回一个 None 值做不到的。

5. 合理使用“空对象模式”

我在前面提到函数可以用 None 值或异常来返回错误结果,但这两种方式都有一个共同的缺点。那就是所有需要使用函数返回值的地方,都必须加上一个 if 或 try/except 防御语句,来判断结果是否正常。

让我们看一个可运行的完整示例:

import decimal	
class CreateAccountError(Exception):	
    """Unable to create a account error"""	
class Account:	
    """一个虚拟的银行账号"""	
    def __init__(self, username, balance):	
        self.username = username	
        self.balance = balance	
    @classmethod	
    def from_string(cls, s):	
        """从字符串初始化一个账号"""	
        try:	
            username, balance = s.split()	
            balance = decimal.Decimal(float(balance))	
        except ValueError:	
            raise CreateAccountError('input must follow pattern "{ACCOUNT_NAME} {BALANCE}"')	
        if balance < 0:	
            raise CreateAccountError('balance can not be negative')	
        return cls(username=username, balance=balance)	
def caculate_total_balance(accounts_data):	
    """计算所有账号的总余额	
    """	
    result = 0	
    for account_string in accounts_data:	
        try:	
            user = Account.from_string(account_string)	
        except CreateAccountError:	
            pass	
        else:	
            result += user.balance	
    return result	
accounts_data = [	
    'piglei 96.5',	
    'cotton 21',	
    'invalid_data',	
    'roland $invalid_balance',	
    'alfred -3',	
]	
print(caculate_total_balance(accounts_data))

在这个例子里,每当我们调用 Account.from_string 时,都必须使用 try/except 来捕获可能发生的异常。如果项目里需要调用很多次该函数,这部分工作就变得非常繁琐了。针对这种情况,可以使用“空对象模式(Null object pattern)”来改善这个控制流。

Martin Fowler 在他的经典著作《重构》 中用一个章节详细说明过这个模式。简单来说,就是使用一个符合正常结果接口的“空类型”来替代空值返回/抛出异常,以此来降低调用方处理结果的成本。

引入“空对象模式”后,上面的示例可以被修改成这样:

class Account:	
    # def __init__ 已省略... ...	
    @classmethod	
    def from_string(cls, s):	
        """从字符串初始化一个账号	
        :returns: 如果输入合法,返回 Account object,否则返回 NullAccount	
        """	
        try:	
            username, balance = s.split()	
            balance = decimal.Decimal(float(balance))	
        except ValueError:	
            return NullAccount()	
        if balance < 0:	
            return NullAccount()	
        return cls(username=username, balance=balance)	
class NullAccount:	
    username = ''	
    balance = 0	
    @classmethod	
    def from_string(cls, s):	
        raise NotImplementedError

在新版代码里,我定义了 NullAccount 这个新类型,用来作为 from_string 失败时的错误结果返回。这样修改后的最大变化体现在 caculate_total_balance 部分:

def caculate_total_balance(accounts_data):	
    """计算所有账号的总余额	
    """	
    return sum(Account.from_string(s).balance for s in accounts_data)

调整之后,调用方不必再显式使用 try 语句来处理错误,而是可以假设 Account.from_string 函数总是会返回一个合法的 Account 对象,从而大大简化整个计算逻辑。

Hint:在 Python 世界里,“空对象模式”并不少见,比如大名鼎鼎的 Django 框架里的 AnonymousUser 就是一个典型的 null object。

6. 使用生成器函数代替返回列表

在函数里返回列表特别常见,通常,我们会先初始化一个列表 results=[],然后在循环体内使用 results.append(item) 函数填充它,最后在函数的末尾返回。

对于这类模式,我们可以用生成器函数来简化它。粗暴点说,就是用 yielditem 替代 append 语句。使用生成器的函数通常更简洁、也更具通用性。

def foo_func(items):	
    for item in items:	
        # ... 处理 item 后直接使用 yield 返回	
        yield item

我在 系列第 4 篇文章“容器的门道” 里详细分析过这个模式,更多细节可以访问文章,搜索 “写扩展性更好的代码” 查看。

7. 限制递归的使用

当函数返回自身调用时,也就是 递归 发生时。递归是一种在特定场景下非常有用的编程技巧,但坏消息是:Python 语言对递归支持的非常有限。

这份“有限的支持”体现在很多方面。首先,Python 语言不支持“尾递归优化”。另外 Python 对最大递归层级数也有着严格的限制。

所以我建议:尽量少写递归。如果你想用递归解决问题,先想想它是不是能方便的用循环来替代。如果答案是肯定的,那么就用循环来改写吧。如果迫不得已,一定需要使用递归时,请考虑下面几个点:

  • 函数输入数据规模是否稳定,是否一定不会超过 sys.getrecursionlimit() 规定的最大层数限制

  • 是否可以通过使用类似 functools.lru_cache 的缓存工具函数来降低递归层数

总结

在这篇文章中,我虚拟了一些与 Python 函数返回有关的场景,并针对每个场景提供了我的优化建议。最后再总结一下要点:

  • 让函数拥有稳定的返回值,一个函数只做好一件事

  • 使用 functools.partial 定义快捷函数

  • 抛出异常也是返回结果的一种方式,使用它来替代返回错误信息

  • 函数是否适合返回 None,由函数签名的“含义”所决定

  • 使用“空对象模式”可以简化调用方的错误处理逻辑

  • 多使用生成器函数,尽量用循环替代递归

VC++ MFC类库中文手册实战指南 Microsoft Foundation Classes(MFC)是一套C++类库,为Windows应用程序提供了一个快速开发框架。本章将简要介绍MFC的来历、特点以及其对Windows编程产生的深远影响。CAPTION "我的对话框"FONT 8, "宋体"BEGINCONTROL "输入框",IDC_MYEDIT,EDIT,"",10,10,280,20CONTROL "按钮",IDC_MYBUTTON,BUTTON,"",110,50,50,25,BS_PUSHBUTTONEND。 阅读详情

相关推荐

从‘全步’到‘微步’:一张图看懂步进电机细分控制,选对模式让你的项目更丝滑

本文深入解析步进电机细分控制技术,从全步到微步的演进过程,帮助工程师根据项目需求选择最优控制模式。通过对比不同细分等级的性能特点和应用场景,提供3D打印、实验室自动化等领域的黄金配置方案,实现更精准、平稳的电机控制效果。

weixin_29290259的博客 471

Python 工匠:让函数返回结果的技巧

序言 这是 “Python 工匠”系列的第 5 篇文章。[查看系列所有文章] 毫无疑问,函数是 Python 语言里最重要的概念之一。在编程时,我们将真实世界里的大问题分解为小问题,然后通过一个个函数交出答案。函数即是重复代码的克星,也是对抗代码复杂度的最佳武器。 如同大部分故事都会有结局,绝大多数函数也都是以返回结果作为结束。函数返回结果的手法,决定了调用它时的体验。所以,了解如何优雅...

weixin_33994444的博客 319

DeepSeek研发的精算大模型「精卫」已实现98%精算任务覆盖,中国人寿采用后年节约3.2亿元技术采购成本,形成关键技术替代效应

根据现有资料,精算领域关键技术替代效应的行业标准定义尚未明确具体提及。然而,可以从相关文献中提取一些关键概念和方法来推导出可能的定义。​替代效应的基本定义​:替代效应是指一种商品价格变动引起另一种商品的相对价格变动,从而导致消费者在维持原有效用水平不变的条件下对商品需求量做出的调整。​技术替代效应​:在精算领域,技术替代效应可以理解为新技术或新方法对现有技术或方法的替代,从而影响精算模型、数据处理和决策过程。例如,机器学习在精算中的应用日益增长,改变了精算师的工作方式和模型构建方法。​。

百态·数智思维 | 聚焦大数据、量化与未来AI 1712

Python常见方法(6)-优雅地处理错误和异常

说明:本blog基于python3版本 文章目录前言第一种、try + except 格式处理第二种、try + except(具体异常) 格式处理第三种、try + except+else + finally 格式处理总结 前言 优雅地处理python的异常或错误是构建稳定程序的重要组成部分.本文主要介绍三种处理异常或错误的格式,方便应用和记忆. 比如我们写一个方法 make_float, 使输入值转化为浮点数并返回 代码如下 def make_float(x): return float(x)

dylan_young的博客 715

BQ4050开发进阶(二):Protections参数优化策略与实战解析

本文深入解析了BQ4050电池管理芯片中Protections参数的优化策略与实战方法。针对电压、电流、温度等核心保护功能,详细阐述了如何根据具体电芯特性、负载场景和环境因素,精细调整CUV、COV、OCC/OCD等阈值与延时,以在确保电池绝对安全的前提下,实现极致的用户体验与系统可靠性。

rgv234567的博客 480

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2977

python 实现多线程并返回函数返回值的三种方法

方法一:使用threading 在threading中,并没有实现返回值的方法,我们可以用数据库或者是全局变量来实现返回值的获取。这里使用的是全局变量。 def thread_function(age): for i in age: i += 1 q.put( { 'age': i ...

zxc的博客 2万+

2025年度工业级3D全景相机技术解析选型参考:国产品牌的技术突围与市场格局

本文分析了工业级3D相机在智慧城市和建筑数字化中的应用。通过对比国内外主流设备的技术参数和应用场景,发现国产品牌如众趣科技在性价比和本地化服务方面具有优势,尤其适合大型空间扫描项目;而国际品牌如Faro、Leica则在精度和可靠性上保持领先。建议根据项目需求(如测距范围、精度要求、预算)进行设备选型,综合考虑扫描效率、数据处理能力和系统兼容性。国产品牌已在国内大型基建项目中展现出竞争力,国际品牌则更适合高精度逆向工程和国际化项目。

gxdtgsy的博客 1072

python实用技巧——获取部分返回值的4种方式

喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! python的函数支持返回多个值。返回多个值时,默认以tuple的方式返回。 例如,下面两个函数的定义是完全等价的。 1 def f(): 2 return 1,2 3 4 def f(): 5 return (1,2) 如果将函数调用的返回值赋值给对应个数的变量,它会一一对应的赋...

lamehd的博客 1万+

CCD 技术介绍(基于innovus引擎CCOpt)

CCD:全称是,并行优化clock和data path。CCOpt:全称是Clock的timing分为两种模式,和。preCTS并没有clock,因此需要建立一个,从clock端口到寄存器CK端的来自sdc中的设置;postCTSupdateIO latency,clock就会自动的转换成propagatedclock,这时就是实际时钟互连线网络的delay。在实际设计中,clock起始于ideal。

m0_61003348的博客 8978

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。

weixin_29248313的博客 382

MFC常见面试问题(持续更新)

1)说说mfc中的类继承图的基本框架, 2)说说CView类的子类都有什么。 视图类(CView)的三个子类 CScrollView类提供视图的滚动显示;CEditView类支持在视图中的文本编辑操作;CHtmlView类支持在视图中显示和操作html文件。 3)DLL的三种调用形式。 DLL的概念 可以向程序提供一些函数、变量或 类 。 静态链接库

zxccaoya的博客 1万+

使用Matlab实现海洋监视雷达检测仿真

海洋监视雷达是一项重要的海洋探测技术,可以用于海上船只、飞机、潜艇等目标的探测和监视,具有广泛的应用价值。本篇文章将介绍如何使用Matlab进行海洋监视雷达的检测仿真,并提供相应的源代码。本篇文章提供了利用Matlab进行海洋监视雷达检测仿真的基本思路和代码实现。读者可以根据自己的需求进行修改和优化,以适应不同的应用场景。使用Matlab实现海洋监视雷达检测仿真。

2301_78484069的博客 448

深入解析MFC文档/视图架构:从核心原理到BCG界面集成实践

在桌面应用开发中,数据与界面分离是提升可维护性和扩展性的核心设计模式。其基本原理是将数据模型(文档)与用户界面(视图)解耦,通过控制器或模板进行协调,实现数据一致性管理和多视图同步。这种架构的技术价值在于支持复杂数据处理、灵活的多视图展示以及规范化的文件操作流程,广泛应用于需要处理结构化数据、支持多格式显示或具备文件持久化需求的桌面软件。MFC的文档/视图体系结构正是这一模式的经典实现,它通过CDocument、CView、CFrameWnd和CDocTemplate四大核心类,构建了Windows平台C+

weixin_34081595的博客 349

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

《MFC编程》:钩子函数

《MFC编程》:钩子函数

ProgramNovice的博客 995

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DIY一个MFC程序

前面剖析了MFC的基本框架: 1.通过定义一个CXXX(项目名)App类的全局对象theApp来启动应用程序(在进入WinMain函数之前)。        具体就是在定义theApp对象时自动调用了CXXXApp类的构造函数,同时根据C++继承的原理,调用前会先调用其基类CWinApp构造函数。这两个构造函数完成应用程序初始化工作,并把theApp对象递给pApp和pThread指针。

Drimoon 931

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【windows核心编程6】MFC入门框架知识详解

类名定位核心作用对应Win32概念CWinApp应用程序类基类管理程序生命周期、封装消息循环、程序入口WinMain函数 + 消息循环CFrameWnd框架窗口类基类封装窗口操作、承载UI元素、处理窗口消息窗口(HWND) +等API它们是MFC"面向对象封装Windows API"的核心体现,通过这两个类,开发者可以用更少的代码实现Win32程序的功能。核心执行流程程序启动 → 实例化全局CWinApp对象 → MFC调用InitInstance() →。

云小逸的博客 528

MFC第一天

要求: 1.连续性极强,不要缺课。 2.紧跟思路 3.营造良好的课堂气氛。 掌握的技能: 1.熟练使用断点调试程序。 2.学习使用CALL STACK查看函数的调用关系。 3.熟练使用各种向导。生成向导,类向导。 4.借助MSDN 课程大体安排: 1.MFC 框架原理和应用 2.COM--组件的编程原理和应用《超难》 3.SOCKET-套接字-WINDOWS平台下的网络编程

车晋强的专栏 604

01_MFC的HelloWorld

MFC:HelloWorld

成长需要沉淀。 777

实训课一vc++6.0做出一个简单的窗口

第一步: 打开VC++6.0,【文件】->【新建】,弹出下面窗口:选择【工程】【Win32 Application】,填上【工程名称】,选择【位置】,【确定】即可。 点【完成】,如下图: 点【确定】,如下图: 第二步: 【文件】,【新建】,【C/C++ Header File】,填好【名称】,【确定】,如下图: 在【game.h】头文件里写: #inc

幼发拉底 2万+

深入解析MFC核心架构与实战技巧:从消息机制到性能优化

Windows桌面开发中,消息驱动机制是图形界面应用程序的基础原理。通过封装Win32 API,MFC(Microsoft Foundation Classes)提供了一套面向对象的框架,将窗口、控件和消息处理抽象为C++类,显著提升了开发效率。其技术价值在于为需要与Windows系统深度集成、对执行效率有严格要求的企业级应用提供了稳定可靠的解决方案。在工业控制、传统设备上位机软件等应用场景中,MFC凭借其成熟的文档/视图架构和精细的资源管理能力,依然是维护和开发的关键技术。本文聚焦MFC的消息映射机制与多

weixin_34293246的博客 335

【MFC】一个最简单的MFC程序(9)

最简单的MFC程序

yixiaobo2001的博客 2146

TN25 文档,视图和框架之创建

此技术点讲述了创建和所属权问题——对于WinApp(程序对象),DocTemplates(文档模板)Documents,

云中客 435

MFC学习笔记——基础

一 MFC应用程序 1. MFC 的控制台程序 1.1 包含afx系列的头文件 1.2 CWinApp theApp - MFC的应用程序类,封装了应用程序的启动过程。 1.3 AfxWinInit - MFC初始化函数,将应用程序的信息初始化。 2. MFC 的动态库和静态库 2.1 静态库—— 增加了MFC的支持 2.2 动态库 2.2.1 MFC规则DLL 使用MFC静

biluolunhui的专栏 744

MFC项目的创建方式的区别

MFC(Microsoft Foundation Classes)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数,它是一个Windows图形界面开发的框架。相比于Win32,它使用起来更加方便和灵活,并且对Win32的类库进行了封装,我们在MFC项目中也可以使用Win32 的API函数。 MFC项目类的继承 下面我们就介绍一些关于MFC项目的创建: 创建MFC项目有五肿模板: 1、单文档(SDI) 这个创建方式包含继承CWinApp、CFrameWn

qq_43812868的博客 679
上一篇: 太好玩了,我用Python写了个火影忍者版的连连看
下一篇: 我是如何通过开源项目月入 10 万的?
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值