当前位置: 首页 > news >正文

win32汇编环境下,窗口程序中生成listview列表控件及显示

 ;运行效果

;抄下面源码在radasm里面,可以直接编译运行。重要部分加了备注。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        gdi32.inc
includelib    gdi32.lib
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib

include         comctl32.inc      ;加入这个
includelib      comctl32.lib      ;加入这个
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?

hInstance    dd        ?
hWinMain    dd        ?

h_List          dd              ?

        .const
szClassName    db    'MyClass',0
szCaptionMain    db    'win32汇编环境窗口程序中生成listview列表控件示例',0
szText        db    'Win32 Assembly, Simple and powerful !',0

szlistViewClassName                   db        "SysListView32",0 ;加这个

Heading1          db        "序号",0   ;第1列名称
Heading2          db        "姓名",0   ;第1列名称
Heading3          db        "性别",0 

Heading2_1        db        "张三",0   ;第2列第1行字符串
Heading2_2        db        "李四",0   ;第2列第2行字符串 
Heading2_3        db        "王五",0

Heading3_1        db        "男",0 
Heading3_2        db        "女",0
Heading3_3        db        "男",0 

                 .data
sztemplate        db        "%d",0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
RGB macro red,green,blue ;颜色宏,让listview列表控件好看点
  xor eax,eax 
  mov ah,blue 
  shl eax,8 
  mov ah,green 
  mov al,red 
endm 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowListViewInfo proc             ;显示列表视图里的每项信息
    LOCAL lvItem:LV_ITEM
    LOCAL @buffer[10]:byte
    
    ;以下填充第1行的内容
    mov lvItem.imask,LVIF_TEXT    
    mov lvItem.iItem, 0      ;0为第1列,从0开始计算
    mov lvItem.iSubItem, 0   ;0为第1行
    invoke wsprintf,addr @buffer, addr sztemplate,1      ;格式化第1列第1行要显示的字符串
    lea eax, @buffer
    mov lvItem.pszText, eax
    mov lvItem.cchTextMax, sizeof Heading1
    invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
        
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,1
    lea eax,offset Heading2_1
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
  
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,2
    lea eax,offset Heading3_1
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
  
    ;以下填充第2行的内容
    mov lvItem.iItem, 1
    mov lvItem.iSubItem, 0  
    invoke wsprintf,addr @buffer, addr sztemplate,2      ;第1列第2行字符串
    lea eax, @buffer
    mov lvItem.pszText, eax
    invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
    
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,1
    lea eax,offset Heading2_2
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
  
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,2
    lea eax,offset Heading3_2
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
    
    ;以下填充第3行的内容
    mov lvItem.iItem, 2
    mov lvItem.iSubItem, 0
    invoke wsprintf,addr @buffer, addr sztemplate,3      ;第1列第3行字符串
    lea eax, @buffer
    mov lvItem.pszText, eax
    invoke SendMessage, h_List, LVM_INSERTITEM, 0, addr lvItem
    
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,1
    lea eax,offset Heading2_3
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
  
    mov lvItem.imask,LVIF_TEXT  
    mov lvItem.iSubItem,2
    lea eax,offset Heading3_3
    mov lvItem.pszText,eax 
    invoke SendMessage,h_List, LVM_SETITEM,0, addr lvItem
   
  ret 
_ShowListViewInfo endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_List_InsertColumn proc                                       ;插入列数及名称的函数
  LOCAL lvc:LV_COLUMN 

  mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  mov lvc.pszText,offset Heading1  ;列表名
  mov lvc.lx,200     ;宽度
  invoke SendMessage,h_List, LVM_INSERTCOLUMN, 0, addr lvc
  
  or lvc.imask,LVCF_FMT
  mov lvc.fmt,LVCFMT_LEFT
  mov lvc.pszText,offset Heading2 
  mov lvc.lx,200
  invoke SendMessage,h_List, LVM_INSERTCOLUMN, 1 ,addr lvc 
  
  mov lvc.pszText,offset Heading3
  mov lvc.lx,200
  invoke SendMessage,h_List, LVM_INSERTCOLUMN, 2 ,addr lvc 
   
  ret 
_List_InsertColumn endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam
        local    @stPs:PAINTSTRUCT
        local    @stRect:RECT
        local    @hDc
        
        LOCAL   @DEFAULT_GUI_FONT,@OLD_DEFAULT_GUI_FONT   ;加入这个

        mov    eax,uMsg
