Mac OS X Programming读书笔记4 - Windows

Windows系统PyQt6安装与配置全攻略 PyQt6作为Python生态中主流的GUI开发框架,基于Qt库实现了跨平台的桌面应用开发能力。其核心原理是通过Python绑定Qt的C++库,使开发者能够用Python语言调用Qt丰富的界面组件和功能模块。在Windows平台下,PyQt6的安装涉及Python环境配置、依赖管理和虚拟环境使用等关键技术环节。通过pip或conda等包管理工具可以便捷地完成安装,同时配合Qt Designer等可视化工具能显著提升开发效率。PyQt6特别适合需要快速构建企业级桌面应用、数据可视化工具和跨平台解决方案的场景, 阅读详情

Chapter 4 Windows

1 Window Update

1.     可以调用ShowWindowHideWindow来显示/隐藏窗口。

2.     DrawString作用是在当前Graphics Pen位置显示字符串

3.     MoveTo移动当前Graphics Pen

Window绘图的时候发送Update事件:

EventTypeSpec windowEvent = { kEventClassWindow,

kEventWindowDrawContent };

 

下面代码安装一个Update事件处理函数:

EventTargetRef target;

 

EventHandlerUPP handlerUPP;

EventTypeSpec windowEvent = { kEventClassWindow,

       kEventWindowDrawContent };

 

target = GetWindowEventTarget( window );

handlerUPP = NewEventHandlerUPP( WindowEventHandler );

InstallEventHandler( target, handlerUPP, 1, &windowEvent,

       (void *)window, NULL );

 

Update事件处理函数可以这么写:

pascal OSStatus WindowEventHandler( EventHandlerCallRef handlerRef,

       EventRef event, void *userData)

{

       OSStatus result = eventNotHandledErr;

       UInt32 eventKind;

       WindowRef window;

       window = ( WindowRef )userData;

       eventKind = GetEventKind( event );

       if ( eventKind == kEventWindowDrawContent )

       {

              UpdateWindow( window );

       }

       return result;

}

 

UpdateWindow中必须首先调用SetPortWindowPort用来指定当前绘图所用的Port(这名字还真怪)。Port是用来定义一个绘图环境的(类似Windows中的设备上下文DC)。每个窗口都有一个Port。屏幕也被认为是一个Port。如果不调用SetPortWindowPort,程序的行为将无法预测。

void UpdateWindow( WindowRef window )

{

       SetPortWindowPort( window );

       // code to draw the contents of the window goes here

}

 

一个完整的UpdateWindow示例如下:

void UpdateWindow( WindowRef window )

{

       FMFontFamily fontFamily;

 

       SetPortWindowPort( window );

 

       fontFamily = FMGetFontFamilyFromName( "/pTimes" );

       TextFont( fontFamily );

       TextFace( bold + italic );

       TextSize( 24 );

       MoveTo( 30, 60 );

       DrawString( "/pThis is drawn from code!" );

}

 

/p表示字符串为一个Pascal String

2 Associating Information with Windows

Mac OS X中可以把数据和Window相关联起来,所调用的函数为SetWindowPropertyGetWindowProperty

SetWindowProperty的原型如下:

OSStatus SetWindowProperty( WindowRef window,

       PropertyCreator propertyCreator,

       PropertyTag propertyTag,

       UInt32 propertySize,

       void * propertyBuffer );

1.     PropertyCreate propertyCreatorApplicationSignature,四个Char组成。可以传0

2.     PropertyTag propertyTag:四个CharProperty的标记

3.     Uint32 propertySizeproperty的大小(字节数)

4.     Void *propertyBuffer:指向实际数据

GetWindowProperty的原型如下:

OSStatus GetWindowProperty( WindowRef window,

       PropertyCreator propertyCreator,

       PropertyTag propertyTag,

       UInt32 bufferSize,

       UInt32 * actualSize,

       void * propertyBuffer );

1.     PropertyCreate propertyCreatorApplicationSignature,四个Char组成。可以传0

2.     PropertyTag propertyTag:四个CharProperty的标记

3.     Uint32 propertySizeproperty的大小(字节数)

4.     Uint32 *actualSize:实际大小,可传NULL

5.     Void *propertyBuffer:指向实际数据

举例如下:

UInt32 windowNumber = 99;

WindowRef window;

UInt32 theNumber;

...

err = CreateWindowFromNib( nibRef, CFSTR("MainWindow"), &window );

...

// associate the data (99) in variable windowNumber with a window:

