【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;//返回窗口句柄
} 支持一下 蛋疼个屁,明明是肚子疼!
说起来这代码好简短啊 支持楼主 。 顶礼膜拜中..... 顶礼膜拜中..... 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 ==========
编译不行啊 soncfe 发表于 2018-3-31 21:19
1>------ Build started: Project: Win32, Configuration: Release Win32 ------
1>main.cpp
1>main.cpp( ...
你个胎神。这是C语言的源码,你新建C++的工程自然就编译不通过了。 学习学习。
页:
[1]