|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Capturing an Image
You can use a bitmap to capture an image, and you can store the captured image in memory, display it at a different location in your application's window, or display it in another window.
In some cases, you may want your application to capture images and store them only temporarily. For example, when you scale or "zoom" a picture created in a drawing application, the application must temporarily save the normal view of the image and display the zoomed view. Later, when the user selects the normal view, the application must replace the zoomed image with a copy of the normal view that it temporarily saved. To store an image temporarily, your application must call CreateCompatibleDC to create a DC that is compatible with the current window DC. After you create a compatible DC, you create a bitmap with the appropriate dimensions by calling the CreateCompatibleBitmap function and then select it into this device context by calling the SelectObject function.
After the compatible device context is created and the appropriate bitmap has been selected into it, you can capture the image. The Win32 API provides the BitBlt function to capture images. This function performs a bit block transfer ѕ that is, it copies data from a source bitmap into a destination bitmap. Because it copies data from bitmaps, you'd expect that two arguments to this function would be bitmap handles; however, this is not the case. Instead, BitBlt receives handles that identify two device contexts and copies the bitmap data from a bitmap selected into the source DC into a bitmap selected into the target DC. In this case, the target DC is the compatible DC, so when BitBlt completes the transfer, the image has been stored in memory. To redisplay the image, call BitBlt a second time, specifying the compatible DC as the source DC and a window (or printer) DC as the target DC.
The following example code, from an application that captures an image of the entire desktop, creates a compatible device context and a bitmap with the appropriate dimensions, selects the bitmap into the compatible DC, and then copies the image using the BitBlt function.
/* * Create a normal DC and a memory DC for the entire screen. The * normal DC provides a "snapshot" of the screen contents. The * memory DC keeps a copy of this "snapshot" in the associated * bitmap. */ hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); hdcCompatible = CreateCompatibleDC(hdcScreen); /* Create a compatible bitmap for hdcScreen. */ hbmScreen = CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES)); if (hbmScreen == 0) errhandler("hbmScreen", hwnd); /* Select the bitmaps into the compatible DC. */ if (!SelectObject(hdcCompatible, hbmScreen)) errhandler("Compatible Bitmap Selection", hwnd); /* Hide the application window. */ ShowWindow(hwnd, SW_HIDE); /* * Copy color data for the entire display into a * bitmap that is selected into a compatible DC.
*/ if (!BitBlt(hdcCompatible, 0,0, bmp.bmWidth, bmp.bmHeight, hdcScreen, 0,0, SRCCOPY)) errhandler("Screen to Compat Blt Failed", hwnd); /* Redraw the application window. */ ShowWindow(hwnd, SW_SHOW);
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Сбор Образа
Вы можете использовать побитовое отображение, чтобы захватывать образ, и Вы можете сохранить захваченный образ в памяти, отображать это в другой позиции в вашем прикладном окне или отображать это в другом окне.
В некоторых случаях, Вы можете захотеть, чтобы ваше приложение захватывало образы и хранит их только временно. Например, когда Вы масштабируете или "изменение масштаба" изображение создавалось в рисующем приложении, приложение должно временно сохранить нормальный вид образа и отображать вид с измененным масштабом. Позже, когда потребитель выбирается нормальный вид, приложение должно заменить образ с измененным масштабом копией нормального вида, которая оно временно сохранило. Для того, чтобы хранить образ временно, ваше приложение должно назвать CreateCompatibleDC, чтобы создавать DC, что совместимое с текущим окном DC. После того, как Вы создадите совместимый DC, Вы создаете побитовое отображение с подходящими измерениями вызывая функцию CreateCompatibleBitmap затем выбираетесь это в этот контекст устройства вызывая функцию SelectObject.
После того, как совместимый контекст устройства будет создан и подходящее побитовое отображение выбрано в это, Вы можете захватить образ. Win32 API Обеспечивает функцию BitBlt, чтобы захватывать образы. Эта функция выполняет немного блочную передачу U то есть, это копирует данные из исходного побитового отображения в побитовое отображение расположения. Поскольку это копирует данные из побитовых отображений, Вы должны ожидать, что два аргумента в эту функцию быть ручками побитового отображения; тем не менее, это - не в таком случае. Взамен, BitBlt получает ручки, что идентифицировать два контекста устройства и копирует данные побитового отображения из побитового отображения выбранного в источник DC в побитовое отображение выбранное в цель DC. В этом случае, цель DC - совместимый DC, так что когда BitBlt завершает передачу, образ загружен в память. Для того, чтобы redisplay образ, назовите BitBlt вторично, определяющее совместимый DC как источник DC и окно (или принтер) DC как цель DC.
Следующий код примера, из приложения, который захватывает образ целой настольной системы, создает совместимый контекст устройства и побитовое отображение с подходящими измерениями, выбирается побитовое отображение в совместимый DC, затем копирует образ, использовавший функцию BitBlt.
/* * Создайте нормальную DC и память DC для целого экрана. The * нормально DC обеспечивает "кадр" экранного содержания. The * память DC держит копию этого "кадра" в связанном * побитовое отображение. */ hdcScreen = CreateDC("DISPLAY", НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ); hdcCompatible = CreateCompatibleDC(hdcScreen); /* Создайте совместимое побитовое отображение для hdcScreen. */ hbmScreen = CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES)); если (hbmScreen == 0) errhandler("hbmScreen", hwnd); /* Выберитесь побитовые отображения в совместимый DC. */ если (!SelectObject(hdcCompatible, hbmScreen)) errhandler(ВЫБОР Побитового отображения "Compatible", hwnd); /* Спрячьте приложение window. */ ShowWindow(hwnd, SW_HIDE); /* * Цветные данные Копии для целого дисплея в a * побитовое отображение, которое выбрано в совместимый DC.
*/ если (!BitBlt(hdcCompatible, 0,0, bmp.bmWidth, bmp.bmHeight, hdcScreen, 0,0, SRCCOPY)) errhandler("Screen на Compat Blt Потерпевшее неудачу", hwnd); /* Перерисовывать приложение window. */ ShowWindow(hwnd, SW_SHOW);
|
|
|
|
| |