;********************************************************************
        .if    eax ==    WM_PAINT
            invoke    BeginPaint,hWnd,addr @stPs

            invoke    EndPaint,hWnd,addr @stPs
        .elseif    eax ==    WM_CREATE
            mov    eax,hWnd
            mov    hWinMain,eax
            
                        invoke  GetStockObject,DEFAULT_GUI_FONT   
                        mov @DEFAULT_GUI_FONT,eax 
                   invoke  CreateWindowEx, NULL, addr szlistViewClassName, NULL, LVS_REPORT or WS_CHILD or WS_VISIBLE, \                           ;名单列表视图
                           0,0,0,0,hWnd, NULL, hInstance, NULL 
                        mov     h_List, eax 
                        mov     eax,LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_SUBITEMIMAGES    ;设置ListView全行选择,网格等样式.
                        invoke  SendMessage,h_List,LVM_SETEXTENDEDLISTVIEWSTYLE,0,eax
                        invoke  ImageList_Create,0,32,ILC_COLORDDB or ILC_MASK,0,0                      ;调整ImageList高,就可调整listView行高
                        invoke  SendMessage,h_List,LVM_SETIMAGELIST,LVSIL_SMALL,eax            
                        invoke  SendMessage,h_List,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE
                        
                        RGB 0,0,0 
                        invoke  SendMessage,h_List,LVM_SETTEXTCOLOR,0,eax    ;设置文本颜色
                        RGB 131,175,155
                        invoke  SendMessage,h_List,LVM_SETBKCOLOR,0,eax      ;设置背景颜色
                        RGB 131,175,155
                        invoke  SendMessage,h_List,LVM_SETTEXTBKCOLOR,0,eax  ;设置文本背景颜色
                        
                        invoke    MoveWindow,h_List,0,0,600,350,TRUE           ;调整列表视图的位置才能显示出来
                        invoke  _List_InsertColumn                           ;调用初始化ListView控件的函数 
                        invoke  _ShowListViewInfo                            ;调用显示列表视图内容的函数
;********************************************************************
        .elseif    eax ==    WM_CLOSE
            invoke    DestroyWindow,hWinMain
            invoke    PostQuitMessage,NULL
;********************************************************************
        .else
            invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
        .endif
;********************************************************************
        xor    eax,eax
        ret

_ProcWinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain    proc
        local    @stWndClass:WNDCLASSEX
        local    @stMsg:MSG
        
                invoke    InitCommonControls     ;加上这句
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;********************************************************************
; 注册窗口类
;********************************************************************
        invoke    LoadCursor,0,IDC_ARROW
        mov    @stWndClass.hCursor,eax
        push    hInstance
        pop    @stWndClass.hInstance
        mov    @stWndClass.cbSize,sizeof WNDCLASSEX
        mov    @stWndClass.style,CS_HREDRAW or CS_VREDRAW
        mov    @stWndClass.lpfnWndProc,offset _ProcWinMain
        mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1
        mov    @stWndClass.lpszClassName,offset szClassName
        invoke    RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
        invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
            WS_OVERLAPPEDWINDOW,\
            100,100,620,390,\
            NULL,NULL,hInstance,NULL
        mov    hWinMain,eax
        invoke    ShowWindow,hWinMain,SW_SHOWNORMAL
        invoke    UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
        .while    TRUE
            invoke    GetMessage,addr @stMsg,NULL,0,0
            .break    .if eax    == 0
            invoke    TranslateMessage,addr @stMsg
            invoke    DispatchMessage,addr @stMsg
        .endw
        ret_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        call    _WinMain
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
 

相关文章:

win32汇编环境下,窗口程序中生成listview列表控件及显示

;运行效果 ;抄下面源码在radasm里面,可以直接编译运行。重要部分加了备注。 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&…...

运维之网络安全抓包—— WireShark 和 tcpdump

为什么要抓包?何为抓包? 抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。为什么要抓包?因为在处理 IP网络…...

【复刻】数字化转型是否赋能企业新质生产力发展?(2015-2023年)

参照赵国庆(2024)的做法,对来自产业经济评论《企业数字化转型是否赋能企业新质生产力发展——基于中国上市企业的微观证据》一文中的基准回归部分进行复刻基于2015-2023年中国A股上市公司数据,实证分析企业数字化转型对新质生产力…...

【数据仓库】spark大数据处理框架

文章目录 概述架构spark 架构角色下载安装启动pyspark启动spark-sehll启动spark-sqlspark-submit经验 概述 Spark是一个性能优异的集群计算框架,广泛应用于大数据领域。类似Hadoop,但对Hadoop做了优化,计算任务的中间结果可以存储在内存中&a…...

