Обнаружил, что для красивого скриншотинга в Windows 7 (и Висте, наверное, тоже) GetWindowRect уже не катит - красивая рамочка вокруг окна остаётся за бортом. И как теперь получать наружные размеры окна с этой рамочкой?
cresta У меня были определённые теории насчёт этой функции, но я не представляю, что ей подсунуть в качестве параметра. SM_CXBORDER и SM_CXFIXEDFRAME - не то, результаты вызовов в XP и семёрке совпадают. Да и, надеюсь, ширина этой рамки должна считаться от хэндла окна, а не от системных метрик: трудно поверить, что программистам MS было не вломы каждый раз проверять атрибуты окна, чтобы получить толщину рамки.
CyberManiac Не знаем, если это поможет – но размер этой штуки регулируется в оснастке "desk.cpl Advanced,@Advanced", Item == Border Padding. ...Ага, и в наличии метрика SM_CXPADDEDBORDER – видимо оно.
CyberManiac Можно обойтись и без GetWindowRect: Код (Text): VOID SnapWindow(HWND hWnd) { BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; BITMAP bmp; SYSTEMTIME time; TCHAR szFileName[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; HDC hDC; HDC hDCMem; HBITMAP hBmp; HBITMAP hBmpMem; int nRes; LPVOID lpvBits; HANDLE hFile; DWORD dwBytesWritten; hDC = GetWindowDC(hWnd); hBmp = GetCurrentObject(hDC, OBJ_BITMAP); nRes = GetObject(hBmp, sizeof(BITMAP), &bmp); hDCMem = CreateCompatibleDC(hDC); hBmpMem = CreateCompatibleBitmap(hDC, bmp.bmWidth, bmp.bmHeight); SelectObject(hDCMem, hBmpMem); nRes = BitBlt(hDCMem, 0, 0, bmp.bmWidth, bmp.bmHeight, hDC, 0, 0, SRCCOPY); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = bmp.bmWidth; bih.biHeight = bmp.bmHeight; bih.biPlanes = 1; bih.biBitCount = 24; bih.biCompression = BI_RGB; nRes = GetDIBits(hDCMem, hBmpMem, 0, 0, NULL, (LPBITMAPINFO)&bih, DIB_RGB_COLORS); lpvBits = LocalAlloc(LMEM_FIXED, bih.biSizeImage); nRes = GetDIBits(hDCMem, hBmpMem, 0, bmp.bmHeight, lpvBits, (LPBITMAPINFO)&bih, DIB_RGB_COLORS); bfh.bfType = 0x4D42; bfh.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bih.biSizeImage; bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); GetLocalTime(&time); wsprintf(szFileName, TEXT("\\%u-%02u-%02u %02u-%02u-%02u.bmp"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond); lstrcpy(szFilePath, szSaveFolder); lstrcat(szFilePath, szFileName); hFile = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); nRes = WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL); nRes = WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL); nRes = WriteFile(hFile, lpvBits, bih.biSizeImage, &dwBytesWritten, NULL); CloseHandle(hFile); LocalFree(lpvBits); DeleteObject(hBmpMem); DeleteDC(hDCMem); ReleaseDC(hWnd, hDC); }