网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月05日漏签0天
vb吧 关注:156,133贴子:1,166,132
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 30回复贴,共1页
<<返回vb吧
>0< 加载中...

分享:利用CreateWindowEx创建子窗体来设计UI

  • 只看楼主
  • 收藏

  • 回复
  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
利用CreateWindowEx创建子窗体来设计UI,嗯......算是对学习Windows消息机制的一个回顾。
当然,现在Win已经换成Fluent Design的UI设计了,题外话。
以及用SetProcessDpiAwareness后为高DPI屏幕手动设置布局
如图,为最终效果
//最左侧为旧UI,风格一致,处理逻辑不同,以及没有为高DPI优化


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一般使用高分辨率屏幕时,都会屏幕缩放,所以看起来都一样,但如果屏幕缩放设为100%呢?就会出现如下情况:


2025-06-05 18:39:27
广告
  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好了话不多说,代码如下(图片):
创建子窗体
//en......hInst是应用实例,用的全局变量,忘了考虑传入参数的因素了


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第一步:更改窗体风格,设置DPI缩放,获取窗口大小,计算窗体基础元素大小以及布局,重设窗体状态
//其中,计算窗体基础元素大小以及布局看个人经验以及对UI设计的看法


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第五步:创建子窗体并刷新(字面意义)


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第六步:初始化功能代码
第七步:消息循环(不必要,IsExit那句调试代码,忘了注释了)
第八步:程序结束前清理资源、释放句柄、释放内存(接管消息循环在消息循环里面,未接管在窗体的Unload事件里面)


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
子类化窗体过程(不必要,但推荐)
追踪鼠标是否在子窗体上,以及当鼠标不在子窗体上时向子窗体发送消息
//这里我应该用PostMessage或者SendMessage的,但我忘了


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
处理标题栏//毕竟窗体风格设为POPUP|BORDER后窗体移动代码就得自己来写了不是


2025-06-05 18:33:27
广告
  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
功能按钮的代码//不赘述


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
文本显示的代码//更加简单


  • 余思培
  • 网络通信
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
//被吞了,可能是因为图片有16进制数字原因,所以我就不发图了
第二步:设置UI颜色方案
第三步:子类化WndProc(推荐,但不完全必要)
第四步:更改已有控件位置
(比如说有什么控件你不想重写,直接用就是了)
//中间被忽略的代码用于追踪鼠标,这一部分可以直接用TrackMouseEvent来实现,但个人觉得直接接管消息循环方便一点(虽然说效果不如TrackMouseEvent),所以直接强制显示并更新窗体,然后子类化后直接用Do...Loop循环加GetMessage组合加鼠标追踪代码来替代消息循环。


  • 隨風缒夢
  • 子类化
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
既然用CreateWindow来创建主窗口了,再用CreateWindow创建子窗口我觉得就没有什么必要了(否则和VB的控件拖拉没什么区别),最好可以往DirectUI方面做,就是现在QQ、迅雷等采用的UI方案(优点是子控件想怎么透明就怎么透明,还有其他的优点等等),DirectUI即只有一个主窗口,界面上的UI都是用GDI函数在指定区域绘制出来的,响应鼠标及键盘事件
目前DirectUI方案,我也只有在游戏内的设计,没有真正用到应用软件上,主要是工程量大,不是这样做过也是有点心得,以后可以设计一个真正用到应用软件上的DirectUI


  • 广州聚力汇体育
  • 递归爆栈
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
虽然看不懂 但是感觉很厉害


  • yjryym
  • 多线程
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
个人建议,最好不要用 SetProcessDpiAwareness 这个API来处理DPI适配,而是用 manifest 清单来配置,SetProcessDpiAwareness 在低版本系统上没有,用 manifest 清单则不存在这个问题。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 30回复贴,共1页
<<返回vb吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示