2
0

InfoBox.xaml.vb 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. Public Class InfoBox
  2. ''' <summary>
  3. ''' 推荐源。
  4. ''' </summary>
  5. ''' <value></value>
  6. ''' <returns></returns>
  7. ''' <remarks></remarks>
  8. Public Property Source As String
  9. ''' <summary>
  10. ''' 内容(标题)。
  11. ''' </summary>
  12. ''' <value></value>
  13. ''' <returns></returns>
  14. ''' <remarks></remarks>
  15. Public Property Title As String
  16. ''' <summary>
  17. ''' 点击时进入的URL。
  18. ''' </summary>
  19. ''' <value></value>
  20. ''' <returns></returns>
  21. ''' <remarks></remarks>
  22. Public Property OnClickURL As String
  23. ''' <summary>
  24. ''' Path的资料。
  25. ''' </summary>
  26. ''' <value></value>
  27. ''' <returns></returns>
  28. ''' <remarks></remarks>
  29. Public Property IconData As String
  30. ''' <summary>
  31. ''' 图片的本地文件地址,可能为程序内部地址。
  32. ''' </summary>
  33. ''' <value></value>
  34. ''' <returns></returns>
  35. ''' <remarks></remarks>
  36. Public Property PictureLocalURL As String
  37. Public IsSendStat As Boolean = False
  38. ''' <summary>
  39. ''' 处理源。
  40. ''' </summary>
  41. ''' <value></value>
  42. ''' <returns></returns>
  43. ''' <remarks></remarks>
  44. Public Property MySource As InfoBoxSource
  45. '鼠标事件
  46. Private Const ANIMATE_SPEED As Integer = 250
  47. Private Sub InfoBox_MouseEnter(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseEnter
  48. 'If If(Me.Name, "") = "" Then Me.Name = "InfoBox" & GetUUID()
  49. 'If IsTextOnly Then Exit Sub
  50. 'AniStart({
  51. ' AaOpacity(panInfo, 1 - panInfo.Opacity, ANIMATE_SPEED), AaRadius(blur, 10 - blur.Radius, ANIMATE_SPEED)
  52. ' }, "InfoBoxMouse" & Me.Name)
  53. End Sub
  54. Private Sub InfoBox_MouseLeave(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseLeave
  55. MouseDowned = False
  56. 'If IsTextOnly Then Exit Sub
  57. 'AniStart({
  58. ' AaOpacity(panInfo, -panInfo.Opacity, ANIMATE_SPEED), AaRadius(blur, -blur.Radius, ANIMATE_SPEED)
  59. ' }, "InfoBoxMouse" & Me.Name)
  60. End Sub
  61. '点击确认
  62. Private MouseDowned As Boolean = False
  63. Private Sub InfoBox_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseLeftButtonDown
  64. MouseDowned = True
  65. End Sub
  66. Private Sub InfoBox_MouseLeftButtonUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Me.MouseLeftButtonUp
  67. '保证是在这里按下的左键
  68. If MouseDowned Then
  69. MouseDowned = False
  70. Else
  71. Exit Sub
  72. End If
  73. log("[InfoBox] 点击InfoBox,命令:" & OnClickURL)
  74. SendStat("推荐源", "点击", OnClickURL)
  75. If IsNothing(OnClickURL) Then
  76. Exit Sub
  77. ElseIf OnClickURL.StartsWith("http") Then
  78. Try
  79. Process.Start(OnClickURL)
  80. Catch ex As Exception
  81. ExShow(ex, "信息框点击事件处理失败", ErrorLevel.AllUsers)
  82. End Try
  83. End If
  84. End Sub
  85. ''' <summary>
  86. ''' 显示信息框。
  87. ''' </summary>
  88. ''' <param name="source">信息框源。</param>
  89. ''' <remarks></remarks>
  90. Public Sub Show(ByVal source As InfoBoxSource)
  91. Try
  92. '设置信息
  93. With Me
  94. .Source = source.Source
  95. .Title = source.Title
  96. .OnClickURL = source.OnClickURL
  97. .IconData = source.IconData
  98. .MySource = source
  99. .PictureLocalURL = source.PictureLocalURL
  100. .Visibility = Visibility.Visible
  101. End With
  102. '初始化UI
  103. path.Data = New GeometryConverter().ConvertFrom(IconData)
  104. labTitle.Content = source.Source
  105. labContent.Text = source.Title
  106. imgBack.Source = New MyBitmap(source.PictureLocalURL)
  107. '尝试保存截图
  108. LoadAdd()
  109. Catch ex As Exception
  110. ExShow(ex, "信息框显示失败", ErrorLevel.AllUsers)
  111. End Try
  112. End Sub
  113. Private LoadedProcess As Integer = 0 '控件加载后+1,信息加载后+1
  114. '确保控件与信息都加载后截屏
  115. Private Sub LoadAdd()
  116. LoadedProcess = LoadedProcess + 1
  117. If LoadedProcess = 2 Then
  118. Dim rtb = New RenderTargetBitmap(Width, Height, 96, 96, PixelFormats.Default)
  119. rtb.Render(Me.panBackAll)
  120. Me.Background = New ImageBrush(rtb)
  121. Me.panBackAll.Visibility = Visibility.Collapsed
  122. End If
  123. End Sub
  124. Private Sub InfoBox_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  125. LoadAdd()
  126. End Sub
  127. End Class
  128. ''' <summary>
  129. ''' InfoBox加载源。
  130. ''' </summary>
  131. ''' <remarks></remarks>
  132. Public Class InfoBoxSource
  133. '以下信息由加载时给出
  134. ''' <summary>
  135. ''' 推荐源。
  136. ''' </summary>
  137. ''' <value></value>
  138. ''' <returns></returns>
  139. ''' <remarks></remarks>
  140. Public Property Source As String
  141. ''' <summary>
  142. ''' 内容(标题)。
  143. ''' </summary>
  144. ''' <value></value>
  145. ''' <returns></returns>
  146. ''' <remarks></remarks>
  147. Public Property Title As String
  148. ''' <summary>
  149. ''' 推荐的种类。
  150. ''' </summary>
  151. ''' <value></value>
  152. ''' <returns></returns>
  153. ''' <remarks></remarks>
  154. Public Property Type As String = ""
  155. ''' <summary>
  156. ''' 点击时进入的URL。
  157. ''' </summary>
  158. ''' <value></value>
  159. ''' <returns></returns>
  160. ''' <remarks></remarks>
  161. Public Property OnClickURL As String
  162. ''' <summary>
  163. ''' 给出的图片信息,可能为颜色名。
  164. ''' </summary>
  165. ''' <value></value>
  166. ''' <returns></returns>
  167. ''' <remarks></remarks>
  168. Public Property PictureName As String
  169. '以下为内部信息
  170. ''' <summary>
  171. ''' Path的资料。
  172. ''' </summary>
  173. ''' <value></value>
  174. ''' <returns></returns>
  175. ''' <remarks></remarks>
  176. Public Property IconData As String
  177. ''' <summary>
  178. ''' 加载状态。
  179. ''' </summary>
  180. ''' <value></value>
  181. ''' <returns></returns>
  182. ''' <remarks></remarks>
  183. Public Property State As LoadState = LoadState.Waiting
  184. ''' <summary>
  185. ''' 图片的网络文件地址,可能为空。
  186. ''' </summary>
  187. ''' <value></value>
  188. ''' <returns></returns>
  189. ''' <remarks></remarks>
  190. Public Property PictureWebURL As String
  191. ''' <summary>
  192. ''' 图片的本地文件地址,可能为程序内部地址。
  193. ''' </summary>
  194. ''' <value></value>
  195. ''' <returns></returns>
  196. ''' <remarks></remarks>
  197. Public Property PictureLocalURL As String
  198. ''' <summary>
  199. ''' 开始加载。
  200. ''' </summary>
  201. ''' <remarks></remarks>
  202. Public Sub Load()
  203. '如果已经开始加载了则跳出
  204. If State = LoadState.Loading Or State = LoadState.Loaded Then Exit Sub
  205. Try
  206. Title = Title.Replace("&amp;", "&")
  207. '初始化信息
  208. If Title.StartsWith("【") Then Title = Title & " "
  209. Select Case Type
  210. Case "新闻", "公告"
  211. '小圈圈的“i”
  212. IconData = "F1M38,19C48.4934,19 57,27.5066 57,38 57,48.4934 48.4934,57 38,57 27.5066,57 19,48.4934 19,38 19,27.5066 27.5066,19 38,19z M33.25,33.25L33.25,36.4167 36.4166,36.4167 36.4166,47.5 33.25,47.5 33.25,50.6667 44.3333,50.6667 44.3333,47.5 41.1666,47.5 41.1666,36.4167 41.1666,33.25 33.25,33.25z M38.7917,25.3333C37.48,25.3333 36.4167,26.3967 36.4167,27.7083 36.4167,29.02 37.48,30.0833 38.7917,30.0833 40.1033,30.0833 41.1667,29.02 41.1667,27.7083 41.1667,26.3967 40.1033,25.3333 38.7917,25.3333z"
  213. Case "创作", "教程"
  214. '带图片的书
  215. IconData = "F1M22,46.9996C26.4235,48.3026,34.4825,48.8053,37.2083,52.2153L37.2083,32.9996C34.4826,29.5896,26.4235,29.0869,22,27.7839L22,46.9996z M22,24.3078L22,24.028C26.4235,25.331,34.4825,25.8337,37.2083,29.2437L38,29.4716 38.7917,29.2157C41.5174,25.8057,49.5765,25.303,54,24L54,24.2798C55.2286,24.6498,56,24.9716,56,24.9716L56,27.9716 59,26.8258 59,50.9716C59,50.9716,41.1667,52.2216,38,57.7633L37.9999,57.7913C34.8333,52.2496,17,50.9996,17,50.9996L17,26.8538 20,27.9996 20,24.9996C20,24.9996,20.7714,24.6778,22,24.3078z M23.5,44.506L23.5,41.3844C27.269,42.243,32.4604,42.8187,35.5,44.7496L35.5,47.8712C32.4604,45.9402,27.269,45.3646,23.5,44.506z M23.5,39.1212L23.5,35.9996C27.269,36.8582,32.4604,37.4338,35.5,39.3648L35.5,42.4864C32.4604,40.5554,27.269,39.9798,23.5,39.1212z M23.5,33.6344L23.5,30.5128C27.269,31.3714,32.4604,31.947,35.5,33.878L35.5,36.9996C32.4604,35.0686,27.269,34.493,23.5,33.6344z M54,46.9716L54,27.7559C49.5765,29.0589,41.5174,29.5616,38.7917,32.9716L38.7917,52.1873C41.5175,48.7773,49.5765,48.2746,54,46.9716z M52.5,44.478C48.731,45.3366,43.5395,45.9122,40.5,47.8432L40.5,44.7216C43.5395,42.7906,48.731,42.215,52.5,41.3564L52.5,44.478z M52.5,39.0932C48.731,39.9518,43.5395,40.5274,40.5,42.4584L40.5,39.3368C43.5396,37.4058,48.731,36.8302,52.5,35.9716L52.5,39.0932z M52.5,33.6064C48.731,34.465,43.5395,35.0406,40.5,36.9716L40.5,33.85C43.5395,31.919,48.731,31.3434,52.5,30.4848L52.5,33.6064z"
  216. Case "软件", "懒人包", "Mod", "皮肤", "资源包"
  217. '盒子
  218. IconData = "F1M38,19L57,28.5 57,47.5 38,57 19,47.5 19,28.5 38,19z M22.1667,30.0833L22.1667,45.9167 25.3333,47.5 36.4167,53.0417 36.4167,37.2083 22.1667,30.0833z M50.6666,47.5L53.8333,45.9167 53.8333,30.0833 39.5833,37.2083 39.5833,53.0417 50.6666,47.5z M38,22.1667L25.3333,28.5 38,34.8334 50.6666,28.5 38,22.1667z"
  219. Case "多人"
  220. '地球
  221. IconData = "F1M38,15.8333C50.2423,15.8333 60.1667,25.7577 60.1667,38 60.1667,50.2423 50.2423,60.1667 38,60.1667 25.7577,60.1667 15.8333,50.2423 15.8333,38 15.8333,25.7577 25.7577,15.8333 38,15.8333z M19.065,36.4167L25.3651,36.4167C25.4708,33.796 25.8368,31.3011 26.4182,29.0106 24.9471,28.4945 23.5896,27.8831 22.3719,27.1913 20.5281,29.8522 19.3463,33.0068 19.065,36.4167z M30.0541,20.7363C27.8969,21.7308 25.9579,23.1177 24.3286,24.8056 25.236,25.2756 26.2395,25.6989 27.3232,26.0677 28.064,24.0419 28.9879,22.241 30.0541,20.7363z M36.4167,36.4167L36.4167,30.8432C33.9463,30.7436 31.5878,30.4126 29.4069,29.8881 28.9321,31.8962 28.6282,34.0974 28.5325,36.4167L36.4167,36.4167z M36.4167,19.2627C33.9024,20.1063 31.7231,22.9251 30.2911,26.8939 32.1894,27.3157 34.2515,27.5865 36.4167,27.6758L36.4167,19.2627z M56.9349,36.4167C56.6536,33.0068 55.4719,29.8523 53.6281,27.1913 52.4104,27.8831 51.0528,28.4946 49.5818,29.0107 50.1631,31.3011 50.5291,33.796 50.6348,36.4167L56.9349,36.4167z M45.9459,20.7363C47.012,22.241 47.9359,24.042 48.6767,26.0677 49.7605,25.6989 50.7639,25.2756 51.6714,24.8056 50.0421,23.1177 48.1031,21.7308 45.9459,20.7363z M39.5833,36.4167L47.4674,36.4167C47.3718,34.0974 47.0678,31.8962 46.5931,29.8881 44.4122,30.4126 42.0536,30.7436 39.5833,30.8432L39.5833,36.4167z M39.5833,19.2627L39.5833,27.6758C41.7484,27.5865 43.8106,27.3157 45.7088,26.8939 44.2769,22.9251 42.0975,20.1064 39.5833,19.2627z M56.9349,39.5834L50.6348,39.5834C50.5291,42.204 50.1631,44.6989 49.5818,46.9894 51.0528,47.5055 52.4104,48.1169 53.6281,48.8087 55.4719,46.1478 56.6536,42.9932 56.9349,39.5834z M45.9459,55.2638C48.1031,54.2692 50.0421,52.8823 51.6714,51.1944 50.764,50.7244 49.7605,50.3011 48.6767,49.9323 47.9359,51.9581 47.012,53.7591 45.9459,55.2638z M39.5833,39.5834L39.5833,45.1568C42.0536,45.2564 44.4122,45.5874 46.5931,46.1119 47.0678,44.1038 47.3718,41.9027 47.4675,39.5834L39.5833,39.5834z M39.5833,56.7373C42.0975,55.8937 44.2769,53.075 45.7089,49.1061 43.8106,48.6843 41.7484,48.4135 39.5833,48.3242L39.5833,56.7373z M19.065,39.5834C19.3463,42.9932 20.5281,46.1478 22.3719,48.8087 23.5896,48.1169 24.9471,47.5055 26.4182,46.9894 25.8368,44.6989 25.4708,42.204 25.3651,39.5834L19.065,39.5834z M30.0541,55.2638C28.988,53.7591 28.0641,51.9581 27.3232,49.9323 26.2395,50.3011 25.236,50.7244 24.3286,51.1945 25.9579,52.8823 27.8969,54.2693 30.0541,55.2638z M36.4167,39.5834L28.5325,39.5834C28.6282,41.9027 28.9321,44.1039 29.4069,46.1119 31.5878,45.5874 33.9463,45.2564 36.4167,45.1568L36.4167,39.5834z M36.4167,56.7373L36.4167,48.3242C34.2515,48.4135 32.1893,48.6843 30.2911,49.1061 31.7231,53.075 33.9024,55.8937 36.4167,56.7373z"
  222. Case "建筑"
  223. '城市
  224. IconData = "F1M44.3333,30.0833L57,30.0833 57,57 44.3333,57 44.3333,30.0833z M46.3125,35.2292L46.3125,38 49.0833,38 49.0833,35.2292 46.3125,35.2292z M52.25,35.2292L52.25,38 55.0208,38 55.0208,35.2292 52.25,35.2292z M46.3125,39.9792L46.3125,42.75 49.0833,42.75 49.0833,39.9792 46.3125,39.9792z M52.25,39.9792L52.25,42.75 55.0208,42.75 55.0208,39.9792 52.25,39.9792z M46.3125,44.7292L46.3125,47.5 49.0833,47.5 49.0833,44.7292 46.3125,44.7292z M52.25,44.7292L52.25,47.5 55.0208,47.5 55.0208,44.7292 52.25,44.7292z M46.3125,49.4792L46.3125,52.25 49.0833,52.25 49.0833,49.4792 46.3125,49.4792z M52.25,49.4792L52.25,52.25 55.0208,52.25 55.0208,49.4792 52.25,49.4792z M23.75,25.3333L25.3333,22.1667 26.9167,22.1667 26.9167,18.2084 28.5,18.2084 28.5,22.1667 31.6667,22.1667 31.6667,18.2084 33.25,18.2084 33.25,22.1667 34.8333,22.1667 36.4167,25.3333 36.4167,34.8334 38.7917,34.8333 41.1667,37.2083 41.1667,57 19,57 19,37.2083 21.375,34.8333 23.75,34.8334 23.75,25.3333z M25.7291,27.3125L25.7291,30.0834 28.1041,30.0834 28.1041,27.3125 25.7291,27.3125z M32.0625,27.3125L32.0625,30.0834 34.4375,30.0834 34.4375,27.3125 32.0625,27.3125z M25.7291,32.0625L25.7291,34.8334 28.1041,34.8334 28.1041,32.0625 25.7291,32.0625z M32.0625,32.0625L32.0625,34.8334 34.4375,34.8334 34.4375,32.0625 32.0625,32.0625z M30.875,39.9792L28.8958,39.9792 28.8958,42.75 30.875,42.75 30.875,39.9792z M24.5416,39.9792L24.5416,42.75 26.9166,42.75 26.9166,39.9792 24.5416,39.9792z M36.0208,39.9792L33.25,39.9792 33.25,42.75 36.0208,42.75 36.0208,39.9792z M30.875,44.7292L28.8958,44.7292 28.8958,47.5 30.875,47.5 30.875,44.7292z M26.9166,44.7292L24.5416,44.7292 24.5416,47.5 26.9166,47.5 26.9166,44.7292z M36.0208,44.7292L33.25,44.7292 33.25,47.5 36.0208,47.5 36.0208,44.7292z M30.875,49.4792L28.8958,49.4792 28.8958,52.25 30.875,52.25 30.875,49.4792z M26.9166,49.4792L24.5416,49.4792 24.5417,52.25 26.9167,52.25 26.9166,49.4792z M36.0208,49.4792L33.25,49.4792 33.25,52.25 36.0208,52.25 36.0208,49.4792z"
  225. Case "地图"
  226. '药水
  227. IconData = "F1M28,18L48,18 48,22 45,22 45,29 57,52 54,58 22,58 19,52 31,29 31,22 28,22 28,18z M28,54L37,36 43.8461,36 41,31 41,22 35,22 35,31 23.8461,54 28,54z"
  228. Case Else
  229. ''方块
  230. 'IconData = "F1M18,21.7037L43.9259,18 58,25.4074 58,54.2963 32.8148,58 18,49.1111 18,21.7037z"
  231. '盒子
  232. IconData = "F1M38,19L57,28.5 57,47.5 38,57 19,47.5 19,28.5 38,19z M22.1667,30.0833L22.1667,45.9167 25.3333,47.5 36.4167,53.0417 36.4167,37.2083 22.1667,30.0833z M50.6666,47.5L53.8333,45.9167 53.8333,30.0833 39.5833,37.2083 39.5833,53.0417 50.6666,47.5z M38,22.1667L25.3333,28.5 38,34.8334 50.6666,28.5 38,22.1667z"
  233. End Select
  234. If PictureName.Contains("/") Then
  235. '是网络地址
  236. PictureWebURL = PictureName
  237. PictureLocalURL = PATH & "PCL\cache\source\" & Left(SerAdd(Source), 100) & "\" & Title.GetHashCode & ".png"
  238. State = LoadState.Loading
  239. If File.Exists(PictureLocalURL) Then
  240. State = LoadState.Loaded
  241. Exit Sub
  242. End If
  243. Else
  244. '不是网络地址
  245. PictureWebURL = ""
  246. If PictureName = "blue" Or PictureName = "brown" Or PictureName = "green" Or PictureName = "orange" Or PictureName = "purple" Or PictureName = "yellow" Then
  247. PictureLocalURL = PATH_IMAGE & "infobox-" & PictureName & ".png"
  248. Else
  249. PictureLocalURL = PATH_IMAGE & "infobox-" & OneOf(New String() {"blue", "brown", "green", "orange", "purple", "yellow"}) & ".png"
  250. End If
  251. Thread.Sleep(RandomInteger(100, 500))
  252. State = LoadState.Loaded
  253. Exit Sub
  254. End If
  255. Dim th As New Thread(Sub()
  256. Try
  257. If DownloadFile(PictureWebURL, PictureLocalURL & DOWNLOADING_END) Then
  258. File.Delete(PictureLocalURL)
  259. FileSystem.Rename(PictureLocalURL & DOWNLOADING_END, PictureLocalURL)
  260. State = LoadState.Loaded
  261. Else
  262. State = LoadState.Failed
  263. log("下载信息框图片失败:" & PictureLocalURL)
  264. End If
  265. Catch ex As Exception
  266. State = LoadState.Failed
  267. ExShow(ex, "下载信息框图片失败")
  268. End Try
  269. End Sub)
  270. Pool.Add(th)
  271. Catch ex As Exception
  272. ExShow(ex, "信息框加载失败", ErrorLevel.AllUsers)
  273. End Try
  274. End Sub
  275. End Class