再次感谢Ttcofee提的问题
本次更新内容:
新增输入,切换密码模式和提交 (两个按钮)
提前申明:如果运行不了,请到主页查看RedpandaDevc++下载,若还是不行就卸了重装。
errors
#include <windows.h>
#include <gdiplus.h>
#include <string>
#define IDC_EDIT_PWD 1001
#define IDC_BTN_TOGGLE 1002
#define IDC_EDIT1 1003
#define IDC_BUTTON_SUBMIT 1004
using namespace std;
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 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) {
switch (msg) {
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:
break;
case WM_DESTROY:
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; // 禁用背景擦除
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
case WM_CREATE: {
// 创建按钮
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_COMMAND: {
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;
}
return 0;
}
}
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;
}