SetWindowProperty( window, 0, 'test', sizeof( UInt32 ),

       &windowNumber );

...

// retrieve the data (99) from the window and store it in theNumber:

GetWindowProperty( window, 0, 'test', sizeof( UInt32 ),

       NULL, &theNumber );

 

如何将Structurewindow相关联呢?

1.     定义下面这个Structure

typedef struct

{

       UInt32 number;

       Str255 string;

} WindowData, **WindowDataHandle;

 

2.     创建一个Handle,相当于分配一块内存,大小为sizeof(WindowData)

WindowDataHandle windDataHndl;

windDataHndl = ( WindowDataHandle )NewHandle( sizeof( WindowData ) );

 

3.     Handle所指向的数据赋值。注意WindowDataHandle是指针的指针(为什么是指针的指针呢?因为NewHandle创建的是一块可重定位的内存)

UInt32 theNumber = 5;

(**windDataHndl).number = theNumber;

 

Str255 theString = "/pCopyright (c) 2001"

numBytes = theString[0] + 1;

BlockMoveData( theString, (**windDataHndl).string, numBytes );

 

Str255本质上其实是一个数组,最多可以Hold255个字符。第一个元素是String大小(Pascal String正是这样),所以theString[0] + 1可以获得实际大小

4.     之后调用SetWindowProperty(我觉得这里似乎错了,应该是sizeof(WindowDataHandle),而不是sizeof(WindowData),待验证)

SetWindowProperty(window, 0, 'test', sizeof(WindowData),

       &windDataHndl);

 

5.     如果要获得Property,可以调用GetWindowProperty(我觉得这里似乎错了,应该是sizeof(WindowDataHandle),而不是sizeof(WindowData),待验证)

GetWindowProperty( window, 0, 'test', sizeof( WindowData ),

       NULL, &windDataHndl );

 

BTW,这本书我越看下去越觉得烂。。。。)

 
Mac系统Python版本升级与多版本管理指南 Python作为现代软件开发的核心语言,版本管理是开发者必须掌握的基础技能。在Mac系统上,由于系统自带的Python版本较旧且与系统功能深度耦合,安全升级Python需要特殊处理。通过包管理工具Homebrew或版本管理工具pyenv,开发者可以实现Python多版本共存与灵活切换,满足不同项目的环境需求。虚拟环境技术进一步隔离了项目依赖,解决了包冲突问题。这些方法不仅适用于Python开发,也是现代软件开发环境配置的通用实践,特别适合需要处理多版本兼容性的数据科学和Web开发场景。 阅读详情

相关推荐

Reddit网页爬虫实战:Requests+BeautifulSoup4稳定采集指南

Reddit作为全球最大的兴趣社区之一,其子版块(subreddit)蕴含海量真实用户讨论数据,是舆情分析、语义研究和竞品监测的重要来源。其数据获取本质依赖HTTP协议与HTML结构解析,核心原理在于模拟合法浏览器行为、绕过JavaScript渲染陷阱、精准提取嵌套评论树。技术价值体现在高稳定性、低资源消耗及对原始语义(如HTML标签、删帖标记、引用层级)的完整保留。典型应用场景包括学术语料构建、产品反馈挖掘与小规模商业分析。本文聚焦Scraping Reddit with Python and Beaut

weixin_30336061的博客 456

mac 隐藏窗口快捷键

mac 隐藏窗口快捷键

Lee_queenie的博客 2626

DeepSeek-V4终端编程助手:开源、本地化、可嵌入的AI副驾驶

终端(terminal)作为开发者工作流的神经中枢,承载着命令行编程(programming)、自动化运维与跨工具协同的核心任务。其本质是标准化输入输出的轻量交互界面,依赖语义理解、上下文感知与即时执行能力。DeepSeek-V4模型凭借对Shell语义的原生建模、可调节推理深度及Agent Skills技能链,在本地终端场景中实现高精度代码解释、安全命令生成与上下文感知修复。相比云端Copilot类工具,它支持llama.cpp/Ollama/vLLM等本地部署方案,具备断网可用、全程可审计、零GUI干扰

weixin_34082854的博客 436

优雅的在React组件中注册事件

前言 在React的开发中,我们经常需要在 window 上注册一些事件, 比如按下 Esc 关闭弹窗, 按上下键选中列表内容等等。比较常见的操作是在组件 mount 的时候去 window 上监听一个事件, 在组件 unmount 的时候停止监听事件。下面给大家介绍几个骚操作。 WindowEventHandler 我们创建一个 Win...

weixin_33958585的博客 667

