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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4616|回复: 8

【C】《史上最“屌”的纯WINAPI界面编程学习笔记》补充1

[复制链接]
发表于 2017-4-10 13:38:45 | 显示全部楼层 |阅读模式

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

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

×
两年前,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. }
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2017-4-10 13:59:21 | 显示全部楼层
支持一下
回复

使用道具 举报

发表于 2017-4-10 15:26:45 | 显示全部楼层
蛋疼个屁,明明是肚子疼!
说起来这代码好简短啊
回复 赞! 靠!

使用道具 举报

发表于 2017-4-18 12:17:52 | 显示全部楼层
    支持楼主   。   
回复 赞! 靠!

使用道具 举报

发表于 2017-4-21 17:31:24 | 显示全部楼层
顶礼膜拜中.....
回复 赞! 靠!

使用道具 举报

发表于 2017-10-8 20:39:26 | 显示全部楼层
顶礼膜拜中.....
回复 赞! 靠!

使用道具 举报

发表于 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 ==========
编译不行啊
回复 赞! 靠!

使用道具 举报

发表于 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++的工程自然就编译不通过了。
回复 赞! 靠!

使用道具 举报

发表于 2019-5-10 20:16:52 | 显示全部楼层
学习学习。
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 11:13 , Processed in 0.033940 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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