|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Мне иногда надо рисовать сложные градиенты, причем объект Graphics такие рисовать не умеет (как-то обсуждали уже). Не суть. Я использую функцию GradientFill function - она рисует на hdc. И вот я обнаружил, что мой сложный код (конкретно что касается рисования GradientFill) 1) работает при x86 на всех .Net-версиях 2) работает при x64 на .Net 4.0-4.5 3) НЕ РАБОТАЕТ при x64 на .Net 2.0-3.5 Беру простой пример из MSDN: Drawing a Shaded Rectangle Перекатываю его на .Net Собственно весь код со всеми декларациями: Код: vbnet 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.
И получаю те же грабли на очень простом примере. под x64 + Net2.0/Net3.5 ни фига он не рисует. Должен рисовать градиентный прямоугольник в левом верхнем углу формы. под x86 либо (x64+ Net 4.0-4.5) все рисуется. В структурах никаких IntPtr даже нет. ByRef pVertex ? ByRef pMesh As GRADIENT_RECT? На IntPtr-ы попытаться заменить? hdc пробовал брать через API GetDC(Me.Handle) и через .Net Graphics gr.GetHdc() Пофиг. hdc в обоих случаях рабочий. Что может быть? Как заставить рисовать под x64 + Net2.0/Net3.5? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 20:39 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77Что может быть? а хер его знает. нарисовал с нуля - работает во всех комбинациях ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 21:41 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77Net2.0/Net3.5 Кому нужен такой динозавр? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 22:15 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
МСУ, топикстартер пилит гуй к софтфону, и этот гуй должен работать по замыслу с любым фреймворком >=2 Предложение воспользоваться его любимым WinAPI на с++ - категорически отвергает ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 22:24 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Изопропилнарисовал с нуля - работает во всех комбинациях А не скинешь целиком то что нарисовал если не жалко? Куда-нибудь под спойлер. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 23:51 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77, примерно так, естественно найти голую инcталляцию чистого 2.0 на x64 никак Код: c# 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 00:51 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Изопропил, Спасибо тебе. Кстати с Integer/Int16 вместо UInteger/UInt16 в данном случае лоханулся -половину спектра обрезал. Но обсуждаемая проблема точно не в этом. Пока могу сказать следующее: 1) Твой код действительно работает и с .Net 2.0 x64 тоже. В C#. Попробую еще "посравнивать", надо еще GradientFill с атрибутами <DllImport...> продекларировать попробовать, в VB.Net я себя такими декларациями не утруждаю, декларирую по старинке как в VB6. 2) Мой код удалось заставить работать в нерабочих вариантах, сделав такие изменения: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В принципе вариант. Не хочет массив из нескольких vertex по ByRef передавать, поэтому и не работает. В .Net 4.0 в VB.Net видимо подправили. Единственно вопрос. Как грамотно массив из n элементов-структур в IntPtr засунуть? 2 строчки где StructureToPtr у меня уж очень через задницу получились, хотя и работают - т.к. понимаю чего делаю. Т.е. я пихаю vertex(0) в pt, а vertex(1) в pt+смещение. Одним красивым действием никак? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 02:06 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77 Как грамотно массив из n элементов-структур в IntPtr засунуть Код: c# 1. 2. 3.
а декларации - всё-таки лучше в стиле vb.net делать, управление машаллингом поточнее будет. Они уже и на msdn появляются, а на pinvoke.net - всегда были ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 09:53 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Изопропил, я видимо здесь слишком неаккуратно мувнул код из VB6 кажется нашел основную проблему Я передаю ByRef vertex(0) -только первый элемент из массива (как делал в VB6), предполагая, что все последующие элементы "автоматически" лягут в памяти за ним. В части конфигураций это работает, но не во всех. А надо передавать весь массив, и видимо ByVal. Я так понимаю в .Net структуры можно передавать ByVal? В VB6 помнится только ByRef. Короче переделаю все аккуратно, отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 14:56 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77А надо передавать весь массив, и видимо ByVal. по ссылке - в самый раз шаманить нужно с массивами фиксированной длины в структурах ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 15:56 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Изопропил, ИзопропилДмитрий77А надо передавать весь массив, и видимо ByVal. по ссылке - в самый раз У меня простой пример заработал инвариантно относительно конфигураций только ByVal (массив структур). ByRef(массив структур) вообще не работает. Код: vbnet 1. 2. 3. 4.
И кстати, глядючи на твой код понял одну вещь. Т.е. верно что в .Net одну и ту же ф-цию можно объявлять дважды с одинаковым именем (с перегрузом)? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
И он выберет нужный вариант автоматически? Потому как я до сих пор в таких случаях использовал разные имена. Код: vbnet 1. 2. 3. 4.
Счас пока воюю со своими сложными градиентами. Там похоже сильно напортачено из-за необдуманного использования Int/Short вместо требуемого UInt/UShort ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 16:36 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Дмитрий77И он выберет нужный вариант автоматически? да, обычная перегрузка метода int /uint - там действительно часто не по делу, просто приводить типы нужно или просто забить и прописывать в декларации что удобнее ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 18:54 |
|
Функция GradientFill не работает для x64 кода только под .Net 2.0-3.5
|
|||
---|---|---|---|
#18+
Все, разобрался. Чтоб все везде работало надо: 1) Полностью передавать массивы структур и делать это ByVal. Причем это касается как TRIVERTEX(), так и GRADIENT_TRIANGLE()/GRADIENT_RECT() Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
2) В TRIVERTEX цвета надо задавать как UShort (без знака). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Иначе можно как минимум тупо нарваться на арифметическую ошибку и переполнение при вычислениях. Структура преобразования цветов соответственно: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Вроде все OK теперь. Изопропил, спасибо за код. Кучу полезного осознал. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 18:55 |
|
|
start [/forum/topic.php?fid=20&msg=38882267&tid=1401897]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 400ms |
total: | 537ms |
0 / 0 |