Делаем кнопку рисования владельца прозрачной на произвольном фоне в WINCE - PullRequest
1 голос
/ 23 марта 2010

Я пытаюсь разместить кнопку рисования владельца на заднем плане. У меня нет проблем с этим, когда фон имеет сплошной цвет, но если фон является изображением, я не могу получить правильный HDC (дескриптор к контексту устройства) для Bitblt () области, которую покрывает кнопка.

HDC, который передается как часть DRAWITEMSTRUCT, дает мне серую область кнопки по умолчанию. Если я пытаюсь получить родителя HWND, а затем контекст устройства этого, т.е.

pdc = GetDC(GetParent(hWnd));

тогда фон, который получает BitBlt'd, является фоном последнего нарисованного окна.

Надеюсь, этот вопрос имеет смысл.

это код, который у меня есть:

  pdis = (LPDRAWITEMSTRUCT)(lParam);
  hdc = pdis->hDC;
  button = pdis->CtlID - IDC_BUTOFFSET;

  //pdc = GetDC((hWnd));
  pdc = GetDC(GetParent(hWnd));

  hbm = CreateCompatibleBitmap(pdc,  Buttons_[button]->bc.Size.cx, Buttons_[button]->bc.Size.cy);
  SelectObject(hdc, hbm);
  BitBlt(hdc, 0, 0, Buttons_[button]->bc.Size.cx, Buttons_[button]->bc.Size.cy, 
     pdc, Buttons_[button]->bc.Position.x, Buttons_[button]->bc.Position.y, SRCCOPY);

TIA С наилучшими пожеланиями Завершает

1 Ответ

0 голосов
/ 23 марта 2010

Кажется, то, что я делал, более или менее правильно. Однако Bitblt копирует часть окна с уже размещенной кнопкой, поэтому я фактически копирую фон кнопки по умолчанию и затем накладываю его поверх кнопки рисования владельца. Немного тупой, но вполне логичный.

Я ненавижу, когда компьютеры делают то, что вы им говорите, а не то, что вы хотите, чтобы они делали. : P

Теперь я должен выяснить, как скопировать фон, поскольку функция ownerdraw не знает, что окно под кнопкой отображается в любой момент времени ...

Спасибо тем, кто взглянул на вопрос.

Кстати:

pdc = GetDC (GetParent (hWnd)); // НЕ ПРАВИЛЬНО
pdc = GetDC (hWnd); // лучше

...