Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Взялся за задачку создания popup окна и управления им средствами API. Все это понадобилось для Access, ну знаете чтобы типа Hinta висело с текстом и другой ерундой. Написал свой маленький класс реализующий управление окном. Но беда подкралась незаметно. Захотел я дать возможность пользователям динамически менять стиль окна, а именно border, т.е. убирать рамку у окна или наоборот. И вот тут выяснилось что после изменения стиля окна, я никак не могу его культурными средствами перерисовать, чтобы убрать с глаз долой рамку. Симпотоны: после изменения стиля окна (удаляем у него стиль WS_BORDER), пиксели рамки остаются как есть - черными. Кидаем поверх чужое окно, убираем и видим - все наше окно перерисовалось, а в этой рамке остались чужие пиксели. т.е. получаются какие-то неприкаенные краевые НИЧЕЙНЫЕ пиксели. Если окно через MoveWindow передвинуть, то рамку окрасится в белый(а может и в серый) цвет и переедет за окном. Единственный способ которым я это одолел - это изменение размеры окна. Достаточно на 1 пиксель увеличить/уменьшить ширину/высоту окна и все ТИП-ТОР. Мои рассуждения: последив за окном через Spy++ я увидел что при изменение размера окна, к нему приходит сообщение WM_NCPAINT - оно отвечает за перерисовку НЕКЛИЕНТСКОЙ части окна. Ну чтож, это понятно, рамку относится к неклиентской части окна. Тогда я решил сымитировать и послал: SendMessage(hWnd, WM_NCPAINT, 0&/1&, 0&) - ничего не произошло. Ни 0 , ни с 1 в wParam не хочет обновлять, хотя оно доходит до окна. Присмотревшись через Spy++ увидел что через MoveWindow у сообщения WM_NCPAINT в wParam передается конкретный hReg регион. Тут я задумался моежт в этом трабл, но какой тогда регион имеется ввиду и главное где его брать. Решил зделать так: hdc = GetWindowDC(vchWnd) hRg = CreateRectRgn(20, 20, 50, 20) ' соотв. размерам окна Call SelectClipRgn(hdc, hRg) Call SendMessage(vchWnd, WM_NCPAINT, hRg, 0&) т.е. создал свой регион с размерами окна и его подсунул - НИФИГА. Подскажите всезнающий All как же правильно обновлять окно после изменения стиля окна, отмены border? Можно конечно дважды применить MoveWindow, ну как это несеръезно.....хочется докопаться до сути. Чтобы все могли посмотреть на это безобразие, я сляпал аккуратный примерчик, это mdb файл Access, там на форме все понятно, практически весь код в модуле clsPopup. Но так как здесь на форуме выложить ему не могу (кстати а почему не сделают, удобная вещь ведь), то готов выслать его всем любопытным (176 кб.) Заранее спасибо за любую помощь и советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 18:35 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
"Биты стиля обычно отражают текущее состояние окна, но изменение стиля при помощи функции SetWindowLong не приводит к соответствующему изменпнию окна (по крайней мере, не сразу). Некоторые биты стиля могут успешно изменяться во время работы программы, однако изменение большинства битов правльно действует лишь при создании окна... ...В документации Microsoft не сказано, какие биты стиля могут изменяться во время работы программы; следовательно, вы должны изменять их на свой страх и риск и только после тщательных экспериментов". (С) Дан Эпплман Можно мне глянуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 20:07 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Интересно.... Но судя по моим экспериментам это возможно. Просто мне не очень нравится использовать для этого двойной вызов MoveWindow, когда можно заменить его одним SendMessage(,WM_NCPAINT,,) Ок. с утра вышлю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 21:32 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Нуф-нуф: Файл к тебе ушел. В принципе возможно проще сделать так. Там всего лишь одна форма с 5 кнопками и модуль класса, кто хочет посмотреть может просто создать в Access аналогичные пустые и заполнить их следующим текстом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2004, 10:07 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Посмотрел... Единственное что могу пока сказать: Кнопка "Изменить размеры окна" (извиняюсь за такое описаний действий с окном) генерирует среди прочих сообщений окну сообщение WM_NCCALCSIZE, по которому пересчитывается размер неклиентской области и только после этого окно получает WM_NCPAINT... Будет время и силы (и если всё еще останется необходимость в этом) покапаю в эту сторону... позже... Но и ты копай :) Итогом поделишься, есл... хм... когда докопаешся? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2004, 22:21 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Мда... как то я не особо обратил на это внимание. Просто думал без пересчета размеров окна (как то я не обратил внимание, что именно НЕклиентской части) достаточно токо обновить..... вообщем осознал свою ошибку, пошел копать. В идеале хотелось получить бы хорошо и легко настраиваемое окно. Такое окно потребовалось sasha_1, но мне захотелось сваять полноценный удобный класс, так сказать навека, чтобы потом уже не копаться каждый раз в константах и функциях API когда нужно окно определенного вида. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 10:14 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Да, действительно именно в этом сообщение передается указатель на структуру, в которой указывается размеры окна старый/новый, а также размер клиентской области (старой). Именно получив такую информацию винды опеределяют изменился ли размер неклиентской области для перерисовки. Кстати с помощью этого сообщения можно отобрать у окна часть клиентской области под свои нужды. Оказывается есть примеры модулей VB, которые подключатся к ст. TextBox, изменяют клиентскую область и берут перерисовку в неклиентской области на себя, например нумеруют строки TextBox. Да и просто таким образом можно отодвинуть текст от рамки окна, а то он вплотную по умол. идет. Когда я лазил по инету в поиске примера заполнения структуры, я попал на прикольный сайт где после изменения клиентской области товарищ обновлял вид следующим альтернативным вариантом: SetWindowPos vchWnd, _ 0&, 0&, 0&, 0&, 0&, _ SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or _ SWP_NOACTIVATE Or SWP_NOOWNERZORDER Or SWP_FRAMECHANGED Т.о. мы говорим виндам, что окно не поменяло: своего местоположения,размеров, положение по Z, активности, а изменился только frame и он требует перерисовки. Вообщем, спасибо за помощь, пошел конопатить дальше. Первый вариант выложу в топике sasha_1, думаю лучше там продолжить дальнейшее обсуждение кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 16:11 |
|
||
|
API: глюки с измен. стиля WS_BORDER
|
|||
|---|---|---|---|
|
#18+
Адресок топика Саши подкинешь? //сами мы не местные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 17:53 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=32404729&tid=2170088]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 319ms |
| total: | 501ms |

| 0 / 0 |
