Разница между дескриптором, полученным в процедуре обратного вызова окна WNDPROC, и дескриптором, возвращаемым CreateWindow? - PullRequest
0 голосов
/ 13 ноября 2011

Поэтому мне было интересно, есть ли какая-либо разница между дескриптором, возвращаемым при создании окна с использованием CreateWindow/CreateWindowEx, и тем, который передается в качестве параметра в процедуру обратного вызова окна WNDPROC для соответствующего окна. Контекст для этого вопроса заключается в том, что мне нужно использовать определенные функции API, которые требуют дескриптор окна, поэтому я подумал, что вместо передачи дескриптора, полученного процедурами обратного вызова окна, я мог бы просто сохранить копию дескриптора, возвращенного CreateWindow. один раз, а затем используйте его для последовательных операций, если оба дескриптора совпадают.

С уважением,

Devjeet

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Будьте осторожны, оконная процедура используется несколькими экземплярами окна. Обратный вызов определяется значением WNDCLASSEX.lpfnWndProc, поэтому любой вызов CreateWindow / Ex (), использующий то же имя класса окна, использует один и тот же обратный вызов. Если вы делаете это для сопоставления обратного вызова с методом экземпляра класса, то сначала вы должны пройти через thunk, который отображает аргумент hwnd обратного вызова в экземпляр класса. Создание особого случая для WM_CREATE, конечно.

2 голосов
/ 13 ноября 2011

Да, они одинаковы, вот и весь смысл иметь HWND. Каждое окно имеет только один HWND, который идентифицирует его в системе и действует до тех пор, пока с ним не будет вызван DestroyWindow. Он возвращается CreateWindow(EX) и отправляется с каждым сообщением, поэтому вы можете использовать его в качестве уникального идентификатора для вашего окна, даже если вы создаете несколько окон одного класса.

Но обратите внимание, что некоторые сообщения отправляются в оконную процедуру еще до возврата CreateFunction, поэтому, если вы используете глобальную переменную для хранения HWND:

HWND globalHwnd = NULL;

int main()
{
    //...
    globalHwnd = CreateWindow(...);
}

LRESULT WndProc(HWND hWnd, ...)
{
    assert(hWnd == globalHwnd); //fail!
}

Утверждение не будет выполнено, поскольку несколько сообщений, таких как WM_CREATE, отправляются до возврата CreateWindow, поэтому глобальная переменная еще не назначена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...