2013-12-12 3 views
1

У меня есть окно HWND assignWnd, являющееся дочерним окном главного окна. Это окно, похоже, не обрабатывает сообщение WM_CREATE. Например, вот сообщение WM_CREATE в моей оконной процедуре.WM_CREATE, похоже, не обрабатывается в дочернем окне

case WM_CREATE: 
    { 
     hdc = GetDC(assignWnd); 

     GetTextMetrics(assignWnd,&tm); 
     cyChar = tm.tmHeight + tm.tmExternalLeading; 

     ReleaseDC(assignWnd,hdc); 
     return 0; 
    } 

Переменная cyChar является int и объявляется в оконной процедуре. Он используется позже в сообщении WM_PAINT. Всякий раз, когда я компилирую программу, я получаю ошибку времени выполнения, указывающую, что cyChar используется до его инициализации. Если я помещаю вышеуказанный код в сообщение WM_PAINT, программа работает так, как ожидалось.

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

Любое объяснение того, почему сообщение WM_CREATE не обрабатывается в этом дочернем окне, должно быть оценено по достоинству.

+0

Nevermind. Я обнаружил, что проблема заключается в том, что «cyChar» не был объявлен статическим, поэтому он недействителен для других сообщений. –

+0

Если это было частью вашего цикла обработки сообщений, не имело бы значения, было ли оно статичным или нет, поскольку код никогда не покидает цикл. Статические переменные следует избегать, когда это возможно. –

+0

Марк, я объявил это в процедуре окна и перед коммутатором (msg), используемым для обработки различных сообщений. Кроме того, из любопытства, почему вы рекомендуете избегать статических переменных? –

ответ

1

Предположительно cyChar является локальным для процедуры окна. Дело не в WM_CREATE, а в том, что cyChar, назначенное вами в WM_CREATE, не совпадает с cyChar, которое вы используете в WM_PAINT. Вам нужно сделать свою переменную глобальной или статической, чтобы она выжила от одного вызова к процедуре окна к другому.

+0

Спасибо, Джонатан, я понял это вскоре после публикации; однако из-за моей низкой репутации я не смог ответить на свой вопрос! –

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