Программирование на C++

10 способов прострелить себе ногу

Создание веб приложений

В инете столько порнухи, что создается впечатление, что каждая женщина на Земле хотя бы раз в ней снималась...

Подпись для третьего не придумал

Американец изнасиловал лошадь, потому что думал, что у них родится кентавр

Помощь обездоленным якутам на дальнем севере

Благотворительность (на правах рекламы)

суббота, 15 июня 2013 г.

Конвертер Hex String в Brush (Color) в Windows 8 (C#)

В приложениях Windows 8 для хранения цветов используется модель - RGBA (Red, Green, Blue, Alpha). Эта модель (цветовое пространство) известна всем со школы. 
В C# байты сначала идут - Alpha - Red - Green - Blue. Для каждого значения по 2 байта. 
Пример #FF000000 - Черный цвет, #FFFF0000 - Красный цвет.
Для тех, кто не знает, что такое Alpha - оно отвечает за прозрачность картинки, то есть, если у вас например RGBA = #FF000000 , здесь Alpha = 255, то есть картинка полностью непрозрачна, если Alpha = 0, то картинка полностью прозрачна.
Итак мне понадобилось сделать для моего приложения Windows Store простенький конвертер из Hex Строкового значения в объект типа SolidColorBrush. Преобразует строки типа - #FFFFFFFF. Проверок на длину строки нету.

public static class HexToColorConverter
    {
        public static SolidColorBrush GetColorFromHex(string hexColor)
        {
            hexColor = hexColor.Replace("#", ""); //удаляем решетку
            byte a = byte.Parse(hexColor.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); //получаем alpha
            byte r = byte.Parse(hexColor.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); //получаем красный
            byte g = byte.Parse(hexColor.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); //получаем зеленый
            byte b = byte.Parse(hexColor.Substring(6, 2), System.Globalization.NumberStyles.HexNumber); //получаем синий
            return new SolidColorBrush(Color.FromArgb(a, r, g, b));
        }
    }

пятница, 14 июня 2013 г.

Хранение пароля и логина в приложении Windows 8 (C#)


Для хранения логинов и паролей в Windows 8 приложениях, Microsoft представила новый API, называемый PasswordVault (Хранилище паролей). При добавлении в это хранилище, происходит автоматическое шифрование данных, что очень удобно, если вы не хотите изобретать велосипед. Это только основы, для всех методов ссылка на MSDN
Для удобного взаимодействия с PasswordVault, я сделал 3 простых метода:
  • Метод добавления данных (SaveCredential)
  • Получения данных (GetCredential)
  • Удаления данных (RemoveCredential)
Особенности:

  • Помним, что для использования PasswordVault, требуется подключение библиотеки Windows.Security.Credentials
  • Для получения пароля или удаления данных, нужно знать логин
  • Если не найдены данные, то выкидывается исключение, к-ое надо обработать
  • Посмотреть добавленные данные можно в Control Panel -> User Accounts .. -> Credential Manager


В Windows каждому приложению отведен ресурс, который имеет имя. В нашем случае, я назвал его MyAppCredential. Это имя мы используем во всех методах при обращении к хранилищу.

private const string RESOURCE_NAME = "MyAppCredential"; //для добавления нужно название нашего ресурса
 
private void SaveCredential(string userName, string password)
{
    var vault = new PasswordVault(); //инициализируем хранилище
    var credential = new PasswordCredential(RESOURCE_NAME, userName, password);
    //добавляем данные, с помощью метода Add
    vault.Add(credential);
}
 
private void GetCredential()
{
    string userName; 
    string password;
 
    var vault = new PasswordVault();
    try
    {
        var credential = vault.FindAllByResource(RESOURCE_NAME).FirstOrDefault();
        if (credential != null)
        {
            // Получаем пароль и логин
            userName = credential.UserName;
            //ДЛЯ ПОЛУЧЕНИЯ ПАРОЛЯ НУЖНО ЗНАТЬ ЛОГИН
            password = vault.Retrieve(RESOURCE_NAME, userName).Password;
        }
    }
    catch (Exception)
    {
        // Если ничего не найдено, то обработать ошибку
    }
}
 
private void RemoveCredential(string userName)
{
    var vault = new PasswordVault();
    try
    {
        // Удаляем данные
        //ДЛЯ УДАЛЕНИЯ ДАННЫХ НУЖНО ЗНАТЬ ЛОГИН
vault.Remove(vault.Retrieve(RESOURCE_NAME, userName)); } catch (Exception) { // Если ничего не найдено, то обработать ошибку } }