CreateWindow()样式参数被忽略?

时间:2011-06-29 00:28:32

标签: 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 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);

我继续使用窗口并使用流式视频更新它,它可以正常工作。但是,似乎无论我传递给CreateWindow()的dwStyle参数都被忽略了。该窗口没有标题栏,最小化或最大化按钮,就像人们对重叠窗口的期望一样。此外,窗口未最大化。奇怪的是,将dwStyle改为

WS_OVERLAPPEDWINDOW | WS_HSCROLL /* dwStyle */

现在显示悬停在窗口上但没有实际滚动条时的双向左/右箭头。有没有人有什么想法可能导致这种奇怪的行为?

2 个答案:

答案 0 :(得分:2)

绘制标题栏和其他此类内容需要将未处理的窗口消息传递给DefWindowProc。例如,标题栏在WM_NCPAINT消息期间绘制。如果您没有将消息传递给DefWindowProc,那就是没有完成。

答案 1 :(得分:1)

来自Microsoft Documentation的评论:

  

根据值,可以忽略WS_MINIMIZE和WS_MAXIMIZE样式   创建进程时在STARTUPINFO.dwFlags和STARTUPINFO.wShowWindow中指定。

必须使用WS_MINIMIZEBOX和WS_MAXIMIZEBOX显式启用最小化和最大化框。你可能想要WS_OVERLAPPEDWINDOW而不仅仅是WS_OVERLAPPED;这将包括最小化和最大化框。