C++/ошибка hdc

Тема в разделе "WASM.WIN32", создана пользователем dShell, 12 дек 2004.

  1. dShell

    dShell New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2004
    Сообщения:
    13
    Может тема и проскакивала тут, но я не нашел, посему и спрашиваю:

    Есть код. Я виртуально делаю разметку по квадратам на некотором rect1. Цвет у того rect1, допустим 1. Если повозить мышь по нему, то появится мальнеький rent2 с цветом 2. То есть за мышкой бегает квадратик у которого левая верхняя координата кратна некоторому числу.

    Как делал:

    WM_PAINT рисует rect1

    WM_MOUSEMOVE следит за мышью и рисует rect2. Но встает вопрос о перезакрышивание rect2 если мышь покидает его (т.е. чтобы не рисовать по rect1 дофига rect2). Я просто заново ресую как в WM_PAINT (размер правда сильно увеличивается)

    Но тут возникает ошибка: если некоторое время по елозить мышь по этому полю - поле больше н закрышивается. Массивы pole1, mclolor - остаются неизменными. Просто теряется hdc. Думаю, я просто не успеваю закрыть его и возникает коллизия обращения.

    сорс и бинарик в аттаче.

    [​IMG] _57996987__seawar00.zip
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Каждый CreateSolidBrush() должен сопровождаться DeleteObject().
     
  3. dShell

    dShell New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2004
    Сообщения:
    13
    Спасибо большое - помогло. Я думал что DeletObject должен использоваться в паре с SelectObject().

    Так выглядит исправленный сорс:
    Код (Text):
    1.  
    2. ...
    3. SetRect(&r, x + 10, y + 20, x + 10 + 20, y + 20 + 20);
    4. hb = CreateSolidBrush(0x0000FF00);
    5. FillRect(hdc, &r, hb);
    6. DeleteObject(hb);
    7. ...
    8.  
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    SelectObject тоже хитрая штука - перед разрушением (DeleteDC) или возвратом (ReleaseDC) - все выбранные объекты должны быть возвращены через тот же SelectObject:
    Код (Text):
    1.  
    2. HBRUSH hBrushFromDC = (HBRUSH) SelectObject (hDC, hYourOwnBrush);
    3.  
    4. //... paint with your own brush...
    5.  
    6. SelectObject (hDC, hBrushFromDC);
    7. ReleaseDC (hwnd, hDC);
    8.