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

09.11.2009
665
1
#5
Симпатично. Можете добавить возможность менять фоновою картинку и по возможности стрелки на сои?
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#6
Dock1100
Понимаете, я не использовал ни одной картинки и ни одного спрайта. Все рисуется программным путем. Для того чтобы добавить такую возможность мне придется половину программы переписать.
И еще, что значит "сои" ?))
 
G

George

Гость
#7
lazybiz ...

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

:welcome: Doсk !

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

lazybiz

Well-Known Member
03.11.2010
1 339
0
#8
George
Я не пишу в Visual C++, может знаете есть такой компилятор Open Watcom ? Так вот я предпочитаю именно его)) По мне очень удобный, оптимизирует отлично, но больше всего мне нравится то, что в нем можно аккуратно кастомизировать, так сказать, вставки на ассемблере (вот здесь можете посмотреть: http://www.azillionmonkeys.com/qed/watcom.html).
По поводу того что каждому нужен выбор я с вами согласен, но у меня идеология такая что не позволяет использовать битмэпы. Я считаю что идеальная программа (которая связана с UI) должна все рисовать программным путем, можете конечно судить но все же это мое мнение:welcome:
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#10
Если кто загружал, мне интересны мнения у кого, как и на какой ОС работает, были ли какие глюки или нет, т.к. я испытывал только на 7-ке. Заранее благодарен, т.к. для меня это важно.
 
09.11.2009
665
1
#11
У меня тоже 7 стоит, работает без глюков. А можно по интересоватся , прозрачность делается через WinApi?
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#12
Dock1100
Да. Создается окно (CreateWindowEx) с EX-стайлом WS_EX_LAYERED. Далее создается DIB Section (CreateDIBSection), которая в конечном итоге накладывается на прозрачное окно. А уж потом собственно вызывается UpdateLayeredWindow (когда все окно необходимо обновить).

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

lazybiz

Well-Known Member
03.11.2010
1 339
0
#13
Обращаю внимание что данный код писался для 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;
}
 

Вложения

09.11.2009
665
1
#14
Я делал похоже, но на Делфи.
Поскоку прозрачность делается через WinApi, то должно работать без глюков на windows 2000 и выше.
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#15
Новая версия часов. С виду те же, зато размер в 9 раз меньше.
 

Вложения

lazybiz

Well-Known Member
03.11.2010
1 339
0
#17
Размер не сжатого: 9216 байта. Чуть меньше чем в два раза больше)
 
G

George

Гость
#18
Уважаемый наденьте на файл часиков иконку, а то выставлять в режиме НЮ ...
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#19
Иконка, иконка.... Я микрографику рисовать не умею)), а может мне просто лень.. кстати я об этом думал)) а раз я думал и не сделал значит мне точно лень)))

а то выставлять в режиме НЮ ...
вот это не совсем понял...
 
G

George

Гость
#20
НЮ - это значит голый, не одетый!
Часики, это Ваше чадо, так представте пжл миру, во всей красоте !!!
А то лень !!!...???