我的 GUI 表单后面令人讨厌的空白控制台

Posted

技术标签:

【中文标题】我的 GUI 表单后面令人讨厌的空白控制台【英文标题】:Annoying blank console at the back of my GUI form 【发布时间】:2012-02-10 07:51:48 【问题描述】:

我使用 GCC (g++) 编译器编译这个小程序。结果可执行文件很好,但是当我运行它时,它会出现一个烦人的空白控制台窗口! :(

 #include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

static char gszClassName[]  = "darkblue";
static HINSTANCE ghInstance = NULL;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
        WNDCLASSEX WndClass;
        HWND hwnd;
        MSG Msg;

        ghInstance = hInstance;

        WndClass.cbSize        = sizeof(WNDCLASSEX);
        WndClass.style         = NULL;
        WndClass.lpfnWndProc   = WndProc;
        WndClass.cbClsExtra    = 0;
        WndClass.cbWndExtra    = 0;
        WndClass.hInstance     = ghInstance;
        WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
        WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        WndClass.lpszMenuName  = NULL;
        WndClass.lpszClassName = gszClassName;
        WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

        if(!RegisterClassEx(&WndClass)) 
                MessageBox(0, "Window Registration Failed!", "Error!", MB_ICONSTOP | MB_OK);
                return 0;
        

        hwnd = CreateWindowEx(
                WS_EX_STATICEDGE,
                gszClassName,
                "darkblue owNz!",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT,
                320, 240,
                NULL, NULL,
                ghInstance,
                NULL);

        if(hwnd == NULL) 
                MessageBox(0, "Window Creation Failed!", "Error!", MB_ICONSTOP | MB_OK);
                return 0;
        

        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);

        while(GetMessage(&Msg, NULL, 0, 0)) 
                TranslateMessage(&Msg);
                DispatchMessage(&Msg);
        
        return Msg.wParam;


LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) 
        switch(Message) 
                case WM_CLOSE:
                        DestroyWindow(hwnd);
                        break;
                case WM_DESTROY:
                        PostQuitMessage(0);
                        break;
                default:
                        return DefWindowProc(hwnd, Message, wParam, lParam);
        
        return 0;

【问题讨论】:

你可以发布屏幕截图窗口吗? 【参考方案1】:

您正在编译您的代码以定位 CONSOLE 子系统,这就是为什么在执行您的应用程序时会出现黑色控制台窗口的原因。

这是 GCC 中的默认选项,可能是因为它很容易上手:您只需要几行 cout 就可以立即在屏幕上显示文本。使用控制台窗口,您不必像在此处所做的那样经历创建窗口等的所有麻烦。

在这种情况下,您实际上想要链接到WINDOWS 子系统。这就是创建典型 GUI 应用程序的方式。有两种方法可以做到这一点:

    您可以在命令行中指定-mwindows 链接器选项。

    您可以将以下行添加到您的 makefile 中的链接器标志:

    -Wl,-subsystem,windows
    

【讨论】:

以上是关于我的 GUI 表单后面令人讨厌的空白控制台的主要内容,如果未能解决你的问题,请参考以下文章

使用 Combobox 控制表单

同一个解决方案中控制台和表单项目之间的连接和通信

C# 从程序线程更新表单(richTextBox 和 toolStripStatusLabel)

如何避免Haskell空间泄漏? [关闭]

谷歌地图空白,但在模拟器上仍有位置

在 gui 应用程序中打开控制台