如何用c语言在控制台d出一个输入对话框

如何用c语言在控制台d出一个输入对话框,第1张

#include <tcharh>

#include <windowsh>

HINSTANCE _HInstance; // 应用程序句柄

TCHAR _Title[] = _T("简单文本框"); // 定义窗口的标题

TCHAR _WindowClass[] = _T("MySimpleTextBoxApp");// 主窗口类名

ATOM _RegisterClass(); // 注册主窗口类

HWND _CreateWindow(int nCmdShow); // 创建主窗口

LRESULT CALLBACK _WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 主窗口消息处理函数

TCHAR _TextBoxClass[] = _T("MySimpleTextBox"); // 文本框的类名

ATOM _RegisterTextBoxClass(); // 注册文本框的类

HWND _CreateTextBoxWindow(HWND hParentWnd); // 创建文本框

LRESULT CALLBACK _TextBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // 文本框窗口消息处理函数

void _DrawText(HDC hDC); // 绘制文本

void _SetCaretPos(HWND hWnd); // 设置光标位置

void _UpdateWindow(HWND hWnd); // 更新窗口

// 一些常量定义

#define MAINWINDOW_WIDTH 400 // 主窗口宽度

#define MAINWINDOW_HEIGHT 200 // 主窗口高度

#define TEXTBOX_WIDTH 300 // 文本框宽度

#define TEXTBOX_HEIGHT 20 // 文本框高度

#define TEXTBOX_MAXLENGTH 1024 // 文本框中文本的最大长度

TCHAR _String[TEXTBOX_MAXLENGTH + 1] = _T(""); // 文本

int _StringPosition = ::_tcslen(_String); // 光标插入点所在的位置

int APIENTRY _tWinMain(HINSTANCE hInstance, // 当前的应用程序句柄

HINSTANCE hPrevInstance, // 前一个应用程序实例的句柄(在Win32上,始终为NULL)

LPTSTR lpCmdLine, // 命令行参数

int nCmdShow // 窗口的显示样式

)

{

_HInstance = hInstance;

_RegisterClass(); // 注册窗口类

if(_CreateWindow(nCmdShow) == NULL) // 创建窗口

return FALSE;

MSG msg;

while (::GetMessage(&msg, NULL, 0, 0)) // 从消息队列中获取消息

{

::TranslateMessage(&msg); // 转译一些特殊的消息

::DispatchMessage(&msg); // 执行消息处理

}

return (int)msgwParam;

}

// 注册应用程序窗口类

ATOM _RegisterClass()

{

WNDCLASSEX wc;

::ZeroMemory(&wc, sizeof(wc)); // 作为一步清空,是为了让未赋值的字段的默认值为(或NULL)

wccbSize = sizeof(wc);

wcstyle = CS_HREDRAW | CS_VREDRAW; // 指定当窗口横向和纵向的尺寸发生变化时都会重绘窗口

wchInstance = _HInstance;

wchbrBackground = (HBRUSH)( COLOR_APPWORKSPACE + 1); // 指定主窗口背景为“工作区域”系统颜色

wclpszClassName = _WindowClass; // 此为要注册的类名,创建窗口时要以此类名为标识符

wclpfnWndProc = _WndProc; // 此为处理窗口消息的函数

return ::RegisterClassEx(&wc); // 调用API函数注册窗口类

}

// 创建窗口

HWND _CreateWindow(int nCmdShow)

{

HWND hWnd = ::CreateWindow(_WindowClass, _Title, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, MAINWINDOW_WIDTH, MAINWINDOW_HEIGHT, NULL, NULL, _HInstance, NULL);

if(hWnd == NULL)

return NULL;

::ShowWindow(hWnd, nCmdShow);

::UpdateWindow(hWnd);

return hWnd;

}

// 窗口处理过程

LRESULT CALLBACK _WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static HWND hTextBoxWnd;

switch (message)

{

case WM_CREATE: {

_RegisterTextBoxClass(); // 注册文本框的类

hTextBoxWnd = _CreateTextBoxWindow(hWnd); // 创建文本框

} break;

case WM_ACTIVATE: // 当窗口被激活时,将焦点设置在文本框上

::SetFocus(hTextBoxWnd);

break;

case WM_SETCURSOR: { // 设置光标形状

static HCURSOR hCursor = ::LoadCursor(NULL, IDC_ARROW);

::SetCursor(hCursor);

} break;

case WM_DESTROY: // 应用程序被关闭

::PostQuitMessage(0);

break;

default:

return ::DefWindowProc(hWnd, message, wParam, lParam);

}

