C++ 是否忽略CreateWindow()样式参数?

C++ 是否忽略CreateWindow()样式参数?,c++,winapi,visual-c++,C++,Winapi,Visual C++,在我的Windows应用程序中,我正在使用CreateWindow()函数创建一个新窗口。注册和窗口创建如下所示: // Set up the capture window WNDCLASS wc = {0}; // Set which method handles messages passed to the window wc.lpfnWndProc = WindowMessageRedirect<CStillCamera>; // Make the instance of t

在我的Windows应用程序中,我正在使用CreateWindow()函数创建一个新窗口。注册和窗口创建如下所示:

// Set up the capture window
WNDCLASS wc = {0};

// Set which method handles messages passed to the window
wc.lpfnWndProc = WindowMessageRedirect<CStillCamera>;
// Make the instance of the window associated with the main application
wc.hInstance = GetModuleHandle(NULL);
// Set the cursor as the default arrow cursor
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
// Set the class name required for registering the window and identifying it for future
// CreateWindow() calls
wc.lpszClassName = c_wzCaptureClassName.c_str();

RegisterClass(&wc); /* Call succeeding */

HWND hWnd = CreateWindow(
    c_wzCaptureClassName.c_str() /* lpClassName */,
    c_wzCaptureWindowName.c_str() /* lpWindowName */,
    WS_OVERLAPPEDWINDOW | WS_MAXIMIZE /* dwStyle */,
    CW_USEDEFAULT /* x */,
    CW_USEDEFAULT /* y */,
    CW_USEDEFAULT /*nWidth */,
    CW_USEDEFAULT /* nHeight */,
    NULL /* hWndParent */,
    NULL /* hMenu */,
    GetModuleHandle(NULL) /* hInstance */,
    this /* lpParam */
);


if (!hWnd)
{
    return false;
}

ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
现在,当鼠标悬停在窗口上时,显示左右两侧的箭头,但没有实际的滚动条。有人知道是什么导致了这种奇怪的行为吗?

来自:

WS_MINIMIZE和WS_MAXIMIZE样式可能会被忽略,具体取决于值 创建进程时,在STARTUPINFO.dwFlags和STARTUPINFO.wShowWindow中指定

最小化和最大化框必须使用WS_MINIMIZEBOX和WS_MAXIMIZEBOX显式启用。您可能想要WS_重叠窗口,而不仅仅是WS_重叠窗口;这将包括最小化和最大化框。

来自以下内容中的注释:

WS_MINIMIZE和WS_MAXIMIZE样式可能会被忽略,具体取决于值 创建进程时,在STARTUPINFO.dwFlags和STARTUPINFO.wShowWindow中指定


最小化和最大化框必须使用WS_MINIMIZEBOX和WS_MAXIMIZEBOX显式启用。您可能想要WS_重叠窗口,而不仅仅是WS_重叠窗口;这将包括最小化和最大化框。

绘制标题栏和其他类似内容需要将未处理的窗口消息传递给
DefWindowProc
。例如,标题栏是在
WM\NCPAINT
消息期间绘制的。如果您没有将消息传递给
DefWindowProc
,则无法完成此操作。

绘制标题栏和其他类似内容需要将未处理的窗口消息传递给
DefWindowProc
。例如,标题栏是在
WM\NCPAINT
消息期间绘制的。如果您不将消息传递给
DefWindowProc
,那就无法完成。

为什么
={0}
而不是
={}
?你有没有给注册班打过电话?您正在将消息传递给DefWindowProc吗?(这就是绘制标题栏的原因)抱歉-我无意中删掉了关于RegisterClass()的一行。我正在indeedy调用RegisterClass,所有消息也被传递到DefWindowProc()。事实上,我撒谎了!问题是WndProc()中没有调用DefWindowProc()。如果你把你的评论作为答案发表,我会接受。为什么不仅仅是
={0}
?你有没有给注册班打过电话?您正在将消息传递给DefWindowProc吗?(这就是绘制标题栏的原因)抱歉-我无意中删掉了关于RegisterClass()的一行。我正在indeedy调用RegisterClass,所有消息也被传递到DefWindowProc()。事实上,我撒谎了!问题是WndProc()中没有调用DefWindowProc()。如果你发表评论作为回答,我会接受。
WS_OVERLAPPEDWINDOW
(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
——它已经明确指定了。(此外,他说的是
WS\u MAXIMIZE
,而不是
WS\u MAXIMIZEBOX
)@Billy,出于某种原因,我读的是WS\u重叠而不是WS\u重叠窗口-我的错。但是关于WS_MAXIMIZE的部分是相关的:“而且,窗口没有最大化。”我很高兴你能弄明白,我可能会在一段时间后删除这个答案。
WS_OVERLAPPEDWINDOW
(WS_OVERLAPPED | WS|U CAPTION | WS|U系统菜单| WS| U THICKFRAME | WS| U MINIMIZEBOX | WS| U MAXIMIZEBOX)
——已经明确指定了。(此外,他说的是
WS\u MAXIMIZE
,而不是
WS\u MAXIMIZEBOX
)@Billy,出于某种原因,我读的是WS\u重叠而不是WS\u重叠窗口-我的错。但是关于WS_MAXIMIZE的部分是相关的:“而且,窗口没有最大化。”我很高兴你能弄明白,我可能会在一段时间后删除这个答案。
WS_OVERLAPPEDWINDOW | WS_HSCROLL /* dwStyle */