Аналоговые Часы

Тема в разделе "Разработки форумчан", создана пользователем lazybiz, 6 ноя 2010.

  1. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Далеко не SideBar но все же...
     

    Вложения:

    • Аналоговые Часы
      elclock.png
      Размер файла:
      152,9 КБ
      Просмотров:
      169
    • elclock.zip
      Размер файла:
      24,8 КБ
      Просмотров:
      24
  2. etc

    etc Гость

    Репутация:
    0
    На чем писано?
     
  3. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    etc, C++

    Небольшие изменения внешнего вида.
     

    Вложения:

    • elclock.zip
      Размер файла:
      24,8 КБ
      Просмотров:
      18
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ну или кому вот такой вариант больше по душе (elclock_rev2)
     

    Вложения:

  5. Dock1100

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    Симпатично. Можете добавить возможность менять фоновою картинку и по возможности стрелки на сои?
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Dock1100
    Понимаете, я не использовал ни одной картинки и ни одного спрайта. Все рисуется программным путем. Для того чтобы добавить такую возможность мне придется половину программы переписать.
    И еще, что значит "сои" ?))
     
  7. George

    George Гость

    Репутация:
    0
    lazybiz ...

    Скорее всего Dock имел ввиду СВОИ, опечатка, многим людям нужен выбор!
    В каком Визуале С++ пишешь? Простенько и симпатично, у нас все гениальное просто !!!
    Весит мало и систему не тянет, молодец ...

    :welcome: Doсk !

    Сто лет не слышал ...
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    George
    Я не пишу в Visual C++, может знаете есть такой компилятор Open Watcom ? Так вот я предпочитаю именно его)) По мне очень удобный, оптимизирует отлично, но больше всего мне нравится то, что в нем можно аккуратно кастомизировать, так сказать, вставки на ассемблере (вот здесь можете посмотреть: http://www.azillionmonkeys.com/qed/watcom.html).
    По поводу того что каждому нужен выбор я с вами согласен, но у меня идеология такая что не позволяет использовать битмэпы. Я считаю что идеальная программа (которая связана с UI) должна все рисовать программным путем, можете конечно судить но все же это мое мнение:welcome:
     
  9. George

    George Гость

    Репутация:
    0
    Конечно знаю ...
    Все правильно , в чем считаешь удобней, это решать только Вам ...

    Доброй работы, береги себя ... :welcome:
     
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Если кто загружал, мне интересны мнения у кого, как и на какой ОС работает, были ли какие глюки или нет, т.к. я испытывал только на 7-ке. Заранее благодарен, т.к. для меня это важно.
     
  11. Dock1100

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    У меня тоже 7 стоит, работает без глюков. А можно по интересоватся , прозрачность делается через WinApi?
     
  12. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Dock1100
    Да. Создается окно (CreateWindowEx) с EX-стайлом WS_EX_LAYERED. Далее создается DIB Section (CreateDIBSection), которая в конечном итоге накладывается на прозрачное окно. А уж потом собственно вызывается UpdateLayeredWindow (когда все окно необходимо обновить).

    Если интересно могу выслать простенький пример на почту. Из него я думаю Вам все будет понятно. Хотя.. что почта, через 10 минут сюда выложу.
     
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Обращаю внимание что данный код писался для Open Watcom C++ (кстати сам код на языке С, не С++).
    Так же обращаю внимание на то, что перед вызовом функции layer_update() необходимо предумножить каждый пиксель на свою компоненту A (alpha, коэффициент прозрачности).

    Dock1100, если что-то станет не понятно могу пояснить.

    Код (C++):
    #define _WIN32_WINNT    0x0501
    #include <windows.h>

    #define             W               256
    #define             H               256

    typedef unsigned long       u32;

    static char *       g_app_class_name    = "test_layer_32";

    static HWND         g_hWnd;
    static HDC          g_hDC;
    static HBITMAP      g_hDIB;
    static u32 *        p_layer;

    static void layer_update( void )
    {
    RECT            rc;
    SIZE            sz_dst;
    POINT           pt_dst;
    POINT           pt_src = { 0, 0 };
    BLENDFUNCTION   blend;

    GetWindowRect( g_hWnd, &rc );
    pt_dst.x = rc.left;
    pt_dst.y = rc.top;

    sz_dst.cx = W;
    sz_dst.cy = H;

    blend.BlendOp               = AC_SRC_OVER;
    blend.BlendFlags            = 0;
    blend.SourceConstantAlpha   = 255;
    blend.AlphaFormat           = AC_SRC_ALPHA;
    UpdateLayeredWindow( g_hWnd, NULL, &pt_dst, &sz_dst, g_hDC, &pt_src, 0, &blend, ULW_ALPHA );
    }

    static LRESULT CALLBACK layer_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch ( uMsg ) {
    case WM_NCHITTEST: return HTCAPTION;

    case WM_KEYDOWN:
    if ( (int)wParam != VK_ESCAPE ) break;

    case WM_DESTROY:
    PostQuitMessage( 0 );
    return 0;
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPInst, LPSTR lpCmdLine, int nCmdShow )
    {
    u32                 i;
    MSG                 msg;
    WNDCLASS            wc;
    BITMAPINFOHEADER    bi;

    ZeroMemory( &wc, sizeof( WNDCLASS ) );
    wc.style            = CS_OWNDC;
    wc.lpfnWndProc      = layer_proc;
    wc.hInstance        = hInst;
    wc.lpszClassName    = g_app_class_name;
    wc.hCursor          = LoadCursor( NULL, IDC_ARROW );
    if ( !RegisterClass( &wc ) ) return 1;

    g_hWnd = CreateWindowEx( WS_EX_LAYERED | WS_EX_TOPMOST,
    g_app_class_name, "layer", WS_POPUP | WS_VISIBLE | WS_SYSMENU,
    (GetSystemMetrics( SM_CXSCREEN ) >> 1) - (W >> 1),
    (GetSystemMetrics( SM_CYSCREEN ) >> 1) - (H >> 1),
    W, H, NULL, NULL, hInst, NULL );

    bi.biSize           = sizeof( BITMAPINFOHEADER );
    bi.biWidth          = W;
    bi.biHeight         = -H;
    bi.biPlanes         = 1;
    bi.biBitCount       = 32;
    bi.biCompression    = BI_RGB;
    g_hDC = CreateCompatibleDC( NULL );
    g_hDIB = CreateDIBSection( g_hDC, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&p_layer, NULL, 0 );
    SelectObject( g_hDC, g_hDIB );

    for ( i = 0; i < W * H; i++ ) {
    p_layer[i] = 0x7f7f7f7f;
    }

    // TODO: premultiply each pixel here

    layer_update();

    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
    }

    return 0;
    }
     

    Вложения:

    • Layered.zip
      Размер файла:
      15,5 КБ
      Просмотров:
      15
  14. Dock1100

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    Я делал похоже, но на Делфи.
    Поскоку прозрачность делается через WinApi, то должно работать без глюков на windows 2000 и выше.
     
  15. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Новая версия часов. С виду те же, зато размер в 9 раз меньше.
     

    Вложения:

    • elclock_r3.zip
      Размер файла:
      4,9 КБ
      Просмотров:
      18
  16. George

    George Гость

    Репутация:
    0
    Да, да компрессов великая штука !...
     
  17. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Размер не сжатого: 9216 байта. Чуть меньше чем в два раза больше)
     
  18. George

    George Гость

    Репутация:
    0
    Уважаемый наденьте на файл часиков иконку, а то выставлять в режиме НЮ ...
     
  19. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Иконка, иконка.... Я микрографику рисовать не умею)), а может мне просто лень.. кстати я об этом думал)) а раз я думал и не сделал значит мне точно лень)))

    вот это не совсем понял...
     
  20. George

    George Гость

    Репутация:
    0
    НЮ - это значит голый, не одетый!
    Часики, это Ваше чадо, так представте пжл миру, во всей красоте !!!
    А то лень !!!...???
     
Загрузка...
Похожие Темы - Аналоговые Часы
  1. mikhailkarmanov
    Ответов:
    0
    Просмотров:
    988
  2. Jenya555
    Ответов:
    0
    Просмотров:
    2.233
  3. wowa
    Ответов:
    15
    Просмотров:
    3.927
  4. dimon131
    Ответов:
    2
    Просмотров:
    2.180
  5. fedotxxl
    Ответов:
    15
    Просмотров:
    5.503

Поделиться этой страницей