Графика Windows Client записывается из окна в верхнем левом углу экрана - PullRequest
0 голосов
/ 19 декабря 2010

У меня есть окно Windows WinMain (), в котором я пишу простую графику - просто LineTo () и FillRect ().Прямоугольники движутся вокруг.Примерно через час вывод, который использовался для перехода к главному окну, внезапно переходит в верхний левый угол моего экрана - как если бы координаты клиента интерпретировались как координаты экрана.Мои GetDC () и ReleaseDC () кажутся сбалансированными, и я даже проверил возвращаемое значение из ReleaseDC (), убедитесь, что оно не равно 0 (для MSDN).Иногда вывод возвращается к моему главному окну.Когда я попал в отладчик (VS 2010), мои координаты не кажутся неправильными - но вывод идет в неправильном месте.Я работаю с WM_PAINT, WM_CREATE, WM_TIMER и несколькими другими.Я не знаю, как это отладить.Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2010

Здесь написано «не проверять возвращаемые значения». Довольно важно в программировании на Win32, большинство функций API возвращает логическое значение или дескриптор, где FALSE или NULL указывают на ошибку. GetLastError () предоставляет код ошибки.

Дешевый способ проверить это без изменения кода - использовать отладчик для просмотра значения регистра EAX после вызова API. 0 означает сбой. В Visual Studio вы можете сделать это, используя псевдопеременные @eax и @err в окне Watch, соответственно возвращаемое значение функции и значение GetLastError.

Плохо, когда Windows начинает сбой вызовов API, возможно, из-за утечки ресурса. Это можно увидеть с помощью TaskMgr.exe, вкладка «Процессы». View + Select Columns и отметьте маркеры, объекты USER и объекты GDI. Обычно это последнее, восстановление контекста устройства и освобождение объектов рисования очень легко возиться. Вам не нужно ждать, пока оно не выйдет из строя, стабильно взбираясь число в одной из этих колонок - дешевая распродажа. Когда значение достигает 10000

, оно падает.
1 голос
/ 19 декабря 2010

Вы должны вызывать GetDC (NULL) где-то по ошибке, чтобы получить DC для всего рабочего стола.

Вы можете сделать так, чтобы все ваши вызовы GetDC вызывали функцию-обертку, которая утверждает, что аргумент равен NULL, чтобы помочь отследить это:

#include <assert.h>
HDC GetDCAssert(HWND hWnd)
{
    assert(hWnd);
    return ::GetDC(hWnd);
}
...