【问题标题】:C++ Issue with creating popup window, getting other window insteadC++ 创建弹出窗口的问题,而不是获取其他窗口
【发布时间】:2014-10-09 11:47:57
【问题描述】:

我只是想制作一个弹出窗口,稍后将显示我需要的任何信息。我遇到的问题是......当我点击按钮时,我没有创建一个新的弹出窗口,而是弹出我的主程序窗口的副本。

这是我的 WinMain 函数中的代码:

 HINSTANCE hInstanceSaved;//I am declaring an HINSTANCE VARIABLE HERE
 // SO THAT IT IS GLOBAL AND THEN I CAN USE IT WHEN I CREATE MY POPUP WINDOW

 INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
 {

hInstanceSaved = hInstance;
//here I am giving the global hInstanceSaved variable the value of hInstance
// so that when I click the button, I can have this variale available to me
// so that i can use the CreateWindowEx() function

MSG        Msg;
HWND       hWnd;
WNDCLASSEX WndClsEx;
LPCTSTR ClsName = "ResFund";
LPCTSTR WndName = "Resources Fundamentals";

// Create the application window
WndClsEx.cbSize        = sizeof(WNDCLASSEX);
WndClsEx.style         = CS_HREDRAW | CS_VREDRAW;
WndClsEx.lpfnWndProc   = WndProcedure;
WndClsEx.cbClsExtra    = 0;
WndClsEx.cbWndExtra    = 0;
WndClsEx.hIcon         = LoadIcon(hInstance,
                  MAKEINTRESOURCE(IDI_BOOKED));
WndClsEx.hCursor       = LoadCursor(NULL, IDC_ARROW);
WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClsEx.lpszMenuName  = NULL;
WndClsEx.lpszClassName = ClsName;
WndClsEx.hInstance     = hInstance;
WndClsEx.hIconSm       = LoadIcon(hInstance,
                  MAKEINTRESOURCE(IDI_BOOKED));

// Register the application
RegisterClassEx(&WndClsEx);

// Create the window object
hWnd = CreateWindowEx(0,
                      ClsName,
                      WndName,
                      WS_OVERLAPPEDWINDOW,
                      200,//CW_USEDEFAULT,//how much to the right
                      200, //CW_USEDEFAULT,//how much downwards
                      800,//CW_USEDEFAULT,//width
                      500,//CW_USEDEFAULT,//height
                      NULL,
                      NULL,
                      hInstance,
                      NULL);

// Find out if the window was created
if( !hWnd ) // If the window was not created,
    return FALSE; // stop the application

// Display the window to the user
ShowWindow(hWnd, nCmdShow);// SW_SHOWNORMAL);
UpdateWindow(hWnd);


///CREATING THE WINDOW CLASS FOR YOUR POP WINDOW:
const char g_szClassName2[] = "invisWindow";//name of the window class
WNDCLASSEX invisWindowClass;
HWND invisHWnd;

invisWindowClass.cbSize         = sizeof(WNDCLASSEX);
invisWindowClass.style          = 0;
invisWindowClass.lpfnWndProc    = WndProcedure;//WndProc;//WNDPROC; //WndProcedure;
invisWindowClass.cbClsExtra     = 0;
invisWindowClass.cbWndExtra     = 0;
invisWindowClass.hInstance     = hInstance;///u might have to get this, but that isn't too hard xD
invisWindowClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
invisWindowClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
invisWindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
invisWindowClass.lpszMenuName  = NULL;
invisWindowClass.lpszClassName = g_szClassName2;
invisWindowClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&invisWindowClass);

while( GetMessage(&Msg, NULL, 0, 0) )
{
         TranslateMessage(&Msg);
         DispatchMessage(&Msg);
}

return 0;

}

当我单击“这将使窗口弹出”按钮时,我拥有的代码是:

            case IDC_POPUP:
            {


                const char g_szClassName2[] = "invisWindow";
                const char WndName2[] = "invisible Window";

                HWND invisWindowHandle = CreateWindowEx(0,
                      g_szClassName2,
                      WndName2,
                      WS_OVERLAPPEDWINDOW,
                      200,//CW_USEDEFAULT,//how much to the right
                      200, //CW_USEDEFAULT,//how much downwards
                      800,//CW_USEDEFAULT,//width
                      500,//CW_USEDEFAULT,//height
                      NULL,
                      NULL,
                      hInstanceSaved,
                      NULL);

                if( !invisWindowHandle ) // If the window was not created,
                    return FALSE; // stop the application

                ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
                UpdateWindow(invisWindowHandle);

            }
            break;

现在为什么我没有得到一个新的空弹出窗口,而是我的主程序窗口的副本?

【问题讨论】:

    标签: c++ api popup window


    【解决方案1】:

    第二个窗口的窗口过程似乎有些不确定。您是否为它提供了 WndProcedure 函数?该 WndProcedure 是否处理 WM_PAINT 消息?您必须拥有 WM_PAINT 处理程序才能看到一些东西。

    【讨论】:

    • 哦,我是否必须为我创建的每个新窗口创建一个 neww WndProcedure 函数?
    • 如果我必须添加另一个 WndProcedure 才能创建另一个窗口,那么我有一个概念疑问:使用 GetMessage(&Msg, NULL, 0, 0) 查找任何更改的 while 循环事件......它最终向 WndProcedure 发送一条消息......那么如果我有 2 个 WndProcedures,这里不会有问题吗? DispatchMessage(&Msg) 函数如何知道 2 个 WndProcedures 中的哪一个是正确的发送到?我在这里错过了什么吗 xD?
    • 您需要为您注册的每个窗口类,而不是每个窗口都有一个 WndProcedure。所有消息都包含一个 HWND。消息被分派到负责 HWND 的 WndProcedure。
    • @SchottMcP-MVP:斯科特,有没有人告诉过你你很棒 xD?你的男人,简单而准确的答案
    • 因此,如果我想拥有 10 个子窗口,我会在 WinMain 函数中声明所有这些窗口(通过声明我的意思是在其中创建相应的 WNDCLASSEX 类并注册它们),然后我会每个人都有一个窗口过程,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2023-03-18
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多