В v21 библиотеки поддержки теперь есть решение этого: он называется RoundedBitmapDrawable .
Он в основном похож на обычный Drawable, за исключением того, что вы даете ему угловой радиус для отсечения с помощью:
setCornerRadius(float cornerRadius)
Итак, начиная с Bitmap src
и цели ImageView
, он будет выглядеть примерно так:
RoundedBitmapDrawable dr = RoundedBitmapDrawableFactory.create(res, src);
dr.setCornerRadius(cornerRadius);
imageView.setImageDrawable(dr);
Seanyboy IsCharAlphaA
ответ близок. Лучший метод должен использовать версию W как так:
Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long
Public Property Get IsLetter(character As String) As Boolean
IsLetter = IsCharAlphaW(AscW(character))
End Property
Конечно, это все редко имеет значение, поскольку всеми средствами управления VB6 является ANSI только
Это было частью кода, отправленного rpetrich в ответ на вопрос Joel Spolsky. Я чувствовал, что этому было нужно сообщение, характерное для проблемы, которую это решает. Это действительно является блестящим.
Private Function IsLetter(ByVal character As String) As Boolean
IsLetter = UCase$(character) <> LCase$(character)
End Function
Можно ли думать себе, "Это будет всегда работать?" Документация относительно UCase и функций LCase, подтверждает, что это будет:
Функция UCase Только строчные буквы преобразовывается в верхний регистр; все прописные буквы и символы небуквы остаются неизменными.
Функция LCase Только прописные буквы преобразовывается в нижний регистр; все строчные буквы и символы небуквы остаются неизменными.
Private Function IsLetter(Char As String) As Boolean
IsLetter = UCase(Char) Like "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"
End Function
Что случилось со следующим, которое не полагается на неясное поведение языка?
Private Function IsLetter(ByVal ch As String) As Boolean
IsLetter = (ch >= "A" and ch <= "Z") or (ch >= "a" and ch <= "z")
End Function
Оглядывание немного придумало следующее...
Private Declare Function IsCharAlphaA Lib "user32" Alias "IsCharAlphaA" (ByVal cChar As Byte) As Long
Я полагаю, что IsCharAlphaA тестирует наборы символов ANSI, и IsCharAlpha тестирует ASCII. Я могу быть неправым.
Это точно не документирует себя. И это может быть медленно. Это - умный взлом, но это - все, что это. Я испытал бы желание быть более очевидным в своей проверке. Или используйте regex's или запишите более очевидный тест.
public bool IsAlpha(String strToCheck)
{
Regex objAlphaPattern=new Regex("[^a-zA-Z]");
return !objAlphaPattern.IsMatch(strToCheck);
}
public bool IsCharAlpha(char chToCheck)
{
return ((chToCheck=>'a') and (chToCheck<='z')) or ((chToCheck=>'A') and (chToCheck<='Z'))
}
Private Function IsAlpha(ByVal vChar As String) As Boolean
Const letters$ = "abcdefghijklmnopqrstuvwxyz"
If InStr(1, letters, LCase$(vChar)) > 0 Then IsAlpha = True
End Function
Я считаю, что мы можем немного улучшить это. Код rpetrich будет работать, но, возможно, только по счастливой случайности. Параметр вызова API должен быть TCHAR (здесь на самом деле WCHAR), а не Long. Это также означает, что вам не нужно возиться с преобразованием в Long или маскированием с помощью & HFFFF. Это, кстати, Integer и здесь тоже добавляется неявное преобразование в Long. Возможно, в данном случае он имел в виду & HFFFF &?
Вдобавок к этому может быть лучше явно вызвать оболочку UnicoWS для этого вызова API для совместимости с Win9X. Возможно, потребуется развернуть UnicoWS.dll, но, по крайней мере, у нас есть такая возможность. С другой стороны, может быть, из VB6 это автоматически перенаправляется, у меня нет установленной Win9X для тестирования.
Option Explicit
Private Declare Function IsCharAlphaW Lib "unicows" (ByVal WChar As Integer) As Long
Private Function IsLetter(Character As String) As Boolean
IsLetter = IsCharAlphaW(AscW(Character))
End Function
Private Sub Main()
MsgBox IsLetter("^")
MsgBox IsLetter("A")
MsgBox IsLetter(ChrW$(&H34F))
MsgBox IsLetter(ChrW$(&HFEF0))
MsgBox IsLetter(ChrW$(&HFEFC))
End Sub