информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Блокировка российских аккаунтов... 
 Отзыв сертификатов ЦБ РФ, ПСБ,... 
 Памятка мирным людям во время информационной... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ws_ex_composited - говорит виндовз xp, что надо использовать... 22.09.08 15:20  Число просмотров: 2804
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Такое ощущение, что сначала отображается непрозрачное окно,
> потом оно скрывается и отображается прозрачное.

WS_EX_COMPOSITED - говорит виндовз XP, что надо использовать даблбуфферинг при выводе окна. Тот же самый эффект - "залипание" и немедленный вывод окна с изменнёнными размерами, при изменении размеров. На виста и так всё работает красиво, без этих "улучшений".
<programming>
[Win32] Устранить чёрное мигание прозрачного окна 21.09.08 06:08  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
В Интернете нашёл пример прозрачного окна. Всё сделано, как написано в MSDN, но почему-то перед открытием окна оно мигает чёрным цветом. Если убрать функции прозрачности, то всё нормально. Почему так? Вот код:
#include <windows.h>

#define LWA_COLORKEY	0x00000001
#define LWA_ALPHA	0x00000002
#define WS_EX_LAYERED	0x00080000

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	static char szAppName[] = "HelloWin";
	HWND hwnd;
	MSG msg;

	WNDCLASSEX wndclass;

	wndclass.cbSize = sizeof (wndclass);
	wndclass.style = NULL;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	RegisterClassEx(&wndclass);

	hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_SYSMENU,
						CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
						NULL, NULL,	hInstance, NULL);

	hm = GetModuleHandle("USER32.DLL");
	pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");

	if (pfn)
	{
		SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
		pfn(hwnd, 0, 200, LWA_ALPHA);
	}
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);

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

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;

	switch (iMsg)
	{
	case WM_CREATE:
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc( hwnd, iMsg, wParam, lParam );
	}
}

---
[Win32] Собрал пример - ничего не мигает 22.09.08 20:19  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Так что проверить не могу, но попробуй все таки обработать WM_ERASEBKGND - это очень частый виновник всех и всяческих миганий.
Так вроде не мигает, если добавить anti-flickering, что само... 22.09.08 07:03  
Автор: void <Grebnev Valery> Статус: Elderman
Отредактировано 22.09.08 07:04  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Так вроде не мигает, если добавить anti-flickering, что само по-себе полезно при resize:

hWnd = ::CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

::ShowWindow(hWnd, nCmdShow);
::UpdateWindow(hWnd);

LONG wStyle = ::GetWindowLongPtr(hWnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED;
::SetWindowLongPtr(hWnd,GWL_STYLE, wStyle);

wStyle = ::GetWindowLongPtr(hWnd,GWL_EXSTYLE);
wStyle |= WS_EX_COMPOSITED;
::SetWindowLongPtr(hWnd,GWL_EXSTYLE, wStyle);

::SetWindowLongPtr(hWnd, GWL_EXSTYLE, GetWindowLongPtr(hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);
::SetLayeredWindowAttributes( hWnd, 0, 200, LWA_ALPHA);

Кстати, Get/SetWindowLongPtr лучше чем Get/SetWindowLong.
Помогло?
Спасибо. Помогло, но на 100% я пока не удовлетворён. При... 22.09.08 07:55  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Спасибо. Помогло, но на 100% я пока не удовлетворён. При появлении окна теперь оно как-то странно подёргивается. Такое ощущение, что сначала отображается непрозрачное окно, потом оно скрывается и отображается прозрачное.

Ещё заметил, что если ShowWindow стоит сразу же после CreateWindow, то происходит выше озвученное подёргивание, а если вызвать ShowWindow после всех манипуляций, то окно сначала мигает чёрным цветом.

Вот код:
#include <windows.h>

#define LWA_ALPHA	0x00000002
#define WS_EX_LAYERED	0x00080000
#define WS_EX_COMPOSITED	0x02000000

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	static char szAppName[] = "HelloWin";
	HWND hwnd;
	MSG msg;

	WNDCLASSEX wndclass;

	wndclass.cbSize = sizeof (wndclass);
	wndclass.style = NULL;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

	RegisterClassEx(&wndclass);

	hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
						CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
						NULL, NULL,	hInstance, NULL);

	UpdateWindow(hwnd);
	ShowWindow(hwnd, SW_SHOWNORMAL);

	hm = GetModuleHandle("USER32.DLL");
	pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");

	LONG wStyle = GetWindowLongPtr(hwnd,GWL_STYLE); 
	wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED; 
	SetWindowLongPtr(hwnd,GWL_STYLE, wStyle); 

	wStyle = GetWindowLongPtr(hwnd,GWL_EXSTYLE); 
	wStyle |= WS_EX_COMPOSITED; 
	SetWindowLongPtr(hwnd,GWL_EXSTYLE, wStyle); 

	SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED); 

	if (pfn)
	{
		SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
		pfn(hwnd, 0, 200, LWA_ALPHA);
	}

	//	UpdateWindow(hwnd);
	//	ShowWindow(hwnd, SW_SHOWNORMAL);

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

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	switch (iMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc( hwnd, iMsg, wParam, lParam );
	}
}

---
Ws_ex_composited - говорит виндовз xp, что надо использовать... 22.09.08 15:20  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Такое ощущение, что сначала отображается непрозрачное окно,
> потом оно скрывается и отображается прозрачное.

WS_EX_COMPOSITED - говорит виндовз XP, что надо использовать даблбуфферинг при выводе окна. Тот же самый эффект - "залипание" и немедленный вывод окна с изменнёнными размерами, при изменении размеров. На виста и так всё работает красиво, без этих "улучшений".
Т.е. под XP без моргания окно сделать не получится? 04.10.08 02:14  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Но ведь такие приложения как Kasperky Antivirus, Avast не моргают при выводе таких окон.
Я тебе отвечал на твой конкретный вопрос. Что же до того,... 04.10.08 03:42  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Но ведь такие приложения как Kasperky Antivirus, Avast не
> моргают при выводе таких окон.
Я тебе отвечал на твой конкретный вопрос. Что же до того, когда моргает, когда нет - напиши Win API приложение. Сделай там TabControl. Попробуй поизменяй размеры родительского окна, так чтобы TabControl автоматически делал resize. Если контролы на табе и сам таб замигают, тогда давай и обсудим.
У меня даже пустое окно моргает. Пример я приводил выше... 04.10.08 05:54  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
У меня даже пустое окно моргает. Пример я приводил выше. Твои рекомендации учёл, окно продолжает моргать. Или мы на разных языках говорим?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach