赞
踩
窗口进程不会在通知栏,VS运行的时候还不会显示在任务管理器中,大家只需要正常点<好!>就能关闭窗口,窗口可以直接鼠标点击移动。
- // WindowsProject3.cpp : 定义应用程序的入口点。
- //
-
- #include <windows.h>
- #include <time.h>
-
- #define MAX_LOADSTRING 100
-
- HWND hbutton1;
- HWND hbutton2;
-
- // 全局变量:
- HINSTANCE hInst; // 当前实例
- WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
- WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
-
- // 此代码模块中包含的函数的前向声明:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
-
- int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
- _In_opt_ HINSTANCE hPrevInstance,
- _In_ LPWSTR lpCmdLine,
- _In_ int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
-
- // TODO: 在此处放置代码。
-
- // 初始化全局字符串
- LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadStringW(hInstance, IDC_WINDOWSPROJECT3, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
-
- // 执行应用程序初始化:
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
-
- HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT3));
-
- MSG msg;
-
- // 主消息循环:
- while (GetMessage(&msg, nullptr, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
-
- return (int) msg.wParam;
- }
-
-
-
- //
- // 函数: MyRegisterClass()
- //
- // 目标: 注册窗口类。
- //
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEXW wcex;
-
- wcex.cbSize = sizeof(WNDCLASSEX);
-
- wcex.style = CS_HREDRAW | CS_VREDRAW| CS_DBLCLKS;
- wcex.lpfnWndProc = WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT3));
- wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wcex.lpszMenuName = NULL;
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
-
- return RegisterClassExW(&wcex);
- }
-
- //
- // 函数: InitInstance(HINSTANCE, int)
- //
- // 目标: 保存实例句柄并创建主窗口
- //
- // 注释:
- //
- // 在此函数中,我们在全局变量中保存实例句柄并
- // 创建和显示主程序窗口。
- //
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- hInst = hInstance; // 将实例句柄存储在全局变量中
-
- HWND hWnd = CreateWindowEx(
- WS_EX_TOOLWINDOW, // 使用 WS_EX_TOOLWINDOW 样式
- szWindowClass,
- szTitle,
- WS_POPUP| WS_BORDER,
- 400, 300,
- 600, 400,
- NULL,
- NULL,
- hInstance,
- NULL
- );
-
- hbutton1 = CreateWindow(_T("button"), _T("按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER, 400, 300, 100, 30, hWnd, (HMENU)10086, hInstance, NULL);
-
- hbutton2 = CreateWindow(_T("button"), _T("按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER, 100, 300, 100, 30, hWnd, (HMENU)10087, hInstance, NULL);
-
- SetWindowText(hbutton1, _T("拒绝"));
- SetWindowText(hbutton2, _T("好!"));
-
- srand((unsigned)time(0));
-
- if (!hWnd)
- {
- return FALSE;
- }
-
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
-
- return TRUE;
- }
-
- //
- // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // 目标: 处理主窗口的消息。
- //
- // WM_COMMAND - 处理应用程序菜单
- // WM_PAINT - 绘制主窗口
- // WM_DESTROY - 发送退出消息并返回
- //
- //
-
-
- bool isPointInRect(const RECT& rect, const POINT& point) {
- if (point.x >= rect.left && point.x <= rect.right &&
- point.y >= rect.top && point.y <= rect.bottom) {
- return true;
- }
- else {
- return false;
- }
- }
-
-
-
-
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_CREATE:
- SetTimer(hWnd, 10001, 1, NULL);
- break;
- case WM_TIMER:
- {
- RECT r1 = { 0 }; //窗口坐标
- GetWindowRect(hWnd, &r1);
- RECT r2 = { 0 }; //按钮坐标
- GetWindowRect(hbutton1, &r2);
- POINT p1 = { 0 }; //鼠标坐标
- GetCursorPos(&p1);
-
- if (isPointInRect(r2, p1)) //鼠标是否在按钮上
- {
- r2.left = rand() % 500;
- r2.top = rand() % 370;
- MoveWindow(hbutton1, r2.left, r2.top, 100, 30, true);
- InvalidateRect(hWnd, &r1, TRUE);
- }
- else
- {
-
- }
-
- }
- break;
- case WM_NCHITTEST:
- return HTCAPTION;
- case WM_COMMAND:
- {
- int wmId = LOWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case 10087:
- MessageBox(0, 0, 0, 0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- }
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- HDC hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此处添加使用 hdc 的任何绘图代码...
-
- HBITMAP bit = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
- HDC hBuffDC = CreateCompatibleDC(hdc);
- SelectObject(hBuffDC, bit);
- BitBlt(hdc, 80, 50, 220, 220, hBuffDC, 0, 0, SRCCOPY);
-
- HBITMAP bit1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
- HDC hBuffDC1 = CreateCompatibleDC(hdc);
- SelectObject(hBuffDC1, bit1);
- BitBlt(hdc, 310, 50, 220, 220, hBuffDC1, 0, 0, SRCCOPY);
-
- EndPaint(hWnd, &ps);
- }
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
效果图:
鼠标放在拒绝按钮上,拒绝按钮会自己随机在窗口内移动,点击好的判断在WM_COMMAND消息中的case 10087:自己给messagebox加上要显示的字符串,
关键部分:
1、CreateWindowEx创建窗口函数,注意他和普通的函数是不一样,多了一个参数,也就是第一个参数WS_EX_TOOLWINDOW,工具窗口的风格,这种就不会显示通知栏的图标
2、只有1中的宏还是会保留标题栏的,所以在第四个参,风格的位置,改为WS_POPUP弹出式窗口的风格,那么就不存在标题栏了
3、这种WS_EX_TOOLWINDOW风格的窗口接收不到鼠标移动消息,所以用了一个计时器间隔1毫秒就判断鼠标位置是否在按钮中,如果在就移动按钮,不在就不动
4、关于点击<好!>就退出,记得加上PostQuitMessage(0);调用就可以了
最后实现这样一个程序,需要有基本的win32编程基础,剩下的就是自己随意发挥了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。