2 秒杀系统架构

第一步 思考面临的问题和业务场景 秒杀系统面临的问题: 短时间内并发非常高,如果按照秒杀的并发做相应的承载会造成大量资源的浪费。第二解决超卖的问题。 第二步 思考目前的处境和解决方案 因为秒杀系统属于短时间内的高并发问题,我们不可能使用那么…...

UNI-APP_i18n国际化引入

官方文档:https://uniapp.dcloud.net.cn/tutorial/i18n.html vue2中使用 1. 新建文件 locale/index.js import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from ./zh-Hant.json const messages {en,zh-Hans: zhHans,zh-Hant: zhHant }…...

【详解】AndroidWebView的加载超时处理

Android WebView的加载超时处理 在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页。然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题。为了提升用户体验,我们需要对WebView的加载超时…...

RedisDesktopManager新版本不再支持SSH连接远程redis后

背景 RedisDesktopManager(又名RDM)是一个用于Windows、Linux和MacOS的快速开源Redis数据库管理应用程序。这几天从新下载RedisDesktopManager最新版本,结果发现新版本开始不支持SSH连接远程redis了。 解决方案 第一种 根据网上有效的信息,可以回退版…...

开源 SOAP over UDP

简介 看到有人想要实现两个 EXE 之间的互动。这可以采用 RPC 的方式嘛。 Delphi 现成的 RPC 框架,比如 WebService,比如 DataSnap; 当然,github 上面还有第三方开源的 XMLRPC 等等。 为啥要搞一个 UDP Delphi 的 WebService …...

Levenshtein 距离的原理与应用

引言 在文本处理和自然语言处理(NLP)中,衡量两个字符串相似度是一项重要任务。Levenshtein 距离(也称编辑距离)是一种常见的算法,用于计算将一个字符串转换为另一个字符串所需的最少编辑操作次数。这些操作…...

解决json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

