Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как наложить BITMAP на кнопку


Автор: coach 28.8.2006, 22:30
Есть кнопка, созданная через CreateWindow()
как можно наложить на эту кнопку BITMAP

Автор: chozen 28.8.2006, 23:27
Ну, что ж:
 - получаем DC кнопеля
 - создаем tagPAINTSTRUCT  smile  Объявляем, точнее.
 - создаем CreateCompatibleDC к DC кнопки, CreateCompatibleBitmap к DC кнопеля
 - заполняем структуру BITMAPINFO
 - далее SetDIBits и SelectObject к компатибл dc

Кароч, щас не могу найти так быстро исходник... Надо, напиши, поИСЧУ!

Автор: GremlinProg 28.8.2006, 23:30
http://forum.vingrad.ru/index.php?showtopic=75779

Автор: RDN_ResidentS 26.12.2006, 15:45
Цитата

chozen

Кароч, щас не могу найти так быстро исходник... Надо, напиши, поИСЧУ!


Пожалуйста найди исходник и выложи... ОК? Очень нужен!!!

И еще кто знает как наложить BITMAP на кнопку, пожалуйста  опишите алгоритм создания.
Р.S. пожалуйста напишите алгоритм нормальным языком без фени... и прочих выражений, на языке С++.

Автор: Aleksandor 26.12.2006, 22:17
Цитата(coach @ 28.8.2006,  22:30)
Есть кнопка, созданная через CreateWindow()
как можно наложить на эту кнопку BITMAP

В смысле background сделать для кнопки? Или рисовать всю кнопку самому? 

Автор: RDN_ResidentS 27.12.2006, 22:26
Цитата

Aleksandor
Цитата

Цитата(coach @ 28.8.2006,  22:30)
Есть кнопка, созданная через CreateWindow()
как можно наложить на эту кнопку BITMAP


В смысле background сделать для кнопки? Или рисовать всю кнопку самому? 


Напиши и как background сделать для кнопки, и как рисовать всю кнопку самому.
Пожалуйста, очень надо! smile 
 smile  smile  smile 

Автор: Aleksandor 27.12.2006, 22:58
Ну если самому рисовать то OWNERDRAW примерно так
создаешь кнопку (кнопка это тоже окно)

    hwndButton1 = CreateWindow("BUTTON","", WS_CHILD | BS_OWNERDRAW, 
    5, rcRebar.bottom+3, 55, 8,   hWnd, (HMENU) ID_BUTTON1,  hInst, NULL); 

загружаешь для нее битмапы (нажатая, отпущена)
   hbmClose = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP19)); 
   hbmCloseA = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP20)); 

обрабатываешь сообщения WM_DRAWITEM
Код

         case WM_DRAWITEM: 
{
        LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam; 
        if (lpdis->CtlType!=ODT_BUTTON) break;
        hdcMem = CreateCompatibleDC(lpdis->hDC); 

        if (lpdis->CtlID==ID_BUTTON9) {
        if (lpdis->itemState & ODS_SELECTED) SelectObject(hdcMem, hbmCloseA);          
        else SelectObject(hdcMem, hbmClose); }

StretchBlt( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right - lpdis->rcItem.left,  lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, 0, 0, 55, 8, SRCCOPY); 

            DeleteDC(hdcMem);             
}
            return TRUE; 


 Ну еще приходится сабклассить кнопки чтобы обрабатывать переключение фокуса и табуляции, у штатных это все включено. Кроме того стили XP не поддерживаются. В общем мороки много  smile  Приходится все ручками делать.

Насчет бакграунда проще но не могу сейчас писать, может завтра.

Автор: RDN_ResidentS 27.12.2006, 23:21
Спасибо огромное Aleksandor!!!!

Автор: Kornev 1.5.2007, 18:46
Александр, громаднейшее спасибо!!!!!
только по моему в CreateWindow нужно ещё добавить | WS_VISIBLE
По крайней мере у меня без єтого работать не стало.
А остальное - СУПЕР
 smile

Добавлено через 3 минуты и 5 секунд
Подскажи пожалуйста, а как можно сделать чтоб кнопка ещё меняла свой вид, когда на неё наводишь курсор?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)