技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 565|回复: 7
收起左侧

《史上最“屌”的纯WINAPI进行界面编程的学习笔记》补充

[复制链接]

34

主题

133

帖子

6938

积分

用户组: 管理员

UID
77
精华
11
威望
112 点
宅币
6397 个
贡献
129 次
宅之契约
0 份
在线时间
90 小时
注册时间
2014-2-22
发表于 2017-4-10 13:38:45 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
两年前,A5教我用WIN32API写界面,于是有了这个帖子:https://www.0xaa55.com/forum.php?mod=viewthread&tid=1421
现在我自己用A5UI写程序的时候,发现创建窗口有点小问题:
1、同一个窗口无法创建多次
2、不能创建模态窗口
于是我请教A5如何修改,结果A5以(蛋)(蛋)疼的理由表示最近没空。。。最终经过3天的研究,终于解决了这两个问题。
第一个问题好解决,同样的窗口类只需要用RegisterClassEx注册一次,多次注册会失败,稍微调整了一下代码逻辑即可;
第二个问题可让我一顿好找。最终发现是两个关键点:
1、模态装口和主窗口是拥有和被拥有的关系,也就是说hParent不能为NULL。
2、模态窗口起来时,要冻结父窗口;关闭时,要解冻父窗口(在子窗口消息循环的WM_DESTROY里解冻)。
最终新版NewWindow代码如下:
  1. //新建窗口:第一个参数可以传入hInstance,也可以传入父窗口。
  2. HWND NewWindow(HWND hParent, PVOID WndProc, int x, int y, int nWidth, int nHeight, LPCTSTR wsClassName, LPCTSTR wsTitle)
  3. {
  4.         TCHAR DefaultClass[] = TEXT("#32770");
  5.         if(!wsClassName){wsClassName = DefaultClass;}
  6.         //窗口类
  7.         WNDCLASSEX g_WCEx=
  8.         {
  9.                 sizeof(g_WCEx),
  10.                 0,
  11.                 (WNDPROC)WndProc,
  12.                 0,
  13.                 0,
  14.                 NULL,
  15.                 NULL,
  16.                 NULL,
  17.                 (HBRUSH)(COLOR_BTNFACE+1),//窗口背景色(按钮表面)
  18.                 NULL,
  19.                 wsClassName,//窗口类名
  20.                 NULL
  21.         };
  22.         ATOM atClass=0;//注册窗口类的返回值
  23.         HWND g_hWnd=NULL;//窗口句柄
  24.         //注册窗口类
  25.         if(IsWindow(hParent))
  26.         {
  27.                 g_WCEx.hInstance=(HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE);
  28.         }
  29.         else
  30.         {
  31.                 g_WCEx.hInstance=(HINSTANCE)hParent;hParent=NULL;
  32.         }
  33.         g_WCEx.hIcon=LoadIcon(NULL,IDI_APPLICATION);//默认图标
  34.         g_WCEx.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//默认小图标
  35.         g_WCEx.hCursor=LoadCursor(NULL,IDC_ARROW);//默认鼠标光标类型
  36.         atClass=RegisterClassEx(&g_WCEx);
  37.         if(atClass)
  38.         {
  39.                 g_hWnd = CreateWindowEx(WS_EX_APPWINDOW,(LPCTSTR)atClass,wsTitle,WS_OVERLAPPEDWINDOW,//用注册窗口类返回值创建窗口
  40.                                                                 x,y,nWidth,nHeight,//窗口位置(CW_USEDEFAULT,CW_USEDEFAULT)、尺寸
  41.                                                                 hParent,NULL,g_WCEx.hInstance,NULL);
  42.         }
  43.         else
  44.         {
  45.                 g_hWnd = CreateWindowEx(WS_EX_APPWINDOW,(LPCTSTR)wsClassName,wsTitle,WS_OVERLAPPEDWINDOW,//用注册窗口类返回值创建窗口
  46.                                                                 x,y,nWidth,nHeight,//窗口位置(CW_USEDEFAULT,CW_USEDEFAULT)、尺寸
  47.                                                                 hParent,NULL,g_WCEx.hInstance,NULL);
  48.         }
  49.         if(g_hWnd)
  50.         {
  51.                 ShowWindow(g_hWnd,5);//显示窗口
  52.                 UpdateWindow(g_hWnd);//刷新窗口
  53.                 RECT rt={0};
  54.                 HWND hDesk=GetDesktopWindow();
  55.                 GetClientRect(hDesk, &rt);
  56.                 SetWindowPos(g_hWnd, NULL, (rt.right-nWidth)/2, (rt.bottom-nHeight)/2, nWidth, nHeight, SWP_NOZORDER);//设置窗口屏幕中央
  57.                 EnableWindow(hParent,FALSE);
  58.         }
  59.         return g_hWnd;//返回窗口句柄
  60. }
复制代码

评分

参与人数 1宅币 +1 收起 理由
Ayala + 1 加油!

查看全部评分

本帖被以下淘专辑推荐:

25

主题

81

帖子

1088

积分

用户组: 版主

UID
1821
精华
6
威望
57 点
宅币
832 个
贡献
31 次
宅之契约
0 份
在线时间
196 小时
注册时间
2016-7-12
发表于 2017-4-10 13:59:21 | 显示全部楼层
支持一下
回复

使用道具 举报

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
发表于 2017-4-10 15:26:45 | 显示全部楼层
蛋疼个屁,明明是肚子疼!
说起来这代码好简短啊

0

主题

8

帖子

75

积分

用户组: 小·技术宅

UID
2266
精华
0
威望
2 点
宅币
63 个
贡献
0 次
宅之契约
0 份
在线时间
5 小时
注册时间
2017-2-21
发表于 2017-4-18 12:17:52 | 显示全部楼层
    支持楼主   。   

0

主题

8

帖子

27

积分

用户组: 初·技术宅

UID
2163
精华
0
威望
0 点
宅币
19 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2017-1-5
发表于 2017-4-21 17:31:24 | 显示全部楼层
顶礼膜拜中.....

1

主题

15

帖子

15

积分

用户组: 初·技术宅

UID
2735
精华
0
威望
0 点
宅币
0 个
贡献
0 次
宅之契约
0 份
在线时间
6 小时
注册时间
2017-7-28
发表于 2017-10-8 20:39:26 | 显示全部楼层
顶礼膜拜中.....

0

主题

2

帖子

11

积分

用户组: 初·技术宅

UID
3654
精华
0
威望
0 点
宅币
9 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-3-31
发表于 2018-3-31 21:19:47 | 显示全部楼层
1>------ Build started: Project: Win32, Configuration: Release Win32 ------
1>  main.cpp
1>main.cpp(351): error C2664: 'HWND NewWindow(HWND,PVOID,int,int,int,int,LPCTSTR,LPCTSTR)' : cannot convert argument 1 from 'HMODULE' to 'HWND'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>main.cpp(1242): error C2664: 'HWND NewWindow(HWND,PVOID,int,int,int,int,LPCTSTR,LPCTSTR)' : cannot convert argument 1 from 'HINSTANCE' to 'HWND'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
编译不行啊

995

主题

2207

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16461 个
贡献
32335 次
宅之契约
0 份
在线时间
1565 小时
注册时间
2014-1-26
发表于 2018-4-1 08:15:13 | 显示全部楼层
soncfe 发表于 2018-3-31 21:19
1>------ Build started: Project: Win32, Configuration: Release Win32 ------
1>  main.cpp
1>main.cpp( ...

你个胎神。这是C语言的源码,你新建C++的工程自然就编译不通过了。

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-9-20 08:32 , Processed in 0.116281 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表