return (LRESULT)0;

}

// 注册文本框的类

ATOM _RegisterTextBoxClass()

{

WNDCLASSEX wc;

::ZeroMemory(&wc, sizeof(wc));

wccbSize = sizeof(wc);

wcstyle = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS; // 指定当窗口尺寸发生变化时重绘窗口,并且响应鼠标双击事件

wchInstance = _HInstance;

wchbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 指定窗口背景颜色为系统颜色“窗口背景”

wclpszClassName = _TextBoxClass; // 指定要注册的窗口类名,创建窗口时要以此类名为标识符

wclpfnWndProc = _TextBoxWndProc; // 处理窗口消息的函数

return ::RegisterClassEx(&wc); // 调用API函数注册文本框窗口

}

// 创建文本框

HWND _CreateTextBoxWindow(HWND hParentWnd)

{

// 之下代码是为了让文本框显示在父窗口中央,而计算位置

RECT parentWndRect;

::GetClientRect(hParentWnd, &parentWndRect); // 获取父窗口客户区的位置

int left = (parentWndRectright - TEXTBOX_WIDTH) / 2, top = (parentWndRectbottom - TEXTBOX_HEIGHT) / 2;

// 创建文本框

HWND hWnd = ::CreateWindow(_TextBoxClass, NULL, WS_CHILDWINDOW | WS_VISIBLE,

left, top, TEXTBOX_WIDTH, TEXTBOX_HEIGHT,

hParentWnd, NULL, _HInstance, NULL);

return hWnd;

}

// 文本框消息的处理过程

LRESULT CALLBACK _TextBoxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_PAINT: { // 绘制这里之所以加一对大括号,是为了让之下定义的变量局部化

static PAINTSTRUCT ps;

static RECT rect;

HDC hDC = ::BeginPaint(hWnd, &ps); // 开始绘制 *** 作

::GetClientRect(hWnd, &rect); // 获取客户区的尺寸

::DrawEdge(hDC, &rect, EDGE_SUNKEN, BF_RECT); // 绘制边框,EDGE_SUNKEN表示绘制样式为内嵌样式,BF_RECT表示绘制矩形边框

_DrawText(hDC); // 绘制文本

::EndPaint(hWnd, &ps); // 结束绘制 *** 作

} break;

case WM_SETFOCUS: { // 获得焦点

::CreateCaret(hWnd, (HBITMAP)NULL, 1, TEXTBOX_HEIGHT-5); // 创建光标

_SetCaretPos(hWnd); // 设置光标位置

::ShowCaret(hWnd); // 显示光标

} break;

case WM_KILLFOCUS: // 失去焦点

::HideCaret(hWnd); // 隐藏光标

::DestroyCaret(); // 销毁光标

break;

case WM_SETCURSOR: { // 设置光标形状

static HCURSOR hCursor = ::LoadCursor(NULL, IDC_IBEAM);

::SetCursor(hCursor);

} break;

case WM_CHAR: { // 字符消息

TCHAR code = (TCHAR)wParam;

int len = ::_tcslen(_String);

if(code < (TCHAR)' ' || len >= TEXTBOX_MAXLENGTH)

return 0;

::MoveMemory(_String + _StringPosition + 1, _String + _StringPosition, (len - _StringPosition + 1) sizeof(TCHAR));

_String[_StringPosition ++] = code;

_UpdateWindow(hWnd);

_SetCaretPos(hWnd);

} break;

case WM_KEYDOWN: { // 键按下消息

TCHAR code = (TCHAR)wParam;

switch (code)

{

case VK_LEFT: // 左光标键

if(_StringPosition > 0)

_StringPosition --;

break;

case VK_RIGHT: // 右光标键

if(_StringPosition < (int)::_tcslen(_String))

_StringPosition ++;

break;

case VK_HOME: // HOME 键

_StringPosition = 0;

break;

case VK_END: // END 键

_StringPosition = ::_tcslen(_String);

break;

case VK_BACK: // 退格键

if(_StringPosition > 0)

{

::MoveMemory(_String + _StringPosition - 1, _String + _StringPosition, (::_tcslen(_String)-_StringPosition + 1) sizeof(TCHAR));

_StringPosition --;

_UpdateWindow(hWnd);

}

break;

case VK_DELETE: { // 删除键

int len = ::_tcslen(_String);

if(_StringPosition < len)

{

::MoveMemory(_String + _StringPosition, _String + _StringPosition + 1, (::_tcslen(_String) - _StringPosition + 1) sizeof(TCHAR));

_UpdateWindow(hWnd);

}

} break;

}

_SetCaretPos(hWnd);

} break;

