WS_EX_LAYERED属性添加后出现的问题。(两天内必定结贴)
#include <windows.h>
#include <stdio.h>
#include<string>
#include <time.h>
using namespace std;
#define WS_EX_LAYERED 0x80000
typedef BOOL (WINAPI*FPT)(HWND,int,BOOL,DWORD);
FPT fp;
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="Weixin2003";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED|WS_EX_TOOLWINDOW,"WinSunProc",NULL,WS_POPUP|WS_SYSMENU,
0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HMODULE hsad=LoadLibrary("user32.dll");
HDC hdc;
char str[]="I love You";
switch(uMsg)
{
case WM_CREATE:
fp=(FPT)GetProcAddress(hsad,"SetLayeredWindowAttributes");
FreeLibrary(hsad);
fp(hwnd,RGB(255,255,255),200,3);
MessageBox(hwnd,"","",MB_OK);
SetTimer(hwnd,1,1000,NULL);
break;
case WM_TIMER:
hdc = GetDC(hwnd);
TextOut(hdc,rand()%SM_CXSCREEN,rand()%SM_CYSCREEN,str,sizeof(str)-1);
break;
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_LBUTTONDOWN:
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
程序希望的功能,在屏幕的桌面上每隔一秒中随机在某处打印 I love you。
我在createWindowEx中添加了 新的属性WS_EX_LAYERED,使得窗口透明,然而这样就出现了问题。调试结果的问题如下,
窗口并不出现,消息循环中如果使用了GetMessage(),那么将永远不返回,使得消息循环停滞,如果使用peekMessage 则反回0,使得程序直接退出了。 请问我该如果跟改,才能让程序响应WM_CREATE 消息。
相关推荐
VC中对话框窗体背景透明而控件不透明
VC中对话框窗体背景透明,而对话框窗体上的控件不透明。
C++两万字总结Windows系统中的Layered分层窗口技术(附源码)
在开发Windows应用程序时,我们会时常使用Layered分层窗口实现特殊的视觉效果。在Windows系统中,操作Layered分层窗口的API函数分别是SetLayeredWindowAttributes和UpdateLayeredWindow,其中SetLayeredWindowAttributes可以设置窗口的透明度,UpdateLayeredWindow则能实现各种特殊效果的异形窗口。 今天就来详细介绍一下如何使用这两个函数去实现指定效果的Layered分层窗口,以...
Delphi添加图层蒙版.rar
Delphi添加图层蒙版,运行本程序后,在屏幕上添加一层阴影,透明度大概在70%左右,可看作是在屏幕上方蒙了一层薄膜的感觉,代码简单:procedure TForm1.FormCreate(Sender: TObject); var bTrans: Byte; OldStyle: Integer; begin form1.Color := clGradientActiveCaption; WindowState := wsMaximized; BorderStyle := bsNone; FormStyle := fsStayOnTop; OldStyle := GetWindowLong(Handle, GWL_EXSTYLE); SetWindowLong(Handle, GWL_EXSTYLE, OldStyle or WS_EX_LAYERED Or WS_EX_TRANSPARENT); bTrans := 128; SetLayeredWindowAttributes(Handle, 0, bTrans, LWA_ALPHA); end;
layered窗体阴影
layered窗体通过GDI+绘制带有alpha通道的图片实现窗体阴影,该案例基于MFC和ATL实现
制作半透明窗口-WS_EX_LAYERED-SetWindowLong
介绍编写半透明窗口的源代码,API的NO—MFC,JUST DO IT!


界面
