如何解决向 WinAPI 应用程序添加多个 Windows
我正在使用 WinAPI 构建一个应用程序,该应用程序基本上由两个主要部分组成:始终显示的左侧面板和右侧的区域,该区域根据显示的屏幕而变化。目前,左侧的静态区域正在被绘制到主窗口上;但是,因为我不相信我可以简单地将正确的区域绘制到主窗口上,因为它需要更改。因此,我相信我需要在那里创建窗口,并通过控制其可见性来控制显示的内容。我在 MSDN 中阅读了很多关于多文档界面的内容,但我不确定这是否是我要找的。具体来说,我不希望子窗口表现得像真正的窗口,这意味着我不希望它们有标题或图标,也不希望它们能够被最小化、关闭、调整大小或移动。基本上,我希望它们只是包含控件/D2D 几何图形的框架。实现这一目标的最佳方式是什么?
解决方法
正如Remy所说,您只需要重新注册一个新窗口,然后在主窗口中将其创建为子类即可。设置样式时不需要设置标题和最大化最小化按钮,也可以自行决定是否需要处理子类的WNDPROC函数。
这是一个示例(为了显示子窗口,我将其背景设置为黑色。):
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK cldWndProc(HWND,LPARAM);
int WINAPI WinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR szCmdLine,_In_ int iCmdShow)
{
static TCHAR szAppName[] = TEXT("hello windows");
static TCHAR cldwndName[] = TEXT("test app");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
}
hwnd = CreateWindow(szAppName,TEXT("the hello program"),WS_OVERLAPPEDWINDOW,100,800,600,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
WNDCLASS cldclass;
cldclass.style = CS_HREDRAW | CS_VREDRAW;
cldclass.lpfnWndProc = cldWndProc;
cldclass.cbClsExtra = 0;
cldclass.cbWndExtra = 0;
cldclass.hInstance = hInstance;
cldclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
cldclass.hCursor = LoadCursor(NULL,IDC_ARROW);
cldclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
cldclass.lpszMenuName = NULL;
cldclass.lpszClassName = cldwndName;
if (!RegisterClass(&cldclass))
{
MessageBox(NULL,MB_ICONERROR);
}
HWND hwnd1 = CreateWindow(cldwndName,WS_CHILD|WS_VISIBLE,400,200,300,hwnd,NULL);
ShowWindow(hwnd1,iCmdShow);
UpdateWindow(hwnd1);
while (GetMessageW(&msg,0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK cldWndProc(HWND hwnd,lParam);
}
它对我有用:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。