case WM_LBUTTONDOWN: { // 鼠标单击,设置光标位置

int x = LOWORD(lParam);

HDC hDc = ::GetDC(hWnd);

int strLen = ::_tcslen(_String), strPos = 0;

SIZE size;

for (strPos=0; strPos<strLen; strPos++)

{

::GetTextExtentPoint(hDc, _String, strPos, &size);

if(sizecx + 4 >= x)

break;

}

_StringPosition = strPos;

::GetTextExtentPoint(hDc, _String, strPos, &size);

::SetCaretPos(sizecx + 4, 3);

::ReleaseDC(hWnd, hDc);

} break;

default:

return ::DefWindowProc(hWnd, message, wParam, lParam);

}

return (LRESULT)0;

}

// 更新窗口

void _UpdateWindow(HWND hWnd)

{

RECT rect;

::GetClientRect(hWnd, &rect);

::InvalidateRect(hWnd, &rect, TRUE);

::UpdateWindow(hWnd);

}

// 绘制文本

void _DrawText(HDC hDC)

{

int len = ::_tcslen(_String);

::TextOut(hDC, 4, 2, _String, len);

}

// 设置光标位置

void _SetCaretPos(HWND hWnd)

{

HDC hDC = ::GetDC(hWnd);

SIZE size;

::GetTextExtentPoint(hDC, _String, _StringPosition, &size);

::SetCaretPos(4 + sizecx, 3);

::ReleaseDC(hWnd, hDC);

}

