win32 sdk inputbox 输入框

本文详细介绍了如何创建和使用输入对话框,包括窗口过程回调、显示对话框、获取输入内容等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//InputDialog.cpp 

#include "StdAfx.h"
#include ".\inputdialog.h"

CInputDialog::CInputDialog(void)
{
}

CInputDialog::~CInputDialog(void)
{
}
 

LRESULT CALLBACK InputBoxWndProc(HWND WndHandle, UINT Message, WPARAM wParam, LPARAM lParam)
{	
	static InputBoxStringType *Results = 0;	
	static HWND InputLabelHandle = 0;
	static HWND InputHandle = 0;	
	switch(Message)	
	{	
	case WM_NCCREATE:
		{
			Results = (InputBoxStringType*)((CREATESTRUCT*)lParam)->lpCreateParams;		
			break;	
		}
	case WM_CLOSE:


	case WM_DESTROY:	
		{	
			PostQuitMessage(0);	
			break;		
		}	
	case WM_COMMAND:	
		{		
			int NotifyCode = HIWORD(wParam);	
			int ControlId = LOWORD(wParam);	
			HWND ControlHandle = (HWND)lParam;	
			switch(ControlId)		
			{		
			case 1001:	
				{		
					InputHandle = ControlHandle;
					break;		
				}		
			case 1002:		
				{			
					if(InputHandle == 0 || !Results)	
					{			
						PostQuitMessage(0);		
						break;				
					}		
					InputBoxCharPointerType Buffer = new InputBoxCharType[256]; 	
					GetWindowText(InputHandle, Buffer, 256);
					*Results = Buffer;		
					PostQuitMessage(0);
					break;		
				}		
			case 1003:	
				{		
					if(InputHandle == 0 || !Results)	
					{				
						PostQuitMessage(0);		
						break;				
					}		
					*Results = InputBoxString("");	
					PostQuitMessage(0);	
					break;				
				}		
			}		
			break;
		}	
	}	
	return DefWindowProc(WndHandle, Message, wParam, lParam);
}

