Наложить на часть картинки цвет
От: dev_m  
Дата: 06.01.07 09:07
Оценка:
Мне необходимо на часть загруженной из файла картинки наложить определенный цвет.
Что я делаю не так
Вот мой код :
    static HDC            hDc;
    static HDC            hCompartibleDC;
    static HDC            hCompRectDC;
    static PAINTSTRUCT    ps;
    static HANDLE        hBitmap;
    static HANDLE        hOldBitmap;
    static HBRUSH        hBr;
    static HBRUSH        hWtBr;
    static BITMAP        Bmp;
    static RECT            rTmp;
    
    switch(msg)
    {
    case WM_INITDIALOG:
        hBitmap = LoadImage(NULL, __TEXT("BSub.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        hBr            = CreateSolidBrush(RGB(255, 232, 186));
        hWtBr        = CreateSolidBrush(RGB(255, 255, 255));
        GetObject(hBitmap, sizeof(Bmp), &Bmp);

        rTmp.top    = 0;
        rTmp.left    = 0;
        rTmp.bottom = Bmp.bmHeight;
        rTmp.right  = Bmp.bmWidth;
        break;
    case WM_PAINT:
        hDc = BeginPaint(hDlg, &ps);
        hCompartibleDC = CreateCompatibleDC(hDc);
        hCompRectDC       = CreateCompatibleDC(hDc);
        hOldBitmap       = SelectObject(hCompartibleDC, hBitmap);
        
        SelectObject(hCompRectDC, hBr);
        Rectangle(hCompRectDC, 10, 10, 100, 100);
        StretchBlt(hCompartibleDC, 0, 10, 50, 50, hCompRectDC, 0, 0, 50, 50, SRCAND);
        
        StretchBlt(hDc, rct.left, rct.top, rct.right - rct.left, rct.bottom - rct.top, hCompartibleDC, 0, 0, Bmp.bmWidth, Bmp.bmHeight, SRCCOPY);
        
        SelectObject(hCompartibleDC, hOldBitmap);
        DeleteObject(hOldBitmap);
        DeleteObject(hCompRectDC);
        DeleteObject(hCompartibleDC);
        EndPaint(hDlg, &ps);
        break;
    case WM_CLOSE:
        DeleteObject(hWtBr);
        DeleteObject(hBr);
        DeleteObject(hBitmap);
        EndDialog(hDlg, IDOK);
        return TRUE;
        break;


Результат работы программы — просто загруженная картинка.

Как вариант, работает такое,

hDc = BeginPaint(hDlg, &ps);
        hCompartibleDC = CreateCompatibleDC(hDc);
        hOldBitmap = SelectObject(hCompartibleDC, hBitmap);
        StretchBlt(hDc, rct.left, rct.top, rct.right - rct.left, rct.bottom - rct.top, hCompartibleDC, 0, 0, Bmp.bmWidth, Bmp.bmHeight, SRCCOPY);
        
        SelectObject(hCompartibleDC, hBr);
        SelectObject(hCompartibleDC, hBr);
        Rectangle(hCompartibleDC, 10, 10, 100, 100);
        StretchBlt(hDc, rct.left, rct.top, rct.right - rct.left, rct.bottom - rct.top, hCompartibleDC, 0, 0, Bmp.bmWidth, Bmp.bmHeight, SRCAND);
        SelectObject(hCompartibleDC, hOldBitmap);
        DeleteObject(hOldBitmap);
        DeleteObject(hCompartibleDC);
        EndPaint(hDlg, &ps);

Но это немножко изврат
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.