本主题旨在生成最简单形式的 C# 程序(控制台应用程序)熟悉 Visual Studio 2008 开发环境。由于控制台应用程序是在命令行执行其所有的输入和输出,因此对于快速测试语言功能和编写命令行实用工具,它们是理想的选择。 在本节中,将学习到:如何创建新的控制台应用程序。如何在代码编辑器中使用书签。如何查看解决方案资源管理器。如何使代码保持良好的格式。如何使用 IntelliSense 更快更准确地输入代码。如何生成并运行应用程序。在该任务中创建的程序将使用 SystemIO 命名空间中的类来获取并显示 C:/ 目录中的文件、大小的列表以及子目录。您可以使用这些代码作为基础,开发用于在目录中搜索某个特定文件名的实用工具。创建C# 控制台应用程序在“文件”菜单上,单击“新建项目”。将出现“新建项目”对话框。此对话框列出了 Visual Studio 2008能够创建的不同的默认应用程序类型。选择“控制台应用程序”作为项目类型,并将应用程序的名称更改为“ListFile”。默认位置应是恰当的,但您始终可以根据需要输入新路径。单击“确定”。Visual Studio 2008 为您的项目创建以项目标题命名的新文件夹,然后打开 Visual Studio 2008 主窗口和代码窗格,您将在代码窗格中输入和修改用于创建应用程序的 C# 源代码。注意窗口顶部的工具栏。该工具栏包含各种图标,用于创建、加载和保存项目,编辑源代码,生成应用程序以及隐藏和显示构成 Visual Studio 2008环境的其他窗口。该工具栏的最右端的五个图标用来打开重要的窗口,如“解决方案资源管理器”和“工具箱”。将鼠标指针放在其中任一图标上可获得d出工具提示帮助。 确保“解决方案资源管理器”是可见的,方法是单击屏幕右侧的“解决方案资源管理器”选项卡或工具栏中的“解决方案资源管理器”图标。“解决方案资源管理器”是非常有用的窗格,因为它显示构成项目的各种文件。该项目中最重要的文件是“Programcs”文件,它包含应用程序的源代码。如果希望使 Visual Studio 2008的显示保持美观整洁,了解如何打开和隐藏“解决方案资源管理器”之类的窗口非常重要。默认情况下,“解决方案资源管理器”是可见的。如果要隐藏“解决方案资源管理器”,请单击“自动隐藏”图标(其标题栏中的图钉图标),或打开“解决方案资源管理器”标题栏上的“选项”菜单并启用“自动隐藏”。其他窗口(如“类视图”和“属性”)也有这些图标。在“代码编辑器”中键入类名“Console”。如果“解决方案资源管理器”仍挡住“代码”窗格,请在“代码”窗格中单击以隐藏它。现在单击 Main 方法内的左大括号 ({) 的右边,然后按 Enter 键开始新行。注意编辑器如何自动缩进光标。 键入C# 类名或关键字时,您可以选择:自行键入完整的单词,或者让 IntelliSense 工具(“代码”窗格的一部分)帮您完成。例如,当键入“c”时,将显示一个由单词组成的d出列表,因为 IntelliSense 会尝试预测您要键入的单词。在本例中,此时您还看不到单词“Console”显示出来。您可以向下滚动列表,或者继续键入单词“console”。当“console”在列表中突出显示时,按 Enter 或 Tab,或者双击它,Console 将添加到代码中。使用IntelliSense 的好处是可以保证大小写和拼写是正确的。是键入代码还是让 IntelliSense 帮你完成,完全由您决定。键入一个句点和方法名 WriteLine。在Console 后键入句点时,将立即显示另一个 IntelliSense 列表。该列表包含属于 Console 类的所有可能的方法和属性。您需要的是 WriteLine 方法,可以在列表的底部看到它。自行完成键入 WriteLine 或按向下键以选择它,然后按 Enter 或 Tab 或双击它。WriteLine 将添加到代码中。键入一个左括号。你将立即看到 IntelliSense 的另一项功能 — 方法签名,它显示为工具提示消息。在本例中,您可以看到 19 个不同的签名,并可以通过单击向上键和向下键浏览它们。键入字符串“该程序列出目录中的所有文件。”键入此消息时用引号将其引起来,然后添加一个右括号。你将看到显示一条红色波浪下划线,提醒您缺少某些符号。键入一个“分号” (;),下划线将消失。完成程序。键入或复制并粘贴以下代码来完成程序: static void Main(string[] args) { string path; ConsoleWrite("请输入要查看的目录:"); path = ConsoleReadLine(); ConsoleWriteLine("该程序列出目录中的所有文件:"); DirectoryInfo dir = new DirectoryInfo(@path); foreach (FileInfo file in dirGetFiles("")) { ConsoleWriteLine("{0},{1}",fileName,fileLength); } ConsoleReadLine(); ConsoleWriteLine("输出该目录下的子目录:"); foreach(DirectoryInfo di in dirGetDirectories()) { ConsoleWriteLine("{0}",diName); } ConsoleReadLine(); }程序中的最后一行是 ConsoleReadLine();,它使程序在按 Enter 键之前暂停。如果省略此行,命令行窗口将立即消失,将看不到程序的输出。如果创建的是始终将从命令行控制台中使用的命令行实用工具,可能需要省去对 ReadLine() 方法的调用。运行程序。现在第一个程序已完成,可以编译和运行了。要执行此 *** 作,请按 F5 或单击工具栏中的“开始”图标。在程序编译和运行后,将打开“控制台”窗口,并显示文件及其大小的列表和该目录下的子目录。按 Enter 键退出该程序。

*** 作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在

vc++下,连接器对控制台程序设置的入口函数是maincrtstartup,maincrtstartup

再调用你自己编写的

main

函数;对图形用户界面(gui)程序设置的入口函数是

winmaincrtstartup,winmaincrtstartup

调用你自己写的

winmain

函数。而具体设置哪个入口点是由连接器的/subsystem:选项参数确定的,它告诉 *** 作系统如何运行编译生成的exe文件。可以指定四种方

式:console|windows|native|posix如果这个选项参数的值为windows,则表示该应用程序运行时不需要控制台,有

关连接器参数选项的详细说明请参考

msdn

库。

以下四种组合,可以实现console和windows模式的混合,可以达到不d出dos窗口的效果,也可以达到在windows程序中向控制台输出printf信息了。

#pragma

comment(

linker,

"/subsystem:windows

/entry:winmaincrtstartup"

)

#pragma

comment(

linker,

"/subsystem:windows

/entry:maincrtstartup"

)

#pragma

comment(

linker,

"/subsystem:console

/entry:maincrtstartup"

)

#pragma

comment(

linker,

"/subsystem:console

/entry:winmaincrtstartup"

)

int

apientry

winmain(hinstance

hinstance,

hinstance

hprevinstance,

以上就是关于如何用c语言在控制台d出一个输入对话框全部的内容,包括:如何用c语言在控制台d出一个输入对话框、如何:创建 C# 控制台应用程序、VC++如何创建无CMD窗口控制台程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9784486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存