InputBoxStringType CInputDialog::ShowInputBox(HWND OwnerWindowHandle, const InputBoxStringType &InputLabel, const InputBoxStringType &InputText, const InputBoxStringType &Title)
{	
//	WNDCLASS WndClass;
	HWND DialogHandle = 0;
	HWND InputLabelHandle = 0;
	HWND InputHandle = 0;	
	HWND OkButtonHandle = 0, CancelButtonHandle = 0;	
	InputBoxStringType Result = InputBoxString("");	
//	ZeroMemory(&WndClass, sizeof(WNDCLASS));	
//	WndClass.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
//	WndClass.hIcon = LoadIcon(0, IDI_APPLICATION);	
//	WndClass.hCursor = LoadCursor(0, IDC_ARROW);	
//	WndClass.hInstance = GetModuleHandle(0);
//	WndClass.lpszClassName = InputBoxString("InputBox");
//	WndClass.lpfnWndProc = InputBoxWndProc;


	WNDCLASSEX stdWndClass;
	RtlZeroMemory(&stdWndClass, sizeof(stdWndClass));
	stdWndClass.hCursor = LoadCursor(0,IDC_ARROW);
	stdWndClass.cbSize = sizeof(stdWndClass);
	stdWndClass.style = CS_HREDRAW|CS_VREDRAW;
	stdWndClass.lpfnWndProc = InputBoxWndProc;
	stdWndClass.hbrBackground = (HBRUSH)COLOR_WINDOWFRAME;
	stdWndClass.lpszClassName = InputBoxString("InputBox");
	stdWndClass.hInstance = GetModuleHandle(0);


	RegisterClassEx(&stdWndClass);
//	RegisterClass(&WndClass);
	int X = 0, Y = 0;
	int Width = 0, Height = 0;
	RECT TempRect;
	GetWindowRect(GetDesktopWindow(), &TempRect);
	Width = (int)((float)(TempRect.right - TempRect.left) * 0.25f);	
	Height = 150;

	X = ((TempRect.right - TempRect.left) / 2) - (Width / 2);
	Y = ((TempRect.bottom - TempRect.top) / 2) - (Height / 2);
	DialogHandle = CreateWindowEx(0, InputBoxString("InputBox"), Title.c_str(), WS_OVERLAPPEDWINDOW  , X, Y, Width, Height, OwnerWindowHandle, 0, GetModuleHandle(0), (LPVOID)&Result);	int LabelX = 5, LabelY = 5;
	int LabelWidth = InputLabel.length()* 20, LabelHeight = 24;
	InputLabelHandle = CreateWindowEx(0, InputBoxString("STATIC"), InputLabel.c_str(), WS_CHILD | WS_VISIBLE, LabelX, LabelY, LabelWidth, LabelHeight, DialogHandle, 0, GetModuleHandle(0), 0);
	int TBoxX = 5, TBoxY = 29;
	int TBoxWidth = Width - 20, TBoxHeight = 24;
	InputHandle = CreateWindowEx(0, InputBoxString("EDIT"), InputText.c_str(), WS_BORDER | WS_CHILD | WS_VISIBLE, TBoxX, TBoxY, TBoxWidth, TBoxHeight, DialogHandle, (HMENU)1001, GetModuleHandle(0), 0);
	int OkBtnX = (Width / 2) - 75, OkBtnY = Height - 60;
	int OkBtnWidth = 75, OkBtnHeight = 24;
	OkButtonHandle = CreateWindowEx(0, InputBoxString("BUTTON"), InputBoxString("确定"), WS_CHILD | WS_VISIBLE, OkBtnX, OkBtnY, OkBtnWidth, OkBtnHeight, DialogHandle, (HMENU)1002, GetModuleHandle(0), 0);
	int CancelBtnX = (Width / 2) + 25, CancelBtnY = Height - 60;
	int CancelBtnWidth = 75, CancelBtnHeight = 24;
	CancelButtonHandle = CreateWindowEx(0, InputBoxString("BUTTON"), InputBoxString("取消"), WS_CHILD | WS_VISIBLE, CancelBtnX, CancelBtnY, CancelBtnWidth, CancelBtnHeight, DialogHandle, (HMENU)1003, GetModuleHandle(0), 0);
	
	if(!DialogHandle)
		return Result;

	//在桌面显示窗口
	ShowWindow(DialogHandle,SW_SHOWNORMAL);

	//刷新窗口客户区
	UpdateWindow(DialogHandle);

	
	MSG msg;
	ZeroMemory(&msg,sizeof(msg));
	while(msg.message != WM_QUIT)
	{		
		if(GetMessage(&msg, 0, 0, 0))	
		{		
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}	
	}	

	return Result;

}


 

//InputDialog.h

#pragma once



#include <windows.h>
#include <string>

#ifdef UNICODE
typedef std::wstring InputBoxStringType;
typedef LPWSTR InputBoxCharPointerType;
typedef wchar_t InputBoxCharType;

#define InputBoxString(x) L##x

#else

typedef std::string InputBoxStringType;

typedef LPSTR InputBoxCharPointerType;

typedef char InputBoxCharType;

#define InputBoxString(x) x

#endif

class CInputDialog
{
public:
	CInputDialog(void);
	~CInputDialog(void);

	InputBoxStringType CInputDialog::ShowInputBox(HWND OwnerWindowHandle, const InputBoxStringType &InputLabel, const InputBoxStringType &InputText, const InputBoxStringType &Title);
	
};


 

//test

#include "InputDialog.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
	CInputDialog dlg;
	InputBoxStringType Result = dlg.ShowInputBox(0, L"请输入密码:", L"Unknown", L"91wan程序保护");
	MessageBox(0, Result.c_str(), L"Your name is:", MB_OK);
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值