Отображение изображения в WIN32, почему его не отображается? - PullRequest
4 голосов
/ 27 апреля 2011

Я хочу загрузить изображение BitMap в поле для рисования, которое я создал внутри окна ... picBoxDisp создается с использованием следующего механизма.

picBoxDisp = CreateWindow("STATIC", "image box",
                      WS_VISIBLE |WS_CHILD | SS_BITMAP |WS_TABSTOP | WS_BORDER,
                      50, 50, 250, 300, hwnd , (HMENU)10000, NULL, NULL);

Теперь Далее я создал объект hBitmap и загрузил изображениев это ...

hBitmap = (HBITMAP) LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0,
                              LR_LOADFROMFILE| LR_DEFAULTSIZE);

SendMessage(picBoxDisp,STM_SETIMAGE,(WPARAM) IMAGE_BITMAP,(LPARAM) NULL);   
//now assign the new image

//Create a compatible DC for the original size bitmap, for example originalMemDc.
HDC originalDC = GetDC((HWND)hBitmap);
HDC originalMemDC = CreateCompatibleDC(originalDC);
if(originalMemDC==NULL){
    MessageBox(NULL,"Problem while creating DC.","Error",MB_OK);
}
//Select hBitmap into originalMemDc.
SelectObject(originalMemDC,hBitmap);

//Create a compatible DC for the resized bitmap, for example resizedMemDc.
HDC picBoxDC = GetDC(picBoxDisp);
HDC resizedMemDC = CreateCompatibleDC(picBoxDC);

//Create a compatible bitmap of the wanted size for the resized bitmap,
HBITMAP hResizedBitmap = CreateCompatibleBitmap(picBoxDC,250,300);

//Select hResizedBitmap into resizedMemDc.
SelectObject(resizedMemDC,hResizedBitmap);

//Stretch-blit from originalMemDc to resizedMemDc.
//BitBlt(resizedMemDC,0,0,250,300,originalMemDC,0,0,SRCCOPY);

BITMAP bmp_old,bmp_new;
GetObject(hBitmap,sizeof(bmp_old),&bmp_old);
GetObject(hResizedBitmap,sizeof(bmp_new),&bmp_new);

StretchBlt ( resizedMemDC,0,0,bmp_new.bmWidth,bmp_new.bmHeight,
            originalMemDC,0,0,bmp_old.bmWidth,bmp_new.bmHeight,
            SRCCOPY);
////De-select the bitmaps.

if((resizedMemDC==NULL)||(hResizedBitmap == NULL)) {
    MessageBox(NULL,"Something is NULL","Error",MB_OK);
}
else
    //Set hResizedBitmap as the label image with STM_SETIMAGE
    SendMessage(picBoxDisp,STM_SETIMAGE, (WPARAM) IMAGE_BITMAP,(LPARAM) hResizedBitmap);

Я просто не могу понять, почему вышеприведенный код не работает?

Заранее спасибо,

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

Вы неправильно поняли использование STM_SETIMAGE.Сделайте это:

hBitmap = (HBITMAP)::LoadImage(NULL, szFileName, IMAGE_BITMAP,
                               0, 0, LR_LOADFROMFILE| LR_DEFAULTSIZE);

if (hBitmap != NULL)
{
    ::SendMessage(picBoxDisp, STM_SETIMAGE,
                  (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap); 
}

РЕДАКТИРОВАТЬ: Если вы хотите изменить размер растрового изображения перед установкой его в качестве изображения метки, тогда следуйте этой схеме для простейшего способа сделать это (соптимальное качество изображения с измененным размером ...):

  1. Создание совместимого DC для растрового изображения исходного размера, например originalMemDc.
  2. Выберите hBitmap в originalMemDc.
  3. Создание совместимого DC для растрового изображения с измененным размером, например resizedMemDc.
  4. Создание совместимого растрового изображения требуемого размера для растрового изображения с измененным размером, например hResizedBitmap.
  5. Выберите hResizedBitmap в resizedMemDc.
  6. Stretch-blit от originalMemDc до resizedMemDc.
  7. Отмена выбора битовых карт.
  8. УстановитьhResizedBitmap в качестве изображения метки с STM_SETIMAGE

Должно работать!

2 голосов
/ 27 апреля 2011

Статический элемент управления не будет растягивать изображение до его размера.Вы можете использовать SS_CENTERIMAGE, но он либо обрезает, либо заполняет пустое пространство цветом верхнего левого пикселя (см. http://msdn.microsoft.com/en-US/library/b7w5x74z.aspx).. Вам нужно будет растянуть растровое изображение самостоятельно, прежде чем отправлять его в статический элемент управления.

1 голос
/ 27 апреля 2011

Вы пытаетесь присвоить изображение статическому элементу управления, поэтому вам не нужно рисовать изображение, а установить изображение на нем.

// set the image
HBITMAP hold = (HBITMAP)SendMessage(hpicBoxDc, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBitmap));

// clear the old image
if(hold && hold != hBitmap)
   DeleteObject(hold );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...