Mac OS X Programming读书笔记3 - 事件处理

Chapter 3 Events and the Carbon Event Manager1 EventsCarbon Event Manager所支持的事件有两个属性:1.     Event Class,表示事件的类别,如鼠标消息:kEventClassMouse2.     Event Kind,事件的具体类型,如鼠标按键按下消息:kEventMouseDownkEven

张羿的CSDN专栏 3950

mac app开发之:利用NSWindowController实现窗口跳转

今天这篇博客主要讲述的是窗口之间的跳转,当然了相对于ios 页面之间跳转,还是觉得ios更可爱许多!一般在ios开发中我们都习惯于继承于系统的UIViewController自定义一个BaseViewController(名字是大家随便取的,根据个人爱好,请不要在意!),更方便于自己把公有的属性写在里面,同样在mac开发中也是如此,只不过我们继承的是系统的NSWindow来实现自定义窗口!话不多说

u012890071的专栏 1万+

macOS WindowsWindowController 教程

原文:Windows and WindowController Tutorial for macOS 作者:Warren Burton 译者:kmyhy 更新说明:本教程由 Warren Burton 升级至 Xcode 8 和 Swift 3。原文作者是 Gabriel Miro。Windows 是有 macOS app 的 UI “容器”。它定义了 app 当前管理着的、允许用户以多

kmyhy的专栏 6151

Mac OS开发—Xcode给Mac应用添加编辑快捷键(剪切 复制 粘贴 全选 删除 撤销 重做)功能

前言 笔者做Windows开发的,无奈公司有Mac OS的项目需要维护,之前没有编辑菜单的功能,需要笔者加上这个功能,笔者只能硬着头皮上。还好会c++,Mac应用里面一般都会用object-c 也可以和c++混着用,连猜带蒙,把这个功能实现。对于会的人很简单,不会的人难的很,所以笔者下面贴个图告诉怎么实现这个功能。笔者刚开始也是到处百度(连关键词都不知道搜啥),到处加群求帮,效果也不大。有一天,笔...

重庆李四 1141

电子书下载:Mac Programming for Absolute Beginners

Book DescriptionWant to learn how to program on your Mac? Not sure where to begin? Best-selling author Wallace Wang will explain how to get started with Cocoa, Objective-C, and Xcode. Whether you ar...

weixin_30919429的博客 108

rp++ find ROP sequences

https://github.com/0vercl0k/rp rp++ is a full-cpp written tool that aims to find ROP sequences in PE/Elf/Mach-O x86/x64 binaries. It is open-source and has been tested on several OS: Debian / Win

thesum的专栏 604

相关书集源码

长期更新...........语言asmintel 语法 windows版 x86/x64https://github.com/haidragon/modern-x86-assembly-language-programmingasm AT$T语法 x86https://github.com/bobblestiltskin/professional_assembly_language/tree/m...

weixin_33989058的博客 154

Quartus II 11.0完整安装与配置指南:从下载到硬件验证

FPGA(现场可编程门阵列)是一种可通过编程配置实现特定数字逻辑功能的半导体器件,其开发流程依赖于专用的EDA工具链。Quartus II作为Intel FPGA(原Altera)的官方集成开发环境,承担了从设计输入、综合、布局布线到编程下载的核心任务。对于维护基于Cyclone、Stratix等经典系列芯片的老旧项目,Quartus II 11.0版本因其轻量、稳定且功能完备而成为“黄金标准”。本文聚焦于该经典版本的获取与部署,详细解析了核心组件(如主程序与器件支持文件)的作用,并提供了涵盖Windows

weixin_30814329的博客 425

OpenClaw:首个可执行操作的AI数字打工人操作系统

AI智能体正从‘回答问题’迈向‘动手做事’,其核心在于能否打通操作系统级控制能力——即屏幕读取、鼠标模拟、键盘注入、应用调度与本地记忆。OpenClaw并非新大模型,而是轻量级AI智能体运行时环境,通过OS Bridge实现毫秒级GUI操控,借助Tool Orchestrator无缝调用任意命令行或脚本工具,并依托Memory-Augmented Planner实现任务经验持续沉淀。这种‘认知+执行’闭环技术,显著区别于传统聊天式AI,真正支撑起自动化办公、无障碍交互、家庭照护等强落地场景。本文详解其零门槛

weixin_30875157的博客 802
上一篇: MFC的模块状态:从AfxGetApp()和AFX_MANAGE_STATE()看MFC的模块状态
下一篇: 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
ATField
博客等级 码龄25年 673粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值