как создать прозрачное окно
От: lord_206  
Дата: 25.10.05 13:12
Оценка:
У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.
Re: как создать прозрачное окно
От: Catty Украина  
Дата: 25.10.05 14:43
Оценка:
Здравствуйте, lord_206, Вы писали:

_>У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.


SetLayeredWindowAttributes — объявлена в winuser.h, но только при условии : #if(_WIN32_WINNT >= 0x0500)

Наверное, стоит прописать что-то типа

#define _WIN32_WINNT 0x0500

в stdafx.h
Re: как создать прозрачное окно
От: AlexGin Беларусь  
Дата: 25.10.05 15:17
Оценка:
Здравствуйте, lord_206, Вы писали:

_>У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.

Установите Platform SDK — как минимум для Windows 2000
Re[2]: как создать прозрачное окно
От: Аноним  
Дата: 26.10.05 20:22
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, lord_206, Вы писали:


_>>У меня ХР SP1 вот код: SetLayeredWindowAttributes и WS_LAYERED, VC6++ говорит что не знает who is it.

AG> Установите Platform SDK — как минимум для Windows 2000

Вот код:

class CNoteApp : public CWinApp 
{ 
public:
    
    virtual BOOL InitInstance();
};

class CMainWnd : public CFrameWnd
{
protected:
   afx_msg void OnPaint();
   afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 

   

   DECLARE_MESSAGE_MAP();
public:
};


BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
    ON_WM_LBUTTONDOWN()    
    ON_WM_PAINT()
END_MESSAGE_MAP()

 

BOOL CNoteApp::InitInstance()
{
 
  CMainWnd* pFrame = new CMainWnd;
  HWND hWnd=pFrame->m_hWnd ;
  

   

pFrame->CreateEx(WS_EX_LAYERED,
     0, _T("note"),
     WS_OVERLAPPEDWINDOW,
     400,
     200,
     200,
     200,
     NULL,
     NULL,
     NULL);
  
 typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags); 



lpfnSetLayeredWindowAttributes m_pSetLayeredWindowAttributes ;

HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL")); 
m_pSetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32, "SetLayeredWindowAttributes"); 

// If the import did not succeed, make sure your app can handle it! 
if (NULL == m_pSetLayeredWindowAttributes) 
return FALSE; // Bail out!!! 
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
m_pSetLayeredWindowAttributes(hWnd, 0, (255 / 90) * 100, LWA_ALPHA);


   
   pFrame->ShowWindow(SW_SHOW);
   pFrame->UpdateWindow();
   this->m_pMainWnd=pFrame ;
   
return true;
}

Создается окно невидимое, срабатывает параметр CreateEx(WS_EX_LAYERED), но прозрачность не регулируется так как окно не видно. Создал окно с помощью мастера Windows 32 Aplication "hello world" все работает, а когда создаю в ручную (код выше) — не работает , видимо неправильно с передачей hWnd . Подскажите плиз в чем и где беда
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 27.10.05 05:52
Оценка:
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[3]: как создать прозрачное окно
От: Catty Украина  
Дата: 27.10.05 06:41
Оценка:

А>BOOL CNoteApp::InitInstance()
А>{
 
А>  CMainWnd* pFrame = new CMainWnd;
А>  HWND hWnd=pFrame->m_hWnd ;              - //hWnd - это не указатель, поэтому после изменения хэндла 
                                               //m_hWnd в pFrame(после создания) он всё равно останется 
                                               //равным 0x0000000, и все манипуляции над ним бесполезны
     
А>pFrame->CreateEx(WS_EX_LAYERED,
А>     0, _T("note"),
А>     WS_OVERLAPPEDWINDOW,
А>     400,
А>     200,
А>     200,
А>     200,
А>     NULL,
А>     NULL,
А>     NULL);
   
А>   pFrame->ShowWindow(SW_SHOW);
А>   pFrame->UpdateWindow();
   this->>m_pMainWnd=pFrame ;
   
А>return true;
А>}
А>


HWND hWnd=pFrame->m_hWnd — если произвести это присваивание после строчки pFrame->CreateEx, то всё будет ОК и переменная hWnd будет содержать реальный хэндл только что созданного окна.
Или заменить везде hWnd на pFrame->GetSafeHwnd()...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.