Ogolnie to napisalem klase okna - rejestruje klase okna towrze je i Od razu tworze kontrolki - pozniej pokazuje okno. A co do Twojego rozwiazania fakt, byloby ok ale troche "naokoło". Jezeli nic nie wydumam/y to zrobie tak jak piszesz.
edit
Wymiekam... nie mam pojecia czemu to nie dziala, latam po stronach i jeszcze nic nie znalazlem ;/ aktualnie kod wyglada tak:
CreateWindowEx(NULL, "BUTTON", "Polacz!", WS_VISIBLE | WS_CHILD | WS_BORDER, 650, 40, 140, 30, hOkna, (HMENU)3, hThisInstance, NULL);
...
...
BUTTON_IMAGELIST bi;
HIMAGELIST lista=ImageList_Create(140,30, ILC_COLOR24 ,2,0);
if(lista==NULL)
MessageBox(0, "ERROR0", "", 0);
obraz=(HBITMAP)LoadImage(0,"D:\\tlobtn.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
obraz2=(HBITMAP)LoadImage(0,"D:\\tlobtn2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(obraz==NULL || obraz2==NULL)
MessageBox(0, "ERROR1", "", 0);
if(ImageList_Add(lista,obraz,NULL)<0)
MessageBox(0, "ERROR2", "", 0);
if(ImageList_Add(lista,obraz2,NULL)<0)
MessageBox(0, "ERROR3", "", 0);
bi.himl = lista;
bi.margin.bottom=1;
bi.margin.left=1;
bi.margin.right=1;
bi.margin.top=1;
bi.uAlign=BUTTON_IMAGELIST_ALIGN_TOP;
if(Button_SetImageList(GetDlgItem(hwnd, 3),&bi)==FALSE)
MessageBox(0, "ERROR4", "", 0);
Znajduje sie w obsludze WM_CREATE, oczywiscie msg ktory pojawia sie na ekranie to "ERROR4", zaden z poprzednich. Probowalem juz chyba wszystkiego... Myslalem tez nad obsluga komunikatu WM_DRAWITEM, przy czym musialem dodac styl buttona BS_OWNERDRAW a razem z nim przesal dzialac msg BM_SETIMAGE wiec to sie chyba mija z celem. Chyba ze lecialbym z bitblt ale czy to ma sens? Prosze o pomoc bo zwariuje. ;/
EDIT
Dobra, problem rozwiazany za pomoca BS_OWNERDRAW & WM_DRAWITEM.
case WM_DRAWITEM:
{
//static std::ofstream out("D:\\else.txt");
DRAWITEMSTRUCT* dr=(DRAWITEMSTRUCT*)lParam;
if(wParam==3)
{
//out<<dr->itemState<<std::endl;
if( dr->itemState==ODS_FOCUS || dr->itemState==0)
{
HDC hdcBitmapy=CreateCompatibleDC(dr->hDC);
HBITMAP hdcStary=(HBITMAP)SelectObject(hdcBitmapy,obraz2);
BitBlt(dr->hDC,0,0,140,30,hdcBitmapy,0,0,SRCCOPY);
SelectObject(hdcBitmapy,hdcStary);
DeleteDC(hdcBitmapy);
ReleaseDC(dr->hwndItem, hdcBitmapy );
return TRUE;
}
else
if( dr->itemState==17)
{
//out<<dr->itemState<<std::endl;
HDC hdcBitmapy=CreateCompatibleDC(dr->hDC);
HBITMAP hdcStary=(HBITMAP)SelectObject(hdcBitmapy,obraz);
BitBlt(dr->hDC,0,0,140,30,hdcBitmapy,0,0,SRCCOPY);
SelectObject(hdcBitmapy,hdcStary);
DeleteDC(hdcBitmapy);
ReleaseDC(dr->hwndItem, hdcBitmapy );
return TRUE;
}
return FALSE;
}
};
break;
Co dziwnego ODS_FOCUS byl jedynym statusem kontrolki jaki dostawalem w DRAWITEMSTRUCT, patrzylem kazy inny ktory zostal opisany na msdn po kolei i nic... az dalem else i wypisywalem do notatnika wartosci dr->itemState - tak doszedlem do rozwiazania problemu ;D. Mimo wszystko dziekuje stfu za zaangazowanie. Pozdro ;)
edit
Problemow ciag dalszy... Ustawiam tlo edita na przezroczyste w ten sposob:
case WM_CTLCOLOREDIT:
{
SetBkMode((HDC)wParam,TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
};
break;
Jest ok, napisze cos w edicie, pozniej jak kasuje tekst to normalnie kursor sie cofa a litery zostaja... Tak jakby sie nie odswiezal ;/. Jak temu zaradzic?
Problem z editem rozwiazany (moj poprzednik mial podobny problem ze static, po naprawieniu jego kodu dziala ;)) dla potomnych:
HBRUSH CreateTransparentBrush(HWND hwndParent, HWND hwndStatic)
{
HBRUSH hbr = (HBRUSH)GetProp(hwndStatic, "BRUSH");
if (!hbr)
{
RECT rc;
GetWindowRect(hwndStatic, &rc);
ScreenToClient(hwndParent, (POINT*)&rc);
HDC hdcBitmapy, hdc;
hdc = GetDC(hwndParent);
hdcBitmapy=CreateCompatibleDC(hdc);
HDC hdctmp=CreateCompatibleDC(GetDC(hwndParent));
HBITMAP bmptmp=CreateCompatibleBitmap(hdc,rc.right-rc.left,rc.bottom-rc.top);
SelectObject(hdctmp,bmptmp);
BitBlt(hdctmp,0,0,rc.right-rc.left,rc.bottom-rc.top,hdc,rc.left,rc.top,SRCCOPY);
DeleteDC(hdcBitmapy);
ReleaseDC(hwndParent, hdcBitmapy );
DeleteDC(hdctmp);
ReleaseDC(hwndParent, hdctmp );
hbr = CreatePatternBrush(bmptmp);
SetProp(hwndStatic, "BRUSH", (HANDLE)hbr);
}
return hbr;
}
}
case WM_CTLCOLOREDIT:
{
SetBkMode((HDC)wParam,TRANSPARENT);
return (LRESULT)CreateTransparentBrush(hwnd, GetDlgItem(hwnd, 301));
};
break;
Pozostaje jeszcze 'tylko' problem z listview... pozdro