Сделать кликабельный контрол

Тема в разделе "WASM.BEGINNERS", создана пользователем ATX, 10 дек 2007.

  1. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Приветствую всех!

    Нужно сделать в окне много-много (200+) кликабельных контролов в виде квадратов, чтоб при клике на оные - менять их цвет (что-то вреде редактора битмапа с зумом).
    Поскаджите как мне лучше зеализовать такую задачку, а главное как создать контролы и обрабатывать клики на них (MASM/RADASM).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    делаешь owner-draw button и обрабатываешь WM_DRAWITEM , чтобы отрисовать.

    вот небольшой пример - в диалоговом окне я делал небольшую красную кнопку, вот код для отрисовки:
    Код (Text):
    1.     case WM_DRAWITEM:
    2.  
    3.         if( wParam == IDC_REDBUTTON )
    4.         {
    5.             static bool status=false;
    6.             LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT)lParam;
    7.  
    8.             COLORREF color;
    9.  
    10.             if( pdis->itemAction==ODA_SELECT )
    11.             {
    12.                 status = !status;
    13.             }
    14.  
    15.             color = status?RGB(0,0,0):RGB(255,0,0);
    16.  
    17.             HBRUSH hbr = CreateSolidBrush( color );
    18.             FillRect(pdis->hDC, &pdis->rcItem, hbr);
    19.             DeleteObject(hbr);
    20.         }
    21.  
    22.         break;
    таким образом выходит красная кнопка, которая при клике на ней становится черной.
    клик обрабатывается как обычно WM_COMMAND'ом.
     
  3. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    ATX
    т.е. если твой битмап будет иметь разрешение 800х600, ты будешь создавать 480 тыс. кнопок? :)

    Тут нужно делать один контрол, отслеживать, куда в нем щелкнул пользователь и в том месте рисовать точку (прямоугольник при зуме).
     
  5. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    rmn
    Пример с редактором битмэпа - только пример, реально контролов будет 200-300.
    Посему годится и варинт с кнопками.
     
  6. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Great
    Все супер, тока я на С не очень :-(
    Если можно тоже самое на MASMе!?
    + как мне лучше создавать сами кнопки (желательно чтобы они не имели эфекта нажатия)?

    Т.е. мне нужно получить что-то вроде такой картинки....
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Хватит и окна без контролов:
    На рисунке - сетка 7*24=168 квадратов => хватит 7*24 битов => 24 байтов памяти.
    Задаются начальные байты. Задаются две кисти.
    По WM_LBUTTONDOWN: если курсор в одном из квадратов => инверсия соотвествующего бита.
    По WM_PAINT: пробежка по квадратам (двойной .while) и FillRect каждому, кисть зависит от состояния бита.

    Если все-таки контрол: static (1 штука) с SS_NOTIFY, вместо WM_LBUTTONDOWN - WM_COMMAND.
     
  8. ATX

    ATX New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2006
    Сообщения:
    145
    Сделал кнопки в цикле ф-цией CreateWindowEx со стилем BS_OWNERDRAW и покрасил их - порядок.
    Теперь немогу понять как мне узнать в какой цвет окрашена какждая кнопка (при каждом нажатии на кнопку она должна менять цвет, соответственно нужно определять текущий цвет)?