Не пойму как пользоваться этой ImageList_DragMove..
написал небольшой тестовый пример..
хочется чтобы создалось окно на котором рисовался бы синий фон, когда кликаю по нему хочется чтобы создалась картинка в виде красного квадрата, и я драгил ее по экрану..возникли 2 проблемы
1. Картинка не красный квадрат, с серый!! причем в темно серую крапинку!!!
2. Если увести картинку левее или выше синего окна, то она вообще почемуто пропадает!(( а правее или ниже — можно.
Кто виноват и что делать?
#include "windows.h"
#include "commctrl.h"
#include <assert.h>
#pragma comment (lib, "comctl32.lib")
LRESULT CALLBACK TestWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
bool RegisterTestClass (HINSTANCE hInstance)
{
WNDCLASS myClass = {};
myClass.style = CS_HREDRAW | CS_VREDRAW;
myClass.lpfnWndProc = (WNDPROC) TestWindowProc;
myClass.cbClsExtra = 0;
myClass.cbWndExtra = 0;
myClass.hInstance = hInstance;
myClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
myClass.hCursor = LoadCursor(NULL, IDC_ARROW);
myClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
myClass.lpszClassName = L"TestClass";
ATOM atomTestWin = RegisterClass (&myClass);
return atomTestWin != 0;
}
HWND CreateTestWnd (HINSTANCE hInstance)
{
HWND ret = 0;
ret = CreateWindow (L"TestClass", L"A",
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN , 200, 200, 300, 300, 0, 0, hInstance, 0);
return ret;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
InitCommonControls ();
if (RegisterTestClass (hInstance))
{
HWND hWnd = CreateTestWnd (hInstance);
if (hWnd)
{
ShowWindow (hWnd, SW_SHOW);
BOOL bRet = FALSE;
MSG msg = {};
while((bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
return -1;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
return 0;
}
LRESULT CALLBACK TestWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT ret = 0;
static bool captureSet = false;
switch (uMsg)
{
case WM_LBUTTONUP:
if (captureSet)
{
::ImageList_DragLeave (0);
::ReleaseCapture ();
}
break;
case WM_MOUSEMOVE:
if (captureSet)
{
POINT pnt = {LOWORD (lParam), HIWORD (lParam)};
::ClientToScreen (hwnd, &pnt);
::ImageList_DragMove (pnt.x, pnt.y);
}
break;
case WM_LBUTTONDOWN:
{
ret = 1;
HDC comDC = ::CreateCompatibleDC (0);
HBITMAP hBitmap = ::CreateCompatibleBitmap (comDC, 100, 100);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject (comDC, hBitmap);
HBRUSH redBrush = ::CreateSolidBrush (0x000000ff);
RECT rc = {0, 0, 100, 100};
::FillRect (comDC, &rc, redBrush);
::SelectObject (comDC, hOldBitmap);
DeleteDC (comDC);
HIMAGELIST hImgLst = ::ImageList_Create (100, 100, ILC_COLOR32, 1, 0);
int idx = ::ImageList_Add (hImgLst, hBitmap, 0);
::SetCapture (hwnd);
captureSet = true;
::ImageList_BeginDrag (hImgLst, idx, 50, 50);
POINT cPos = {};
::GetCursorPos (&cPos);
::ImageList_DragEnter (0, cPos.x, cPos.y);
}
break;
case WM_ERASEBKGND:
{
ret = 1;
}
break;
case WM_PAINT:
{
ret = 1;
PAINTSTRUCT pntStruct = {};
::BeginPaint (hwnd, &pntStruct);
HBRUSH blueBrush = ::CreateSolidBrush (0x00ff0000);
::FillRect (pntStruct.hdc, &pntStruct.rcPaint, blueBrush);
DeleteObject (blueBrush);
::EndPaint (hwnd, &pntStruct);
}
break;
case WM_DESTROY:
::PostQuitMessage (0);
ret = 1;
break;
}
if (!ret)
ret = ::DefWindowProc (hwnd, uMsg, wParam, lParam);
return ret;
}