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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
У меня даже пустое окно моргает. Пример я приводил выше... 04.10.08 05:54  Число просмотров: 1623
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
У меня даже пустое окно моргает. Пример я приводил выше. Твои рекомендации учёл, окно продолжает моргать. Или мы на разных языках говорим?
<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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach