Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BITMAP окна по хендлу 
:(
    Опции темы
coop
Дата 9.7.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.7.2011

Репутация: нет
Всего: нет



Задачка написать функцию для сравниванию 2 битмапов. Функция принимает хендл окна игры в оконном режиме с которого нужно взять  битмап и строку - имя файла второго битмапа. Открыть битмап из файла и записать его в буфер у меня выходит , но с битмапом окна ничего не получается . Помогите пожалуйста правильно взять битмап. 

Код

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;


BYTE*         wndbuff       = NULL;
BYTE*         filebuff      = NULL;
BITMAP      wndbit;
BITMAP      filebit;
HDC           wnddc            = NULL;                  
RECT          coord;
HBRUSH    brush        = NULL;



void comparebitmaps(const HWND hWnd,const LPCWSTR filename)
{
    HDC dc = GetDC(hWnd);
    wnddc = ::CreateCompatibleDC(dc);
    RECT temprect ;
//    GetClientRect(hWnd,&temprect);

    //BitBlt(wnddc,0,0,1023,766,dc,0,100,SRCCOPY);

    HBITMAP hbitmap = (HBITMAP)::GetCurrentObject(wnddc, OBJ_BITMAP);
    GetObject(hbitmap, sizeof(BITMAP), &wndbit);
 

/*октрываю битмап из файла*/
    HBITMAP hloadedbitmap = (HBITMAP) LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE| LR_DEFAULTSIZE);
    GetObject(hloadedbitmap, sizeof(BITMAP), &filebit);

    FillMemory(&coord, 0L, sizeof(RECT));
    ////////////////////////////////////////////////////////*копирую в буфер сначала хендл битмапа окна , потом битмапа файла*///
    USHORT ialign = wndbit.bmBitsPixel >> 3;
    LONG isize = wndbit.bmWidth * wndbit.bmHeight *ialign;
    wndbuff = new BYTE[isize];
    LONG l = GetBitmapBits(hbitmap, isize ,(LPVOID) wndbuff);
    /*------------------------------------------------------*/
    USHORT salign = filebit.bmBitsPixel >> 3;
    LONG ssize = filebit.bmWidth * filebit.bmHeight * salign;
    filebuff = new BYTE [ssize];
    LONG n = GetBitmapBits(hloadedbitmap, ssize , (LPVOID)filebuff);
    /////////////////////////////////////////////////////////
    
    /*тут будет продолжение*/
}

int _tmain(int argc, _TCHAR* argv[])
{
    POINT p;
    GetCursorPos(&p);
    Sleep(30000);
    HWND hWnd = WindowFromPoint(p);
    if(!hWnd)
    {
        MessageBox(hWnd,_T("curr window not found"),_T("error"),MB_OK);
        exit(1);
    }
     comparebitmaps(hWnd, _T("sign.bmp"));
    
    
    
    
    return 0;
}


Это сообщение отредактировал(а) coop - 9.7.2011, 13:29
PM MAIL   Вверх
GremlinProg
Дата 10.7.2011, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



CreateCompatibleDC создает новое устройство, так что в hbitmap никогда не будет растра из hWnd,
но если вместо wnddc подставить dc, может что и получится )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
bass
Дата 16.7.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: 2
Всего: 2



битмап с файла на окно
void DrawBitmap(HWND ok,char* file ,int xStart, int yStart)
{
 RECT rcSrc;
 GetWindowRect(ok, &rcSrc);
 HBITMAP hBitmap =LoadImage(NULL,file,IMAGE_BITMAP,rcSrc.right - rcSrc.left,rcSrc.bottom - rcSrc.top,LR_LOADFROMFILE);
 HDC hdc = GetDC(ok);
 BITMAP bm;
 HDC hdcMem;
 DWORD dwSize;
 POINT ptSize, ptOrg;
 hdcMem = CreateCompatibleDC(hdc);
 SelectObject(hdcMem, hBitmap);
 SetMapMode(hdcMem, GetMapMode(hdc));
 GetObject(hBitmap, sizeof(BITMAP),(LPVOID) &bm);
 ptSize.x = bm.bmWidth;
 ptSize.y = bm.bmHeight;
 DPtoLP(hdc, &ptSize, 1);
 ptOrg.x = 0;
 ptOrg.y = 0;
 DPtoLP(hdcMem, &ptOrg, 1);
 BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y,hdcMem, ptOrg.x, ptOrg.y, SRCCOPY);
 DeleteDC(hdcMem);
DeleteObject (hBitmap);
DeleteDC(hdc);
}

а вот сохранить в файл


TJPEGImage *jp = new TJPEGImage();
unsigned DataHandle;
HPALETTE APalette;
Word Format;
Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
HDC DC=GetDC(0);//вот здесь надо дс окна а не рабочего стола
try{
Bitmap->Height=Screen->Height;
Bitmap->Width=Screen->Width;
BitBlt(Bitmap->Canvas->Handle , 0, 0, Screen->Width,
Screen->Height,DC, 0, 0, SRCCOPY);
jp->Assign(Bitmap);

Я думаю разберешься
jp->SaveToFile("1.jpg");


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.