Размер окна в Windows 7 - как определить?

Тема в разделе "WASM.WIN32", создана пользователем CyberManiac, 14 фев 2010.

  1. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Обнаружил, что для красивого скриншотинга в Windows 7 (и Висте, наверное, тоже) GetWindowRect уже не катит - красивая рамочка вокруг окна остаётся за бортом. И как теперь получать наружные размеры окна с этой рамочкой?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    GetSystemMetrics не помогает?
     
  3. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    cresta
    У меня были определённые теории насчёт этой функции, но я не представляю, что ей подсунуть в качестве параметра. SM_CXBORDER и SM_CXFIXEDFRAME - не то, результаты вызовов в XP и семёрке совпадают. Да и, надеюсь, ширина этой рамки должна считаться от хэндла окна, а не от системных метрик: трудно поверить, что программистам MS было не вломы каждый раз проверять атрибуты окна, чтобы получить толщину рамки.
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    CyberManiac
    Не знаем, если это поможет – но размер этой штуки регулируется в оснастке "desk.cpl Advanced,@Advanced", Item == Border Padding.
    ...Ага, и в наличии метрика SM_CXPADDEDBORDER – видимо оно.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    CyberManiac
    Можно обойтись и без GetWindowRect:
    Код (Text):
    1. VOID SnapWindow(HWND hWnd)
    2. {
    3.     BITMAPFILEHEADER    bfh;
    4.     BITMAPINFOHEADER    bih;
    5.     BITMAP              bmp;
    6.     SYSTEMTIME          time;
    7.     TCHAR               szFileName[MAX_PATH];
    8.     TCHAR               szFilePath[MAX_PATH];
    9.  
    10.     HDC     hDC;
    11.     HDC     hDCMem;
    12.     HBITMAP hBmp;
    13.     HBITMAP hBmpMem;
    14.     int     nRes;
    15.     LPVOID  lpvBits;
    16.     HANDLE  hFile;
    17.     DWORD   dwBytesWritten;
    18.  
    19.     hDC = GetWindowDC(hWnd);
    20.     hBmp = GetCurrentObject(hDC, OBJ_BITMAP);
    21.     nRes = GetObject(hBmp, sizeof(BITMAP), &bmp);
    22.     hDCMem = CreateCompatibleDC(hDC);
    23.     hBmpMem = CreateCompatibleBitmap(hDC, bmp.bmWidth, bmp.bmHeight);
    24.     SelectObject(hDCMem, hBmpMem);
    25.     nRes = BitBlt(hDCMem, 0, 0, bmp.bmWidth, bmp.bmHeight, hDC, 0, 0, SRCCOPY);
    26.  
    27.     bih.biSize = sizeof(BITMAPINFOHEADER);
    28.     bih.biWidth = bmp.bmWidth;
    29.     bih.biHeight = bmp.bmHeight;
    30.     bih.biPlanes = 1;
    31.     bih.biBitCount = 24;
    32.     bih.biCompression = BI_RGB;
    33.  
    34.     nRes = GetDIBits(hDCMem, hBmpMem, 0, 0, NULL, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
    35.     lpvBits = LocalAlloc(LMEM_FIXED, bih.biSizeImage);
    36.     nRes = GetDIBits(hDCMem, hBmpMem, 0, bmp.bmHeight, lpvBits, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);
    37.  
    38.     bfh.bfType = 0x4D42;
    39.     bfh.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bih.biSizeImage;
    40.     bfh.bfReserved1 = 0;
    41.     bfh.bfReserved2 = 0;
    42.     bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    43.  
    44.     GetLocalTime(&time);
    45.     wsprintf(szFileName, TEXT("\\%u-%02u-%02u %02u-%02u-%02u.bmp"),
    46.         time.wYear, time.wMonth, time.wDay,
    47.         time.wHour, time.wMinute, time.wSecond);
    48.     lstrcpy(szFilePath, szSaveFolder);
    49.     lstrcat(szFilePath, szFileName);
    50.    
    51.     hFile = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    52.     nRes = WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
    53.     nRes = WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
    54.     nRes = WriteFile(hFile, lpvBits, bih.biSizeImage, &dwBytesWritten, NULL);
    55.     CloseHandle(hFile);
    56.    
    57.     LocalFree(lpvBits);
    58.     DeleteObject(hBmpMem);
    59.     DeleteDC(hDCMem);
    60.     ReleaseDC(hWnd, hDC);
    61. }