前言 作者在读取json文件的时候出现上述报错,起初以为是自己json文件有问题,但借助在线工具查看后发现没问题,就卡住了,在debug的过程中发现了json文件读取的一个小坑,在此分享一下 解决过程 原代码 with open(anno…...

hive中的四种排序类型

1、Order by 全局排序 ASC(ascend): 升序(默认) DESC(descend): 降序 注意 :只有一个 Reducer,即使我们在设置set reducer的数量为多个,但是在执行了order by语句之后,当前此次的运算还是只有…...

Spring-AI讲解

Spring-AI langchain(python) langchain4j 官网: https://spring.io/projects/spring-ai#learn 整合chatgpt 前置准备 open-ai-key: https://api.xty.app/register?affPuZD https://xiaoai.plus/ https://eylink.cn/ 或者淘宝搜: open ai key魔法…...

【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0

从你提供的 nslookup 输出看,DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0,这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因: 可能的原因和解决方法 本地 DNS 问题: 有可能是你的本…...

HTML——29. 音频引入二

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>音频引入</title></head><body><!--audio:在网页中引入音频IE8以及之前版本不支持属性名和属性值一样&#xff0c;可以只写属性名src属性:指定音频文件…...

代码随想录训练营第三十四天| 62.不同路径 63. 不同路径 II

62.不同路径 题目链接&#xff1a;62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 讲解链接&#xff1a;代码随想录 动态规划五步走 1 定义dp数组是到dp[i][j]时有dp[i][j]条路径 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xf…...

V90伺服PN版组态配置<一>

1、添加PLC之后&#xff0c;继续博图中网络视图中添加新设备&#xff0c;添加伺服驱动器组态设备 2、SINAMICS V90 PN V1.0 3、修改驱动器的IP地址。 【注意】 在项目中提前做好项目规划&#xff0c;如PLC设备从192.168.0.1开始&#xff0c;顺序递增------个位数都是CPU设备…...

又一年。。。。。。

2024&#xff0c;浑浑噩噩的一年。 除了100以内的加减法&#xff08;数据&#xff0c;数据&#xff0c;还是数据。。。。。。&#xff09;&#xff0c;似乎没做些什么。 脸盲症越来越重的&#xff0c;怕是哪天连自己都不认得自己的了。 看到什么&#xff0c;听到什…...

xterm + vue3 + websocket 终端界面

xterm.js 下载插件 // xterm npm install --save xterm// xterm-addon-fit 使终端适应包含元素 npm install --save xterm-addon-fit// xterm-addon-attach 通过websocket附加到运行中的服务器进程 npm install --save xterm-addon-attach <template><div :…...

医疗数仓业务数据采集与同步

业务数据采集与同步 业务采集组件配置业务数据同步概述数据同步策略选择数据同步工具概述1.1.4 全量表数据同步DataX配置文件生成全量表数据同步脚本增量表数据同步 MySQL - Maxwell - Kafka - Flume - HDFSMaxwell配置增量表首日全量同步 业务采集组件配置 Maxwell将业务采集到…...

抖音视频批量下载工具终极指南:3分钟实现高效无水印下载

抖音视频批量下载工具终极指南&#xff1a;3分钟实现高效无水印下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...

从芯片手册到PCB:手把手教你用TPS5430搞定24V转15V电源(附完整BOM清单)

从芯片手册到PCB&#xff1a;手把手教你用TPS5430搞定24V转15V电源&#xff08;附完整BOM清单&#xff09; 在硬件设计领域&#xff0c;电源模块的设计往往是最基础却也最考验工程师功底的环节。一个优秀的电源设计不仅需要满足电压转换的基本需求&#xff0c;还要兼顾效率、稳…...

某供应链企业200GB数据泄露复盘:如果开了透明加密,攻击者拿走的只有乱码

图&#xff1a;供应链企业数据泄露的3条典型路径&#xff08;U盘导出/数据库导出/截图&#xff09;与TDE透明加密的拦截机制事件还原&#xff1a;一次"完美"的内部数据窃取说明&#xff1a;以下事件基于多起真实安全事件综合脱敏处理&#xff0c;技术细节均为真实攻击…...

喜马拉雅音频下载神器:告别网络限制,随时随地畅听付费内容

喜马拉雅音频下载神器&#xff1a;告别网络限制&#xff0c;随时随地畅听付费内容 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 …...

基于ARM核心板的T-BOX系统设计:从硬件选型到软件实现

1. 项目概述与核心价值最近几年&#xff0c;车联网的概念已经从实验室和展会&#xff0c;实实在在地走进了我们的日常生活。作为一名在嵌入式领域摸爬滚打了十几年的工程师&#xff0c;我亲眼见证了从简单的GPS定位模块&#xff0c;到如今功能高度集成的车载T-BOX&#xff08;T…...

别再只用ROC了!用R语言ggplot2为你的Logistic回归模型画个校准曲线(附完整代码)

超越ROC&#xff1a;用R语言打造兼具诊断力与美学的Logistic回归校准曲线 当我们在医学统计或信用评分领域构建预测模型时&#xff0c;常常陷入一个认知陷阱——过度依赖ROC曲线和AUC值作为模型评估的唯一标准。这种单一视角可能掩盖了预测模型中更本质的问题&#xff1a;当模型…...

CTF新手必看:用Python脚本搞定RSA常见攻击(附实战代码)

CTF密码学实战&#xff1a;Python脚本破解RSA五大攻击场景 在CTF竞赛中&#xff0c;RSA加密系统是最常见的密码学挑战之一。本文将带你深入实战&#xff0c;通过Python代码复现五种经典RSA攻击场景&#xff0c;从基础分解到高级数学技巧&#xff0c;每个案例都配有可直接运行的…...

iOS 27 Siri 自动删除聊天记录:深度解析与行业启示

上周同事跟我吐槽&#xff0c;说他跟Siri聊了点私事&#xff0c;换手机时发现聊天记录全在iCloud里躺着。我跟他说&#xff0c;等iOS 27吧&#xff0c;Siri终于要加自动删除功能了。这个功能不算革命性创新&#xff0c;但方向是对的。下面从用户价值、技术实现和行业影响三个维…...

死信队列与补偿作业

Skeyevss FAQ&#xff1a;死信队列与补偿作业 试用安装包下载 | SMS | 在线演示 项目地址&#xff1a;https://github.com/openskeye/go-vss 1. 什么是死信&#xff08;DLQ&#xff09; 消息在 最大重试次数 后仍失败&#xff0c;进入 死信队列 或 失败表&#xff0c;避免无…...

FPGA实战:I2C总线Verilog状态机设计与调试全解析

1. I2C总线协议基础与实战意义 I2C&#xff08;Inter-Integrated Circuit&#xff09;作为Philips&#xff08;现NXP&#xff09;开发的经典两线制串行总线&#xff0c;在低速设备通信中占据重要地位。我刚开始接触FPGA时&#xff0c;最头疼的就是I2C的时序控制——两根线&…...