Копирование содержания из скрытого или отсеченного окна в XP?

У вас есть две кости, и результат броска кубика может быть от 0 до 5. Я предполагаю, что 1001 означает, что вы хотите бросить две кости 1001 раз. Пожалуйста, дайте мне знать, если я что-то пропустил здесь.

В этом случае ваш минимальный бросок будет равен 0, а максимальный - 10. Но добавление 1 к обоим броскам костей перед доступом будет означать, что ваш индекс изменяется от 2 до 12, что приводит к вашему ArrayIndexOutOfBoundsException.

Просто ничего не добавляйте в список. Помните, что массивы java начинаются с 0, поэтому диапазон от 0 до 10 вполне подойдет.

Быстрый пример:

public static class Die {
    static Random rand = new Random();

    public static int nextInt(int val) {
        return rand.nextInt(val);
    }
}

public static void main(String[] args) {
    int[] counters = new int [11];
    for (int i = 0; i <1001; i++){
        //no need to add anything
        ++counters[Die.nextInt(6) + Die.nextInt(6)];
    }
    System.out.print(Arrays.toString(counters));
}

Пример выходных данных:

[27, 60, 81, 106, 157, 175, 120, 109, 81, 55, 30]

Что мы можем перевести, чтобы обозначить, что «2» было брошено 27 раз, «3» 60 времена и т. д.

10
задан 28 October 2008 в 08:39
поделиться

7 ответов

То, в чем Вы нуждаетесь, является функцией PrintWindow, это доступно в Win32 API начиная с Windows XP. При необходимости в нем для работы с более старыми версиями Windows, можно попробовать WM_PRINT, хотя я никогда не мог заставить его работать.

Существует хорошая статья здесь, которая показывает, как использовать PrintWindow и здесь является отрывком соответствующих норм от той статьи:

// Takes a snapshot of the window hwnd, stored in the memory device context hdcMem
HDC hdc = GetWindowDC(hwnd);
if (hdc)
{
    HDC hdcMem = CreateCompatibleDC(hdc);
    if (hdcMem)
    {
        RECT rc;
        GetWindowRect(hwnd, &rc);

        HBITMAP hbitmap = CreateCompatibleBitmap(hdc, RECTWIDTH(rc), RECTHEIGHT(rc));
        if (hbitmap)
        {
            SelectObject(hdcMem, hbitmap);

            PrintWindow(hwnd, hdcMem, 0);

            DeleteObject(hbitmap);
        }
        DeleteObject(hdcMem);
    }
    ReleaseDC(hwnd, hdc);
}

У меня должен быть некоторый код Python, который использует wxPython для достижения того же самого. Напишите мне, если Вы хотите это.

10
ответ дан 4 December 2019 в 00:27
поделиться

Скопируйте исходное растровое изображение в битовый массив памяти прежде, чем закрыться/скрыть окно.

1
ответ дан 4 December 2019 в 00:27
поделиться

Вы могли попытаться отправить a WM_PRINT обменивайтесь сообщениями к окну. Для многих окон (включая все стандартные окна и общий контроль) это заставит это красить в предоставленный DC.

Кроме того, при передаче HDC как wparam сообщения WM_PAINT много окон (таких как общий контроль) нарисуют в тот DC, а не на экран.

1
ответ дан 4 December 2019 в 00:27
поделиться

Возможно, можно ли инициировать операцию перерисовки на окне с InvalidateRect?

0
ответ дан 4 December 2019 в 00:27
поделиться

К сожалению, я думаю, что Вы собираетесь иметь настоящие проблемы, заставляющие это работать надежно. Вы не говорите точно, что Вы делаете, но я предполагаю, что, учитывая дескриптор окна Вы захватываете контекст устройства, связанный с окном путем вызова GetWindowDC () и затем использования получающегося контекста устройства.

Это будет работать хорошо над XP, когда окно будет видимо. Однако на Vista, если настольное составление композита включено, оно не будет даже работать правильно затем: Вы вернетесь 0 из GetWindowDC (). Существенно, захват контекстов устройства окна не собирается работать надежно.

Если бы окно, с которого Вы пытаетесь скопировать, является частью Вашего собственного приложения, я предложил бы изменить Ваш код для поддержки WM ___ сообщение ПЕЧАТИ: это действует как WM_PAINT, но позволяет Вам предоставлять контекст устройства для вовлечения.

Если окно не из Вашего приложения, Вам в основном не повезло: если бы окно скрыто, изображение того, что оно показало бы, было ли это видимо, не существует нигде.

0
ответ дан 4 December 2019 в 00:27
поделиться

Функция PrintWindow, кажется, не работает над скрытым окном, только над видимыми.

0
ответ дан 4 December 2019 в 00:27
поделиться

Приближающиеся вещи от другой точки зрения, действительно ли Вы уверены, что это действительно, что Вы хотите сделать? Вы, например, не хотите использовать CreateCompatibleDC и CreateCompatibleBitmap для создания невидимой поверхности рисунка, привлечение этого и затем использование BitBlt?

Еще некоторая информация о предпосылках к тому, что Вы готовы, могла бы позволить кому-то предложить или решение или некоторое латеральное мышление...

0
ответ дан 4 December 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: