OSDN Git Service

Add support for high DPI displays.
[ffftp/ffftp.git] / misc.c
diff --git a/misc.c b/misc.c
index 4b05cf1..7beef23 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -76,6 +76,9 @@ extern HWND hHelpWin;
 \r
 static DIALOGDATA *DialogData;         /* 入力ダイアログデータ */\r
 static int HelpPage;\r
+// 高DPI対応\r
+static int DisplayDPIX;\r
+static int DisplayDPIY;\r
 \r
 \r
 \r
@@ -1963,3 +1966,68 @@ void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size)
        }\r
 }\r
 #endif\r
+\r
+// 高DPI対応\r
+void QueryDisplayDPI()\r
+{\r
+       HDC hDC;\r
+       if(DisplayDPIX == 0)\r
+       {\r
+               if(hDC = GetDC(NULL))\r
+               {\r
+                       DisplayDPIX = GetDeviceCaps(hDC, LOGPIXELSX);\r
+                       DisplayDPIY = GetDeviceCaps(hDC, LOGPIXELSY);\r
+                       ReleaseDC(NULL, hDC);\r
+               }\r
+       }\r
+}\r
+\r
+int CalcPixelX(int x)\r
+{\r
+       QueryDisplayDPI();\r
+       return (x * DisplayDPIX + 96 / 2) / 96;\r
+}\r
+\r
+int CalcPixelY(int y)\r
+{\r
+       QueryDisplayDPI();\r
+       return (y * DisplayDPIY + 96 / 2) / 96;\r
+}\r
+\r
+HBITMAP ResizeBitmap(HBITMAP hBitmap, int UnitSizeX, int UnitSizeY)\r
+{\r
+       HBITMAP hDstBitmap;\r
+       HDC hDC;\r
+       HDC hSrcDC;\r
+       HDC hDstDC;\r
+       BITMAP Bitmap;\r
+       HGDIOBJ hSrcOld;\r
+       HGDIOBJ hDstOld;\r
+       hDstBitmap = NULL;\r
+       if(hDC = GetDC(NULL))\r
+       {\r
+               if(hSrcDC = CreateCompatibleDC(hDC))\r
+               {\r
+                       if(hDstDC = CreateCompatibleDC(hDC))\r
+                       {\r
+                               if(GetObject(hBitmap, sizeof(BITMAP), &Bitmap) > 0)\r
+                               {\r
+                                       if(hDstBitmap = CreateCompatibleBitmap(hDC, CalcPixelX((Bitmap.bmWidth / UnitSizeX) * UnitSizeX), CalcPixelY((Bitmap.bmHeight / UnitSizeY) * UnitSizeY)))\r
+                                       {\r
+                                               hSrcOld = SelectObject(hSrcDC, hBitmap);\r
+                                               hDstOld = SelectObject(hDstDC, hDstBitmap);\r
+                                               SetStretchBltMode(hDstDC, HALFTONE);\r
+                                               StretchBlt(hDstDC, 0, 0, CalcPixelX((Bitmap.bmWidth / UnitSizeX) * UnitSizeX), CalcPixelY((Bitmap.bmHeight / UnitSizeY) * UnitSizeY), hSrcDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);\r
+                                               SelectObject(hSrcDC, hSrcOld);\r
+                                               SelectObject(hDstDC, hDstOld);\r
+                                       }\r
+                               }\r
+                               DeleteDC(hDstDC);\r
+                       }\r
+                       DeleteDC(hSrcDC);\r
+               }\r
+               ReleaseDC(NULL, hDC);\r
+       }\r
+       return hDstBitmap;\r
+}\r
+\r