2015-09-25 2 views
1

Есть ли что-то неправильно в отправке WM_SIZE сообщения программно, например:Отправка сообщения WM_SIZE программно

SendMessage(hWnd, WM_SIZE, 0, 0); 

Я не забочусь о значениях wParam и lParam (мой WM_SIZE обработчик события не использует их).

Что я хочу сделать, это использовать код внутри обработчика событий WM_SIZE в других местах моей программы, но я не хочу его реплицировать, поэтому я подумал о просто отправке сообщения WM_SIZE.

ответ

1

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

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

Намного лучше было бы переместить код в обработчике WM_SIZE вашего окна в отдельную функцию. Затем вы можете вызвать эту функцию из любой точки вашей программы, включая обработчик WM_SIZE.

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

0

Нет ничего плохого, но лучший способ - использовать SetWindowPos() с соответствующими флагами, он будет называть WM_SIZE вместо вас.

+0

но он на самом деле не хочет изменять размер, так что не имеет смысла просто отправлять WM_SIZE .... несмотря на то, что это плохой дизайн и все такое. –

-1

Вы всегда можете программно отправлять или отправлять любое сообщение, оно будет обработано процедурой окна.

Но вы должны знать, что WM_SIZE - это просто уведомление, отправленное системой, чтобы сообщить о том, что его размер был изменен. Отправка этого сообщения не приведет к изменению размера окна. Сообщение обычно отправляется при вызове SetScrollPos или MoveWindow.

+0

Что я хочу сделать, так это использовать код внутри обработчика событий WM_SIZE в других местах моей программы, но я не хочу его реплицировать, поэтому я подумал о том, чтобы просто отправить сообщение WM_SIZE. –

+0

@Tony: IMHO, было бы проще поместить общий код в функцию и вызвать его из любой точки. Или, если вы хотите, чтобы он вызывался в контексте оконной процедуры, вы должны использовать личное сообщение. Вы должны подумать дважды: * зачем вам это нужно. Вручную отправка WM_SIZE выглядит как * запах * дизайн. –

+1

Конечно, вы можете отправить/отправить любое сообщение в окно. Но вы никогда не должны предлагать сделать это без большого предупреждающего знака, который гласит: «НЕ ДЕЛАЙТЕ!» Вы можете уйти с поддельной 'WM_SIZE', где обработчик не заботится о аргументах или текущем состоянии. А как же сообщение 'WM_CHAR', где его обработчик сообщений вызывает' GetKeyState'? Или как насчет сообщения 'WM_QUIT', которое ведет себя радикально отличным от вызова' PostQuitMessage'? Там много больше, это может пойти не так. – IInspectable

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