2014-01-23 2 views
0

Я использую этот код, чтобы получить Device Context (aka DC) объекта/окна в текущей позиции мыши.Почему GetDC возвращает разные значения для одного и того же объекта?

POINT curPos; 

while (1) 
{ 
    GetCursorPos(&curPos); 
    printf("hdc: %ld\n", GetDC(WindowFromPoint(curPos))); 
    Sleep(300); 
} 

После компиляции и выполнения, я устанавливаю курсор на консоли и оставить его там, не двигаясь, и всегда выводит другое значение (а также отрицательные числа). Например:

hdc: -1795094423 
hdc: -1425992173 
hdc: 1090588133 
hdc: 553717209 
hdc: 1979782668 
hdc: 2013337074 
hdc: -1241444488 

Я знаю, что могу использовать GetWindowDC пойти получить DC конкретного окна, но я хочу, чтобы получить DC конкретных частей этого окна.

Заранее спасибо.

+0

Мое предположение, что в окне определено, что используется общий DC, который объединен, поэтому GetDC() возвращает разный DC каждый раз, когда он вызывается. –

+0

Спасибо за ваш ответ. Но это происходит со всеми окнами, а также с рабочим столом. – cdonts

+0

Не следует, если заданное окно используется для использования DC класса или частного DC, и в этом случае GetDC() будет возвращать один и тот же DC каждый раз. –

ответ

3

Вы бы, как правило, не получали кучу HDC снова и снова, не выпуская ни одного из них. Попробуйте освободить их, прежде чем схватить другого и посмотреть, что произойдет.

Во всяком случае, нет причин, по которым они будут одинаковыми. Фактически, как вы это делаете, не выпуская их, они должны быть разными, поскольку каждый из них является дескриптором другого объекта.

Что касается чисел «отрицательный», это вообще не имеет значения. Они действительно должны быть напечатаны как шестнадцатеричные.

#include <windows.h> 
#include <stdio.h> 

int main() { 
    POINT curPos; 
    while (1) 
    { 
    GetCursorPos(&curPos); 
    HWND hwnd = WindowFromPoint(curPos); 
    HDC hdc = GetDC(hwnd); 
    printf("hdc: %08lX\n", (unsigned long)hdc); 
    ReleaseDC(hwnd, hdc); 
    Sleep(1000); 
    } 
    return 0; 
} 
+1

Хороший вопрос о выпуске, я этого не заметил. Если в окне используется DC или частный DC, его не нужно выпускать, но тогда GetDC() будет возвращать один и тот же HDC каждый раз. Но если в окне используется обычный DC, то он вытаскивается из пула системы, поэтому выпуск важно, иначе GetDC() должен каждый раз вытягивать другой HDC, поскольку предыдущие HDC все еще используются. –

+0

Да, освобождение было трюком. Я пробовал это и работал, но для одного и того же объекта он печатает номер в течение первых 2 секунд, а затем печатает другой навсегда. Можете ли вы попробовать этот код и сказать мне, видите ли вы такое же поведение? Изменить: теперь, когда я запускаю это снова, число меняется каждый раз, когда я устанавливаю курсор в окне, а затем возвращаюсь к оригиналу. – cdonts

+0

@cdonts Числовое значение DC не имеет значения. Вы не должны беспокоиться о том, имеет ли DC одно и то же числовое значение, что и предыдущий DC. –

Смежные вопросы