创建的窗口没有标题

时间:2017-02-14 02:20:59

标签: c++ winapi window

我正在从我的控制台应用程序创建消息窗口。窗口类已正确注册并且窗口已正确创建,但它从不具有标题(而我的createwindow函数调用确实指定了标题)。 让我思考,控制台程序可以创建名称窗口?用Google搜索,什么也没找到。 这是我的代码,保持最低限度:

using namespace std;
hInstance = GetModuleHandle(NULL);
WNDCLASS WndClass = {};
WndClass.style = CS_HREDRAW | CS_VREDRAW; // == 0x03
WndClass.lpfnWndProc = pWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hIcon = 0;
WndClass.hCursor = 0;
WndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
WndClass.lpszMenuName = 0;
WndClass.lpszClassName = "EME.LauncherWnd";
int style = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION;
if (RegisterClassA(&WndClass))
{
    cout << "class registered. Hinstance : " << hInstance <<  " style : (expect 0xcf0000) " << std::hex << style << endl;
    HWND hwind2 = CreateWindowExA(0, "EME.LauncherWnd", "Mytitle", style, 0x80000000, 0x80000000, 0x80000000, 0x80000000, NULL, NULL, hInstance, NULL);
    if (hwind2 == 0)
        cout << "Couldn't create window" << endl;
    else
        cout << "created window" << endl;
}

输出:

class registered. Hinstance : 00E40000
created window

使用Nirsoft的Winlister进行检查,窗口存在,具有正确的类(“EME.LauncherWnd”),但没有名称。 此外,在块中添加以下代码行:

if (0 == SetWindowText(hwind2, "aTitle"))
            cout << "couldn't set a title" << endl;
        else
            cout << "title set " << endl;

输出

title set

然而,窗口仍然没有标题。如果控制台程序没有标题我会假设SetWindowText调用将返回0。 我究竟做错了什么 ? 编辑:按要求添加pWndProc

LRESULT CALLBACK pWndProc(HWND hwnd,            // Handle to our main window
    UINT Msg,             // Our message that needs to be processed
    WPARAM wParam,        // Extra values of message 
    LPARAM lParam)        // Extra values of message
{
        switch (Msg)

        {
    case WM_DESTROY: 
....
break; 
         }
}

虽然在评论中指出pWndProc(我认为这个主体与窗口的构造无关),但是在切换案例中将这个代码行作为默认值插入

return DefWindowProc(hwnd, Msg, wParam, lParam);

解决了这个问题。

1 个答案:

答案 0 :(得分:0)

我发布评论建议的问题答案: 答案是,为了完成窗口创建,传递给RegisterClass的pWndProc WINAPI必须处理默认消息(特别是OS消息)。 在执行CreateWindow期间(在调用开始之后和返回之前),pWndProc函数已经接收到它必须处理的消息,在我的情况下它没有处理它们。 这是标准的pWndProc函数:

LRESULT CALLBACK pWndProc(HWND hwnd,            // Handle to our main window
    UINT Msg,             // Our message that needs to be processed
    WPARAM wParam,        // Extra values of message 
    LPARAM lParam)        // Extra values of message
{
        switch (Msg)

        {
    case WM_DESTROY: 
...
    default:
        return DefWindowProc(hwnd, Msg, wParam, lParam);
         }
}

来源:

  

窗口过程通常不会忽略消息。如果它不处理消息,它必须将消息发送回系统以进行默认处理。窗口过程通过调用DefWindowProc函数来执行此操作,该函数执行默认操作并返回消息结果。然后,窗口过程必须将此值作为自己的消息结果返回。大多数窗口过程只处理几条消息,并通过调用DefWindowProc将其他消息传递给系统。