- UID
- 77
- 精华
- 积分
- 9576
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
两年前,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代码如下:- //新建窗口:第一个参数可以传入hInstance,也可以传入父窗口。
- HWND NewWindow(HWND hParent, PVOID WndProc, int x, int y, int nWidth, int nHeight, LPCTSTR wsClassName, LPCTSTR wsTitle)
- {
- TCHAR DefaultClass[] = TEXT("#32770");
- if(!wsClassName){wsClassName = DefaultClass;}
- //窗口类
- WNDCLASSEX g_WCEx=
- {
- sizeof(g_WCEx),
- 0,
- (WNDPROC)WndProc,
- 0,
- 0,
- NULL,
- NULL,
- NULL,
- (HBRUSH)(COLOR_BTNFACE+1),//窗口背景色(按钮表面)
- NULL,
- wsClassName,//窗口类名
- NULL
- };
- ATOM atClass=0;//注册窗口类的返回值
- HWND g_hWnd=NULL;//窗口句柄
- //注册窗口类
- if(IsWindow(hParent))
- {
- g_WCEx.hInstance=(HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE);
- }
- else
- {
- g_WCEx.hInstance=(HINSTANCE)hParent;hParent=NULL;
- }
- g_WCEx.hIcon=LoadIcon(NULL,IDI_APPLICATION);//默认图标
- g_WCEx.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//默认小图标
- g_WCEx.hCursor=LoadCursor(NULL,IDC_ARROW);//默认鼠标光标类型
- atClass=RegisterClassEx(&g_WCEx);
- if(atClass)
- {
- g_hWnd = CreateWindowEx(WS_EX_APPWINDOW,(LPCTSTR)atClass,wsTitle,WS_OVERLAPPEDWINDOW,//用注册窗口类返回值创建窗口
- x,y,nWidth,nHeight,//窗口位置(CW_USEDEFAULT,CW_USEDEFAULT)、尺寸
- hParent,NULL,g_WCEx.hInstance,NULL);
- }
- else
- {
- g_hWnd = CreateWindowEx(WS_EX_APPWINDOW,(LPCTSTR)wsClassName,wsTitle,WS_OVERLAPPEDWINDOW,//用注册窗口类返回值创建窗口
- x,y,nWidth,nHeight,//窗口位置(CW_USEDEFAULT,CW_USEDEFAULT)、尺寸
- hParent,NULL,g_WCEx.hInstance,NULL);
- }
- if(g_hWnd)
- {
- ShowWindow(g_hWnd,5);//显示窗口
- UpdateWindow(g_hWnd);//刷新窗口
- RECT rt={0};
- HWND hDesk=GetDesktopWindow();
- GetClientRect(hDesk, &rt);
- SetWindowPos(g_hWnd, NULL, (rt.right-nWidth)/2, (rt.bottom-nHeight)/2, nWidth, nHeight, SWP_NOZORDER);//设置窗口屏幕中央
- EnableWindow(hParent,FALSE);
- }
- return g_hWnd;//返回窗口句柄
- }
复制代码 |
|