用CreateThread创建子线程,在子线程里写窗口注册和创建以及消息循环,注意创建窗口和消息循环一定都要有,这样生成的窗口才和在主线程中创建的没有区别,以下为示例代码
#include<iostream>
//#include"ShowBinTree.h"
#include<windows.h>
using namespace std;
LRESULT CALLBACK Wndfun(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CREATE:
printf("create\n");
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("1231"), 4);
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
DWORD CreateThr(PVOID pArg)
{
int h = 400, w = 400;
TCHAR m_WinName[100];//= TEXT("win");
wsprintf(m_WinName, TEXT("win"));
DWORD pid;
HINSTANCE hinstance;
pid = GetCurrentProcessId();
hinstance = (HINSTANCE)GetCurrentProcess();
hinstance = GetModuleHandle(NULL);
WNDCLASS win;
win.style = CS_HREDRAW | CS_VREDRAW;
win.lpfnWndProc = Wndfun;
win.cbClsExtra = 0;
win.cbWndExtra = 0;
win.hInstance = hinstance;
win.hIcon = LoadIcon(NULL, IDI_INFORMATION);
win.hCursor = LoadCursor(NULL, IDC_CROSS);
win.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW);
win.lpszMenuName = NULL;
win.lpszClassName = m_WinName;
if (RegisterClass(&win) == 0) {
int n = GetLastError();
int a, b = 0;
};
TCHAR WinName[100] = TEXT("win");
HWND hwindow = CreateWindow(m_WinName, TEXT("test"), WS_OVERLAPPEDWINDOW,
200, 200, w, h, NULL, NULL, hinstance, NULL);
int n = GetLastError();
ShowWindow(hwindow, SW_SHOW);
UpdateWindow(hwindow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
int main() {
HANDLE thread = CreateThread(NULL, 0, CreateThr, NULL, 0, NULL);
if (thread == NULL)cout << "error" << endl;
CloseHandle(thread);
getchar();//注意,这个非常非常重要。
return 0;
}
一定要注意的是,在这里主线程一结束那么子线程就自动结束了,所以那个getchar就是起阻塞作用的,在这里如果你没有那个getchar的话,会看不到窗口的出现就结束运行了。