ImageList_DragMove
От: LuckLess Россия  
Дата: 15.03.07 12:47
Оценка:
Не пойму как пользоваться этой 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;
   }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.