この画像を、

平行四辺形をターゲットにして転送します。

画像が斜めになります。

PlgBlt関数で行えます。

 

〇プログラム例

 

  1. #include <windows.h>
  2.  
  3. static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  4. {
  5.     HDC hdc;
  6.     PAINTSTRUCT ps;
  7.     POINT pt;
  8.     LPSTR str = TEXT("こんにちは、日本");
  9.     static HDC hMemDC;
  10.     static HBITMAP hForeBmp;
  11.     static HFONT hFont[2];
  12.     LPSTR FORE_BitMapFile = TEXT("カップ.bmp");
  13.      static HINSTANCE hInstance;
  14.     static POINT point[3] = { {50,50},{350,0},{0,300} };
  15.  
  16.     static BITMAP bmpFore;
  17.     static BLENDFUNCTION blendFunc = { AC_SRC_OVER,0,200,0 };
  18.  
  19.     switch (uMsg)
  20.     {
  21.     case WM_DESTROY:
  22.         DeleteDC(hMemDC);
  23.         DeleteObject(hForeBmp);
  24.         DeleteObject(hFont[0]);
  25.  
  26.         PostQuitMessage(0);
  27.         return 0;
  28.  
  29.     case WM_CREATE:
  30.         hFont[0] = CreateFont(
  31.             40, 0, 0, 0,
  32.             FW_NORMAL, FALSE, FALSE, FALSE,
  33.             SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
  34.             CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
  35.             VARIABLE_PITCH | FF_DONTCARE, L"メイリオ"
  36.         );
  37.         ShowWindow(hWnd, SW_SHOW);
  38.         hInstance = (HINSTANCE)GetWindowLong(hWnd, GWLP_HINSTANCE);
  39.         hdc = GetDC(hWnd);
  40.         hMemDC = CreateCompatibleDC(hdc);
  41.         hForeBmp = LoadImage(hInstance, FORE_BitMapFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  42.  
  43.         GetObject(hForeBmp, sizeof(BITMAP), &bmpFore);
  44.         ReleaseDC(hWnd, hdc);
  45.         return 0;
  46.  
  47.     case WM_PAINT:
  48.         hdc = BeginPaint(hWnd, &ps);
  49.         SelectObject(hMemDC, hForeBmp);
  50.  
  51.         //転送
  52.         PlgBlt(hdc, point, hMemDC, 0, 0,
  53.             bmpFore.bmWidth, bmpFore.bmHeight, NULL, 0, 0);
  54.         SelectObject(hdc, hFont[0]);
  55.         SetTextColor(hdc, RGB(0, 0xFF, 0));
  56.         TextOut(hdc, 0, 0, str, lstrlen(str));
  57.         EndPaint(hWnd, &ps);
  58.  
  59.         return 0;
  60.     }
  61.  
  62.     return DefWindowProc(hWnd, uMsg, wParam, lParam);
  63.  
  64. }
  65.  
  66. int APIENTRY wWinMain(
  67.     _In_ HINSTANCE hInstance,
  68.     _In_opt_ HINSTANCE hPrevInstance,
  69.     _In_ LPWSTR ipCmdLine,
  70.     _In_ int nCmdShow
  71. ) {
  72.  
  73.     WNDCLASSEXW wcex;
  74.  
  75.     wcex.cbSize = sizeof(WNDCLASSEX);
  76.  
  77.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  78.     wcex.lpfnWndProc = WndProc;
  79.     wcex.cbClsExtra = 0;
  80.     wcex.cbWndExtra = 0;
  81.     wcex.hInstance = hInstance;
  82.     wcex.hIcon = NULL;
  83.     wcex.hCursor = NULL;
  84.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  85.     wcex.lpszMenuName = NULL;
  86.     wcex.lpszClassName = TEXT("TestWindow");
  87.     wcex.hIconSm = NULL;
  88.  
  89.     RegisterClassExW(&wcex);
  90.  
  91.     HWND hWnd = CreateWindowEx(0UL, TEXT("TestWindow"), TEXT("日本"), WS_OVERLAPPEDWINDOW,
  92.         CW_USEDEFAULT, 0, 400, 400, NULL, NULL, hInstance, NULL);
  93.  
  94.     if (!hWnd)
  95.     {
  96.         return FALSE;
  97.     }
  98.  
  99.     MSG msg;
  100.  
  101.     while (GetMessage(&msg, NULL, 0, 0))
  102.     {
  103.         DispatchMessage(&msg);
  104.     }
  105.  
  106.     return (int)msg.wParam;
  107. }