zoukankan      html  css  js  c++  java
  • Windows:子线程中创建窗口

    一般来讲,UI的所有操作都必须在主线程,否则会出现未知错误。但有时候我们会需要一个功能比较单一的窗口,同时希望他在一个单独的线程运行。并不影响主线程的效率。

    下面说明一下新建子线程创建的新窗口的方法,关键在于在子线程中,有一套自己的事件循环机制,即可脱离主线程单独运行

    LRESULT CALLBACK WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
    {
    	return DefWindowProc(hWnd, wMsg, wParam, lParam);
    }
    
    void CreateWndInThread(int nWidth, int nHeight)
    {
    	WNDCLASSEXA wcex;
    
    	wcex.cbSize = sizeof(WNDCLASSEX);
    
    	wcex.style = CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc = WndProc;
    	wcex.cbClsExtra = 0;
    	wcex.cbWndExtra = 0;
    	wcex.hInstance = GetModuleHandle(nullptr);
    	wcex.hIcon = 0;
    	wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    	wcex.lpszMenuName = NULL;
    
    	char cName[MAX_PATH] = { 0 };
    	GetModuleFileNameA(wcex.hInstance, cName, sizeof(cName));
    	char* szApp = strrchr(cName, '\') + 1;
    	strchr(szApp, '.')[0] = '';
    
    	wcex.lpszClassName = szApp;
    	wcex.hIconSm = 0;
    	RegisterClassExA(&wcex);
    
    	g_hWnd = CreateWindowA(szApp, nullptr, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, nWidth, nHeight, NULL, NULL, wcex.hInstance, 0);
    
    	ShowWindow(g_hWnd, SW_SHOW);
    	UpdateWindow(g_hWnd);
    
    	MSG msg;
    	while (GetMessage(&msg, nullptr, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    

      其实基本就是模拟win sdk创建窗口的方式,只是将整个动作包含到一个线程里而已

    std::thread t(CreateWndInThread, 960, 480);
    t.detach();
    

      在需要的时候,启动一个线程,执行创建,这个线程在while (GetMessage(&msg, nullptr, 0, 0))的循环中负责处理这个子线程窗口的事件循环即可

  • 相关阅读:
    安卓AlertDialog的使用
    蚂蚁的腿
    年龄排序
    Digital Roots
    小明的存钱计划
    不高兴的小明
    管闲事的小明
    小明的调查作业
    爱摘苹果的小明
    小明的难题
  • 原文地址:https://www.cnblogs.com/KaiMing-Prince/p/7929751.html
Copyright © 2011-2022 走看看