#define WIN32_LEAN_AND_MEAN #include #include #define TEXT_SIZE (32) LPCTSTR szWindowClass = TEXT("CreateThread"); LPCTSTR szTitle = TEXT("CreateThread Test"); HINSTANCE hInst; typedef struct{ HWND hWnd; HWND hEditWindow; BOOL ExeFlag; } DATA; ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); DWORD WINAPI MyThread(LPVOID pData); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if(bRet == -1) break; if (!TranslateAccelerator(msg.hwnd, NULL, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, NULL); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCTSTR)NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, NULL); return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static DATA Data; static HWND hEditWindow; static HANDLE Thread; RECT rect; switch (message) { case WM_CREATE: GetClientRect(hWnd, &rect); hEditWindow = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL, 0, 0, rect.right, rect.bottom, hWnd, NULL, hInst, NULL); SendMessage(hEditWindow, EM_SETLIMITTEXT, (WPARAM)TEXT_SIZE, 0); Data.hEditWindow = hEditWindow; Data.hWnd = hWnd; Data.ExeFlag = TRUE; DWORD ID; if((Thread = CreateThread(NULL, 0, MyThread, (LPVOID)&Data, 0, &ID)) == NULL){ MessageBox(hWnd, "スレッドが作成できませんでした", "Error", MB_OK); DestroyWindow(hWnd); } break; case WM_SIZE: GetClientRect(hWnd, &rect); MoveWindow(hEditWindow, rect.left, rect.top, rect.right, rect.bottom, TRUE); break; case WM_DESTROY: Data.ExeFlag = FALSE; WaitForSingleObject(Thread, 3000); CloseHandle(Thread); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } DWORD WINAPI MyThread(LPVOID pData) { DATA *Data = (DATA *)pData; char string[32]; POINT pt; while(Data->ExeFlag){ GetCursorPos(&pt); InvalidateRect(Data->hWnd , NULL, FALSE); wsprintf(string, "%d : %d", pt.x, pt.y); Edit_SetText(Data->hEditWindow, string); Sleep(100); } return 0; }