CreateThread関数でスレッドを作成できます。

ただし、C ランタイム ライブラリを使用する場合は、

_beginthreadexを使用します。

 

ウィンドウで、左クリックすると、

カップが描画されます。

描画は、CreateThreadで作成されたスレッド関数から行われます。

 

〇実行結果

 

〇プログラム例

 

  1. #include <windows.h>
  2.  
  3. typedef struct _ThreadParam {
  4.     HWND owner;
  5.     HDC hMemDC;
  6.     SIZE size;
  7.     POINT point;
  8. } ThreadParam;
  9.  
  10. DWORD WINAPI ThreadFunc(LPVOID vdParam) {
  11.     HDC hdc;
  12.     RECT rect;
  13.     ThreadParam param;
  14.     BOOL xIncrease=TRUE, yIncrease=TRUE;
  15.     
  16.     param.owner = ((ThreadParam *)vdParam)->owner;
  17.     param.size.cx = ((ThreadParam *)vdParam)->size.cx;
  18.     param.size.cy = ((ThreadParam*)vdParam)->size.cy;
  19.     param.point.x = ((ThreadParam*)vdParam)->point.x;
  20.     param.point.y = ((ThreadParam*)vdParam)->point.y;
  21.     param.hMemDC= ((ThreadParam*)vdParam)->hMemDC;
  22.  
  23.     GetClientRect(param.owner, &rect);
  24.  
  25.     hdc = GetDC(param.owner);
  26.     
  27.     GetClientRect(param.owner, &rect);
  28.  
  29.     BitBlt(hdc, param.point.x, param.point.y,
  30.         param.point.x + param.size.cx, param.point.y + param.size.cy,
  31.         param.hMemDC, 0, 0, SRCCOPY);
  32.  
  33.     ReleaseDC(param.owner, hdc);
  34.     return TRUE;
  35.     
  36. }
  37.  
  38. static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  39. {
  40.     HDC hdc;
  41.     static HDC hMemDC;
  42.     PAINTSTRUCT ps;
  43.     LPSTR str = TEXT("こんにちは、日本");
  44.     static HBITMAP hForeBmp;
  45.     static HFONT hFont[2];
  46.     LPSTR FORE_BitMapFile = TEXT("sカップ.bmp");
  47.     static BITMAP bmpFore;
  48.     static HBRUSH hBrush;
  49.     RECT rect;
  50.     static POINT pt;
  51.     static BOOL xIncrease, yIncrease;
  52.  
  53.     ThreadParam param;
  54.     DWORD dwID;
  55.  
  56.     switch (uMsg)
  57.     {
  58.     case WM_DESTROY:
  59.         DeleteDC(hMemDC);
  60.  
  61.         DeleteObject(hForeBmp);
  62.         DeleteObject(hFont[0]);
  63.  
  64.         PostQuitMessage(0);
  65.         return 0;
  66.  
  67.     case WM_LBUTTONDOWN:
  68.         param.owner = hWnd;
  69.         param.point.x = LOWORD(lParam);
  70.         param.point.y = HIWORD(lParam);
  71.         param.size.cx = bmpFore.bmWidth;
  72.         param.size.cy = bmpFore.bmHeight;
  73.         param.hMemDC = hMemDC;
  74.         CreateThread(NULL, 0, ThreadFunc, (LPVOID)&param, 0, &dwID);
  75.         return 0;
  76.  
  77.     case WM_CREATE:
  78.         hFont[0] = CreateFont(
  79.             40, 0, 0, 0,
  80.             FW_NORMAL, FALSE, FALSE, FALSE,
  81.             SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
  82.             CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  83.             VARIABLE_PITCH | FF_DONTCARE, L"メイリオ"
  84.         );
  85.         ShowWindow(hWnd, SW_SHOW);
  86.         hdc = GetDC(hWnd);
  87.         hMemDC = CreateCompatibleDC(hdc);
  88.         hForeBmp = LoadImage(NULL, FORE_BitMapFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  89.         GetObject(hForeBmp, sizeof(BITMAP), &bmpFore);
  90.         SelectObject(hMemDC, hForeBmp);
  91.  
  92.         return 0;
  93.  
  94.     case WM_PAINT:
  95.         hdc = BeginPaint(hWnd, &ps);
  96.         SelectObject(hdc, hFont[0]);
  97.         SetTextColor(hdc, RGB(0, 0xFF, 0));
  98.         TextOut(hdc, 0, 0, str, lstrlen(str));
  99.  
  100.         EndPaint(hWnd, &ps);
  101.  
  102.         return 0;
  103.     }
  104.  
  105.     return DefWindowProc(hWnd, uMsg, wParam, lParam);
  106.  
  107. }
  108.  
  109. int APIENTRY wWinMain(
  110.     _In_ HINSTANCE hInstance,
  111.     _In_opt_ HINSTANCE hPrevInstance,
  112.     _In_ LPWSTR ipCmdLine,
  113.     _In_ int nCmdShow
  114. ) {
  115.  
  116.     WNDCLASSEXW wcex;
  117.  
  118.     wcex.cbSize = sizeof(WNDCLASSEX);
  119.  
  120.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  121.     wcex.lpfnWndProc = WndProc;
  122.     wcex.cbClsExtra = 0;
  123.     wcex.cbWndExtra = 0;
  124.     wcex.hInstance = hInstance;
  125.     wcex.hIcon = NULL;
  126.     wcex.hCursor = NULL;
  127.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  128.     wcex.lpszMenuName = NULL;
  129.     wcex.lpszClassName = TEXT("TestWindow");
  130.     wcex.hIconSm = NULL;
  131.  
  132.     RegisterClassExW(&wcex);
  133.  
  134.     HWND hWnd = CreateWindowEx(0UL, TEXT("TestWindow"), TEXT("日本"), WS_OVERLAPPEDWINDOW,
  135.         CW_USEDEFAULT, 0, 500, 400, NULL, NULL, hInstance, NULL);
  136.  
  137.     if (!hWnd)
  138.     {
  139.         return FALSE;
  140.     }
  141.  
  142.     MSG msg;
  143.  
  144.     while (GetMessage(&msg, NULL, 0, 0) > 0) {
  145.         DispatchMessage(&msg);
  146.     }
  147.  
  148.     return (int)msg.wParam;
  149. }