网站客服系统公司最近的电脑培训学校
再再再次感谢Ttcofee提的问题
本次更新内容:
鼠标图案,获取系统时间(优化)
提前申明:如果运行不了,请到主页查看RedpandaDevc++下载,若还是不行就卸了重装。
版本号:1.6.5
//版本号 :v1.6.5
//最终归属权为作者(饼干帅成渣)所有
//禁止转载
//仅供学习,不得用于违法
#include <windows.h>
#include <gdiplus.h>
#include <string>
#include <iostream>
// 控件和消息定义
#define IDC_STATIC_TIME 1007
#define IDC_EDIT_PWD 1001
#define IDC_BTN_TOGGLE 1002
#define IDC_EDIT1 1003
#define IDC_BUTTON_SUBMIT 1004
#define IDC_BTN_TRAY 1005
#define WM_TRAY_ICON 1006
using namespace std;
HWND g_hwnd;
HWND hhwwnndd;
NOTIFYICONDATA g_nid = {0};
bool g_isInTray = false;
HWND hEdit;
HWND hButton, hButton2;
POINT g_startPos, g_endPos;
RECT g_originalRect;
LONG_PTR g_originalStyle;
bool g_isFullscreen = false;
HBITMAP g_hMemBitmap = NULL;
HDC g_hMemDC = NULL;
int g_width = 0, g_height = 0;
bool g_isPasswordMode = true; // 初始为密码模式void InitTrayIcon(HWND hwnd) {g_nid.cbSize = sizeof(NOTIFYICONDATA);g_nid.hWnd = hwnd;g_nid.uID = 1;g_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;g_nid.uCallbackMessage = WM_TRAY_ICON;g_nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
}// 切换托盘状态
void ToggleTrayMode(HWND hwnd) {if (!g_isInTray) {// 最小化到托盘ShowWindow(hwnd, SW_HIDE);Shell_NotifyIcon(NIM_ADD, &g_nid);} else {// 恢复窗口ShowWindow(hwnd, SW_SHOW);Shell_NotifyIcon(NIM_DELETE, &g_nid);}g_isInTray = !g_isInTray;
}// 初始化双缓冲
void InitDoubleBuffer(HWND hwnd) {RECT rc;GetClientRect(hwnd, &rc);g_width = rc.right - rc.left;g_height = rc.bottom - rc.top;HDC hdc = GetDC(hwnd);g_hMemDC = CreateCompatibleDC(hdc);g_hMemBitmap = CreateCompatibleBitmap(hdc, g_width, g_height);SelectObject(g_hMemDC, g_hMemBitmap);ReleaseDC(hwnd, hdc);// 初始清屏(可选)FillRect(g_hMemDC, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
}
// 切换全屏函数
void ToggleFullscreen(HWND hwnd) {if (!g_isFullscreen) {// 进入全屏GetWindowRect(hwnd, &g_originalRect);g_originalStyle = GetWindowLongPtr(hwnd, GWL_STYLE);int screenWidth = GetSystemMetrics(SM_CXSCREEN);int screenHeight = GetSystemMetrics(SM_CYSCREEN);SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP);SetWindowPos(hwnd, HWND_TOP,0, 0, screenWidth, screenHeight,SWP_FRAMECHANGED | SWP_SHOWWINDOW);} else {// 退出全屏SetWindowLongPtr(hwnd, GWL_STYLE, g_originalStyle);SetWindowPos(hwnd, NULL,g_originalRect.left,g_originalRect.top,g_originalRect.right - g_originalRect.left,g_originalRect.bottom - g_originalRect.top,SWP_FRAMECHANGED | SWP_NOZORDER);}g_isFullscreen = !g_isFullscreen;
}// 切换密码显示模式
void TogglePasswordMode(HWND hwnd) {// 保存当前文本wchar_t szText[256] = {0};GetWindowTextW(hEdit, szText, 256);// 获取当前窗口位置RECT rc;GetWindowRect(hEdit, &rc);MapWindowPoints(HWND_DESKTOP, GetParent(hEdit), (LPPOINT)&rc, 2);// 销毁旧编辑框DestroyWindow(hEdit);// 创建新编辑框(切换样式)DWORD style = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL;if (g_isPasswordMode) {style |= ES_PASSWORD;}hEdit = CreateWindowW(L"EDIT", szText,style,rc.left, rc.top,rc.right - rc.left,rc.bottom - rc.top,hwnd, (HMENU)IDC_EDIT_PWD,NULL,NULL);// 更新模式状态g_isPasswordMode = !g_isPasswordMode;// 更新按钮文本SetWindowTextW(GetDlgItem(hwnd, IDC_BTN_TOGGLE),g_isPasswordMode ? L"隐藏密码" : L"显示明文");
}// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static HWND hStaticTime; // 静态文本控件句柄switch (msg) {case WM_SETCURSOR:if (1) {HCURSOR hCursor;hCursor = LoadCursor(NULL, IDC_NO);SetCursor(hCursor); // 设置光标return TRUE; // 阻止默认处理}break;case WM_SIZE:// 窗口大小变化时重置缓冲if (g_hMemDC) {DeleteDC(g_hMemDC);DeleteObject(g_hMemBitmap);}InitDoubleBuffer(hwnd);break;case WM_KEYDOWN:if (wParam == VK_BACK) { // 按Backspace切换全屏ToggleFullscreen(hwnd);} else if (wParam == VK_CONTROL) {DestroyWindow(hwnd);HWND hwnwd;hwnwd = FindWindow("ConsoleWindowClass", NULL);if (hwnwd) {ShowOwnedPopups(hwnwd, SW_SHOW);ShowWindow(hwnwd, SW_SHOW);}}return 0;case WM_PAINT: { // 窗口需要绘制时触发PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps); // 获取设备上下文// 设置背景模式为透明BitBlt(hdc, 0, 0, g_width, g_height, g_hMemDC, 0, 0, SRCCOPY);SetBkMode(hdc, TRANSPARENT);HPEN hDashPen = CreatePen(PS_DASH, 1, RGB(256, 256, 256));SelectObject(hdc, hDashPen);MoveToEx(hdc, g_startPos.x, g_startPos.y, NULL);LineTo(hdc, g_endPos.x, g_endPos.y);return 0;}case WM_CLOSE:// 清理托盘图标if (g_isInTray) Shell_NotifyIcon(NIM_DELETE, &g_nid);DestroyWindow(hwnd);break;case WM_DESTROY:KillTimer(hwnd, 1); // 销毁定时器PostQuitMessage(0);return 0;break;// 处理鼠标消息case WM_LBUTTONDOWN:g_startPos.x = LOWORD(lParam);g_startPos.y = HIWORD(lParam);return 0;case WM_MOUSEMOVE:if (wParam & MK_LBUTTON) {g_endPos.x = LOWORD(lParam);g_endPos.y = HIWORD(lParam);InvalidateRect(hwnd, NULL, TRUE);}return 0;case WM_ERASEBKGND:return 1; // 禁用背景擦除case WM_CREATE: {// 创建获取时间hhwwnndd = CreateWindowW(L"BUTTON", L"获取系统时间",WS_CHILD | WS_VISIBLE | SS_CENTER,20, 350, 150, 30,hwnd, (HMENU)12345,NULL, NULL);// 创建按钮CreateWindowW(L"BUTTON", L"最小化到托盘",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,400, 50, 150, 30, hwnd,(HMENU)IDC_BTN_TRAY, NULL, NULL);// 初始化托盘InitTrayIcon(hwnd);// 创建按钮hButton = CreateWindow("BUTTON", // 窗口类(按钮)"点击我关闭", // 按钮文本WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 样式50, 50, // 位置 (x, y)100, 30, // 大小 (宽度, 高度)hwnd, // 父窗口句柄(HMENU)1, // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL // 附加数据);hButton2 = CreateWindow("BUTTON", // 窗口类(按钮)"点击我切换全屏", // 按钮文本WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 样式850, 50, // 位置 (x, y)100, 30, // 大小 (宽度, 高度)hwnd, // 父窗口句柄(HMENU)2, // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL // 附加数据);// 创建切换按钮CreateWindowW(L"BUTTON", L"隐藏密码",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,100, 300, 80, 30,hwnd, (HMENU)IDC_BTN_TOGGLE,NULL, NULL);hEdit = CreateWindowW(L"EDIT", L"",WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,20, 250, 200, 25, hwnd, (HMENU)IDC_EDIT1, NULL, NULL);CreateWindowW(L"BUTTON", L"示例输入",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20, 300, 80, 30, hwnd, (HMENU)IDC_BUTTON_SUBMIT, NULL, NULL);return 0;}case WM_TRAY_ICON:if (lParam == WM_LBUTTONDBLCLK) {ToggleTrayMode(hwnd);}return 0;// 禁用系统最小化操作case WM_SYSCOMMAND:if (wParam == SC_MINIMIZE) {ToggleTrayMode(hwnd);return 0;}break;case WM_COMMAND: {if (wParam == 12345) { //ID为12345// 获取本地时间SYSTEMTIME st;GetLocalTime(&st);// 格式化时间字符串wchar_t timeStr[64];_snwprintf(timeStr, 64,L"%04d-%02d-%02d %02d:%02d:%02d",st.wYear, st.wMonth, st.wDay,st.wHour, st.wMinute, st.wSecond);// // 更新静态文本
// SetWindowTextW(hStaticTime, timeStr);// 可选:弹出消息框显示MessageBoxW(hwnd, timeStr, L"系统时间", MB_OK);}if (LOWORD(wParam) == IDC_BTN_TRAY) {ToggleTrayMode(hwnd);}if (LOWORD(wParam) == IDC_BUTTON_SUBMIT) {wchar_t buffer[256];GetWindowTextW(hEdit, buffer, 256);if (wcslen(buffer) == 0) {MessageBoxW(hwnd, L"输入不能为空!", L"错误", MB_ICONERROR);} else {MessageBoxW(hwnd, buffer, L"输入内容", MB_OK);}}if (LOWORD(wParam) == IDC_BTN_TOGGLE) {TogglePasswordMode(hwnd);}int ButtonID = LOWORD(wParam);switch (ButtonID) {case 1:DestroyWindow(hwnd);HWND hwnwd;hwnwd = FindWindow("ConsoleWindowClass", NULL);if (hwnwd) {ShowOwnedPopups(hwnwd, SW_SHOW);ShowWindow(hwnwd, SW_SHOW);}break;case 2:ToggleFullscreen(hwnd);break;}}default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow) {HWND hwnwd;hwnwd = FindWindow("ConsoleWindowClass", NULL);if (hwnwd) {ShowOwnedPopups(hwnwd, SW_HIDE);ShowWindow(hwnwd, SW_HIDE);}const char* CLASS_NAME = "CustomWindowClass";WNDCLASS wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = TEXT(CLASS_NAME);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);if (!RegisterClass(&wc)) return 0;// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展样式TEXT(CLASS_NAME), // 窗口类" 绘画", // 窗口标题WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, // 位置1000, 1000, // 大小NULL, // 父窗口NULL, // 菜单hInstance, // 实例句柄NULL // 附加数据);if (!hwnd) return 0;// 消息循环MSG msg = {};while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}
当然,还有彩蛋
#include <windows.h>
#include <string>#define IDC_STATIC_TIME 1001// 窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static HWND hStaticTime;switch (msg) {case WM_CREATE: {// 创建时间显示控件hStaticTime = CreateWindowW(L"STATIC", L"00:00:00",WS_CHILD | WS_VISIBLE | SS_CENTER,20, 20, 200, 30,hwnd, (HMENU)IDC_STATIC_TIME,NULL, NULL);// 设置定时器(12毫秒更新一次)SetTimer(hwnd, 1, 12, NULL);return 0;}case WM_TIMER: {if (wParam == 1) { // 定时器ID为1// 获取本地时间SYSTEMTIME st;GetLocalTime(&st);// 格式化时间(含毫秒)wchar_t timeStr[64];_snwprintf(timeStr,64,L"%02d:%02d:%02d.%03d",st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);// 更新显示SetWindowTextW(hStaticTime, timeStr);}return 0;}case WM_CLOSE:KillTimer(hwnd, 1); // 销毁定时器DestroyWindow(hwnd);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProcW(hwnd, msg, wParam, lParam);}
}// WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {const wchar_t CLASS_NAME[] = L"DynamicTimeWindow";WNDCLASSW wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);RegisterClassW(&wc);HWND hwnd = CreateWindowExW(0, CLASS_NAME, L"动态时间示例",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,300, 150, NULL, NULL, hInstance, NULL);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);MSG msg;while (GetMessageW(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessageW(&msg);}return 0;
}
OK,今天就到这里
点赞再走
x=?