I have tried out three methods to copy part of window to a dc.
The first method is Gdip_CreateBitmapFromFile, It is ok.
The second is via Gdip_BitmapFromHWND and PrintWindows. If the param is hwnd of a window, it works. While it's a control, only a solid rect filled with color black is showed. what's the reason?
The third is via BitBlt. In this case, it seems that all the black pixels become transparent and only white pixels remain. how to solve this problem?
Code:
#Include Gdip.ahk
GUI_INDEX_DC := 2
OnMessage(0x200, "WM_MOUSEMOVE")
Gui, +LastFound +AlwaysOnTop
$hGUI1 := WinExist()
Gui, Add, Pic, x20 y20 hwnd$hBTN, test.jpg
Gui, Show, AutoSize
Return
GuiClose:
ExitApp
F1::
CreateGUI_DC1("test.jpg")
Return
F2::
CreateGUI_DC2()
Return
F3::
CreateGUI_DC3()
Return
Esc::
Gui, %GUI_INDEX_DC%: Destroy
Return
WM_MOUSEMOVE(wParam, lParam, uMsg, hWnd)
{
local X, Y
CoordMode, Mouse, Screen
MouseGetPos, X, Y
X -= nWidth / 2, Y -= nHeight / 2
DllCall("UpdateLayeredWindow"
, "Uint", $hGui_DC, "Uint", 0
, "int64P", X|Y<<32
, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0)
}
CreateGUI_DC1(File)
{
global
local hDC_Scr := CreateCompatibleDC(0)
local pToken := Gdip_Startup()
local pBitmap := Gdip_CreateBitmapFromFile(File)
nWidth := Gdip_GetImageWidth(pBitmap)
nHeight := Gdip_GetImageHeight(pBitmap)
local hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
local oBitmap :=SelectObject(hDC_Scr, hBitmap)
Gui, %GUI_INDEX_DC%: +LastFound -Caption +E0x80000 +ToolWindow +AlwaysOnTop
$hGui_DC := WinExist()
UpdateLayeredWindow($hGui_DC, hDC_Scr, 0, 0, nWidth, nHeight, 255)
Gui, %GUI_INDEX_DC%: Show, W%nWidth% H%nHeight%
SelectObject(hDC_Scr, oBitmap)
DeleteObject(hBitmap)
DeleteDC(hDC_Scr)
}
CreateGUI_DC2()
{
global
ControlGetPos, , , nWidth, nHeight, , ahk_id %$hBTN%
local hDC_Scr :=CreateCompatibleDC(0)
local pToken := Gdip_Startup()
local pBitmap := Gdip_BitmapFromHWND($hBTN)
local hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
local oBitmap :=SelectObject(hDC_Scr, hBitmap)
Gui, %GUI_INDEX_DC%: +LastFound -Caption +E0x80000 +ToolWindow +AlwaysOnTop
$hGui_DC := WinExist()
UpdateLayeredWindow($hGui_DC, hDC_Scr, 0, 0, nWidth, nHeight, 255)
Gui, %GUI_INDEX_DC%: Show, W%nWidth% H%nHeight%
SelectObject(hDC_Scr, oBitmap)
DeleteObject(hBitmap)
DeleteDC(hDC_Scr)
}
CreateGUI_DC3()
{
global
ControlGetPos, , , nWidth, nHeight, , ahk_id %$hBTN%
Gui, %GUI_INDEX_DC%: +LastFound -Caption +E0x80000 +ToolWindow +AlwaysOnTop
$hGui_DC := WinExist()
local pToken := Gdip_Startup()
local hDC_Scr :=CreateCompatibleDC(0)
local hBitmap :=CreateDIBSection(nWidth, nHeight)
local oBitmap :=SelectObject(hDC_Scr, hBitmap)
local sDC :=GetDC($hBTN)
BitBlt(hDC_Scr, 0, 0, nWidth, nHeight, sDC, 0, 0, 0x00CC0020) ; SRCCOPY
UpdateLayeredWindow($hGui_DC, hDC_Scr, 0, 0, nWidth, nHeight, 255)
Gui, %GUI_INDEX_DC%: Show, W%nWidth% H%nHeight%
Gdip_Shutdown(pToken)
SelectObject(hDC_Scr, oBitmap)
DeleteObject(hBitmap)
DeleteDC(hDC_Scr)
DeleteDC(sDC)
}