100分求救:分层窗口实践--屏幕精灵(给出可行答案给分,更好指出我的错误)

s58420411 2011-12-18 01:43:08
第一次实践分层窗口,因为教材是C++的,而我用windowsAPI函数库,所以有可能只得其型,不得其意,望指正~~Windows

程序设计爱好者可以一起讨论讨论,学习,一个人奋斗还是比较寂寞的~~

有意者加Q,大家共同进步。有大牛批评指教更好,哈哈~~~

QQ:104943476
废话不多说,上代码~~

//程序主体
#include <windows.h>
#include <mmsystem.h>
#include <resource.h>
#pragma comment(lib, "winmm.lib")//编译错误处理


//全局变量
static TCHAR szAppName[] = TEXT("sfsf");//class name
POINT ptSrc;//LayeredWindow source coordinate
HDC hdcme;//memeory DC
SIZE size;
BLENDFUNCTION blend;//layeredwindow struct

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

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR szCmdline,
int iCmdShow)
{
WNDCLASS wndclass;
HWND hwnd;
MSG msg;

// wndclass.dwSize = sizeof(WNDCLASS);
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDC_IBEAM);
wndclass.hCursor = LoadCursor(hInstance, IDC_APPSTARTING);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;

//regist class
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, "注册windows类失败!", szAppName, MB_ICONERROR);
return 0;
}

//create window
hwnd = CreateWindowEx(WS_EX_LAYERED,
szAppName,
"sfsfsdqw",
WS_OVERLAPPEDWINDOW ,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);

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

return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
//DWORD dwStyle;
RECT rectClient;
POINT * prcsize;
HBITMAP hp;
BITMAP bp;
int error_code = 0;//update layered window error code


switch(message)
{
case WM_CREATE:
hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
//dwStyle = GetWindowLong(hwnd, GWL_STYLE);
//dwStyle = WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_EX_LAYERED;
//SetWindowLong(hwnd, GWL_STYLE, dwStyle | WS_EX_LAYERED);
prcsize = (LPPOINT)malloc(sizeof(POINT));
GetWindowOrgEx(hdc, prcsize);
size.cx = (*prcsize).x;
size.cy = (*prcsize).y;
blend.AlphaFormat = 0;
blend.BlendFlags = 0;
blend.BlendOp = AC_SRC_OVER;
blend.SourceConstantAlpha = 255;//设置透明度
//SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_EX_LAYERED);
hdcme = CreateCompatibleDC(GetDC(hwnd));
hp = LoadBitmap(NULL, MAKEINTRESOURCE(IDB_BITMAP1));
GetObject(hp, sizeof(BITMAP), &bp);
SelectObject(hdcme, hp);
//设置窗口大小
size.cx = bp.bmWidth;
size.cy = bp.bmHeight;
UpdateLayeredWindow(hwnd, NULL, NULL, &size, (HDC)hdcme, &ptSrc, RGB(255,255,255), &blend, ULW_COLORKEY);
if(error_code != 0)
{
MessageBox(hwnd, "update layered window error!", NULL, 30);
}
SetTimer(hwnd, 1, 850, NULL);
UpdateWindow(hwnd);
DeleteDC(hdc);
DeleteDC(hdcme);

return 0 ;

case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rectClient);
TextOut(hdc, 400, 300, "窗口已经建立!", 12);
EndPaint(hwnd, &ps);
return 0 ;

case WM_TIMER:
ptSrc.x = rand()%400+200;
ptSrc.x = rand()%500+300;

SetWindowPos(hwnd, HWND_TOP, ptSrc.x, ptSrc.y, 0, 0, SWP_NOSIZE);
UpdateLayeredWindow(hwnd, NULL, NULL, &size, (HDC)hdcme, &ptSrc, 0, &blend, ULW_COLORKEY);

return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}


...全文
59 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