GID: HBITMAP und HDC ?
-
Hi...wollte mal fragen wie ich ein bitmap in ein hdc konvertiere und andersrum ?
und wieso bekomme ich hier
0,0
0,0 ?POINT findImageOnScreen(HBITMAP img, HDC screen) { HDC hdcCompatible = CreateCompatibleDC(screen); HBITMAP screenBitmap = CreateCompatibleBitmap(screen, GetDeviceCaps(screen, VERTRES), GetDeviceCaps(screen, HORZRES)); SelectObject(hdcCompatible, screenBitmap); BitBlt(hdcCompatible,0,0,GetDeviceCaps(screen, VERTRES), GetDeviceCaps(screen, HORZRES), screen, 0,0,SRCCOPY) ; SIZE bitmapSize; GetBitmapDimensionEx(img, &bitmapSize); SIZE screenSize; GetBitmapDimensionEx(screenBitmap, &screenSize); printf("ScreenSize: %i, %i \n", screenSize.cx, screenSize.cy); printf("bitmapSize: %i, %i \n", bitmapSize.cx, bitmapSize.cy); // [...]?? die bitmap(img) ist vorhanden und wird geladen
-
HBITMAP und HDC sind zwei unterschiedliche Dinge, die kann man nich ineinander konvertieren.
Ein DeviceContext ist im übertragenen Sinne ne Art Zeichenbrett, worauf du dein Papier (HBITMAP) legen kannst. Mittels SelectObject() kannst du deine Pinsel etc. auswählen. BitBlt() kopiert Inhalt des Papiers auf das Papier eines anderen Zeichenbretts.The GetBitmapDimensionEx function retrieves the dimensions of a compatible bitmap. The retrieved dimensions must have been set by the SetBitmapDimensionEx function.
Schau dir mal stattdessen GetObject() an!
-
So jetzt hab ich aber was ganz seltsames oO
POINT findImageOnScreen(HBITMAP img, HDC screen) { HDC hdcCompatible = CreateCompatibleDC(screen); HBITMAP screenBitmap = CreateCompatibleBitmap(screen, GetDeviceCaps(screen, VERTRES), GetDeviceCaps(screen, HORZRES)); SelectObject(hdcCompatible, screenBitmap); BitBlt(hdcCompatible,0,0,GetDeviceCaps(screen, VERTRES), GetDeviceCaps(screen, HORZRES), screen, 0,0,SRCCOPY) ; HDC hdcImage = CreateCompatibleDC(screen); SelectObject(hdcImage,img); BITMAP imgInfo; GetObject(img, sizeof(BITMAP), (LPSTR)&imgInfo); BITMAP screenInfo; GetObject(screenBitmap, sizeof(BITMAP), (LPSTR)&screenInfo); SIZE bitmapSize; bitmapSize.cx = imgInfo.bmWidth; bitmapSize.cy = imgInfo.bmHeight; SIZE screenSize; screenSize.cx = screenInfo.bmWidth; screenSize.cy = screenInfo.bmHeight; printf("ScreenSize: %i | %i \n", screenSize.cx, screenSize.cy); printf("bitmapSize: %i, %i \n", bitmapSize.cx, bitmapSize.cy); for(int i = 0; i < screenSize.cx; i++) for(int j = 0; j < screenSize.cy; j++) { if(cc(GetPixel(hdcImage,0,0), GetPixel(screen, i, j))) { //printf("Fitting entry pixel found @ %i, %i \n", i, j); bool found = true; for(int k = 0; (k < bitmapSize.cx) & (found == true); k++) for(int l = 0; (l < bitmapSize.cy) & (found == true); l++) if(!cc(GetPixel(hdcImage,k,l), GetPixel(screen, i+k, j+l))) found = false; if(found == true) { POINT ret; ret.x = i; ret.y = j; return ret; } } } POINT ret; ret.x = -1; ret.y = -1; return ret; } int main(int argc, char* argv[]) { HDC hdcScreen = GetDC(0); HBITMAP img = loadImg("test.bmp"); if(!img) printf("Image not found \n"); else { POINT test = findImageOnScreen(img,hdcScreen); printf("found @ %i, %i \n", test.x, test.y); } return 0; }interessant wirds bei
printf("ScreenSize: %i | %i \n", screenSize.cx, screenSize.cy);
denn hier bekomme ich 1024 | 1280 ausgegeben !!
wieso wird da breite und höhe ausgetauscht ?
-
Weil du sie bei CreateCompatibleBitmap(screen, GetDeviceCaps(screen, VERTRES), GetDeviceCaps(screen, HORZRES)); schon falsch herum angegeben hast
