Нанесение изображения поверх растрового изображения

В моем диалоговом окне WIN32 я рисую круг (растровый ресурс) и хочу, чтобы изображение располагалось рядом с ним. Я не могу заставить курсор находиться поверх изображения круга:

Красный курсор закрыт изображением круга

Я рисую и круг, и курсор как статические окна:

Круг:

HWND hRingImage= CreateStatics(m_hDlg, hInst, SS_BITMAP | WS_BORDER, rc, m_ID, L"");
HANDLE hRingImage1 =  LoadImage(hInst, MAKEINTRESOURCE(IDB_RING50), IMAGE_BITMAP,m_Radius*2, m_Radius*2,   LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS );
SendMessage(hRingImage,STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hRingImage1);
m_hRingImage = hRingImage;
if (!Enabled)
    ShowWindow(hRingImage, SW_HIDE);

Красный курсор:

m_hIndicator= CreateStatics(m_hDlg, GetModuleHandle(NULL), SS_ICON , rc, m_ID+10, L"");
HANDLE hRingImage1 =  LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_INDICATOR), IMAGE_CURSOR,8, 8,   LR_DEFAULTSIZE|LR_SHARED  );
SendMessage(m_hIndicator,STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hRingImage1);
SetWindowPos(m_hIndicator, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE); 
ShowWindow(m_hIndicator, SW_SHOW);

Я не вижу, что делает круг самым верхним, в то время как курсоры всегда внизу (странно, они также находятся под линиями диалогового окна frame.


person Shaul    schedule 11.09.2014    source источник
comment
Я не знаком с функциями win32gui и CreateStatics, но, насколько я понимаю, вы создаете окно для курсора, а затем перемещаете это окно, чтобы имитировать курсор?   -  person γηράσκω δ' αεί πο    schedule 11.09.2014
comment
Ну да. Я надеялся, что курсор даст мне прозрачность, но он действует как изображение. Я должен был, вероятно, использовать GDI+ и использовать какое-то преобразование.   -  person Shaul    schedule 11.09.2014


Ответы (2)


Вы можете установить курсор вручную:

First load the cursor image-> HCURSOR hCursorRing = LoadCursor(...);

BOOL CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
    switch (message){
        case WM_CLOSE:
            DestroyWindow(hDlg);

            break ;

        case WM_SETCURSOR:
            if((HWND)wParam == hRingImage){
                SetCursor(hCursorRing);

                return true;
            }

            break ;

        default:   //for messages that we don't deal with
            return false;
    }

    return false;
}

Вальтер

person γηράσκω δ' αεί πο    schedule 11.09.2014
comment
Я использовал неправильный термин «курсор». Мне нужно иметь маленькое изображение (с прозрачностью), которое программно перемещается поверх другого изображения (кольца). - person Shaul; 11.09.2014
comment
@Shaul В какой области будет двигаться маленькое изображение? - person γηράσκω δ' αεί πο; 12.09.2014

Мне пришлось сделать следующее:

 ShowWindow(m_hIndicator, SW_HIDE);
 MoveWindow(m_hIndicator, loc.x-3,loc.y-3,8,8, TRUE); 
 ShowWindow(m_hIndicator, SW_SHOW);

«Курсор», который на самом деле является просто растровым изображением, расположен правильно над поверху всех других растровых изображений.

person Shaul    schedule 13.09.2014