Golden Blonde 发表于 2017-4-10 13:38:45

【C】《史上最“屌”的纯WINAPI界面编程学习笔记》补充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;//返回窗口句柄
}

Ayala 发表于 2017-4-10 13:59:21

支持一下

0xAA55 发表于 2017-4-10 15:26:45

蛋疼个屁,明明是肚子疼!
说起来这代码好简短啊

赤坂龙之介 发表于 2017-4-18 12:17:52

    支持楼主   。   

qytom 发表于 2017-4-21 17:31:24

顶礼膜拜中.....

cxx 发表于 2017-10-8 20:39:26

顶礼膜拜中.....

soncfe 发表于 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 ==========
编译不行啊

0xAA55 发表于 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++的工程自然就编译不通过了。

Ink_Hin_fifteen 发表于 2019-5-10 20:16:52

学习学习。
页: [1]
查看完整版本: 【C】《史上最“屌”的纯WINAPI界面编程学习笔记》补充1