Win32控制台程序界面类
如何为一个win32的程序添加控制台窗口
如何为一个win32的程序添加控制台窗口?XDE(Xanavi Development Enveriment)的在PC机上运行的时候,除了模拟导航仪屏幕的对话框窗口外,还有一个用来协助调试的控制台(console)窗口。
这个console窗口可以用来输入调试命令,也可以进行打屏输出以观察程序的运行状态,非常方便。
这样做有两个好处:一、console窗口的输入输出速度比一般的windows窗口要快;二、console窗口的输入输出不会对消息流产生影响(你知道,就像dos窗口不知道消息的存在一样,console 窗口也具有这样的特性),而在一般的windows窗口上进行输入输出时,会打乱原有的消息流(因为会有一大堆的像WM_PAINT、WM_GETFOCUS这样与鼠标、焦点、键盘、刷新相关的消息产生)。
对于调试与消息相关的程序来说(比如像XDE这样拥有自己消息控制的程序),console这样的特性是非常重要的。
在windows系统下使用C/C++编程的时候,我们一般会有两种选择,一个是做成类似DOS字符界面样式的程序(这就是console程序),这种程序的入口函数是main(对于UNICODE则是wmain),另一种是做成win32窗口程序,这样的程序会产生标准的windows 窗口,它的入口函数是WinMain 。
一般来讲,一个win32的窗口程序在默认状态下是不会产生console窗口的。
但是,对于一个win32窗口程序,我们可以在运行期间给这个程序添加一个控制台窗口。
有几个win32的API是用来实现这个功能的:AllocConsole,FreeConsole以及与Console相关的Get和Set系列函数。
AllocConsole用来产生一个窗口,FreeConsole用来销毁它。
下面我们来具体地看看每一个函数的作用。
与Console窗口相关的API函数介绍:BOOL AllocConsole(void)这个函数为调用它的进程产生一个console窗口,如果成功,就返回非0值;否则,返回0。
windows下控制台程序实现窗口显示
windows下控制台程序实现窗⼝显⽰windows下实现窗⼝显⽰,如果限定是C/C++语⾔,并且是原⽣Windows⽀持,需要使⽤GDI或GDI+。
⼀般是在Visual Studio⾥新建Win32应⽤程序,⽽不是Win32 console application(控制台程序),然后使⽤GDI的⼀些API,例如CreateWindow、CreateWindowEx来实现窗⼝的创建、显⽰等。
实际上MSDN官⽅并没有说只能是Win32应⽤程序,控制台程序完全可以。
个⼈并不习惯WinMain()函数,更习惯main(int argc, char** argv)。
例如OpenCV的highgui模块,它⾥⾯的cvNamedWindow(), cvShowImage(), cvWaitKey()这⼏个函数,在windows下的实现,如果不考虑其opengl版本的话,它是基于GDI实现的;⽽作为⼀个⼴泛使⽤的图像处理库,OpenCV源码中并没有WinMain函数。
第1种实现下⾯是⽤纯C实现的“调⽤GDI的API接⼝,实现控制台类型程序中显⽰窗⼝”的样例程序,改编⾃#include <stdio.h>#include <windows.h>LRESULT __stdcall WindowProcedure(HWND window, unsigned int msg, WPARAM wp, LPARAM lp){switch(msg){case WM_DESTROY:printf("\ndestroying window\n");PostQuitMessage(0) ;return 0L ;case WM_LBUTTONDOWN:printf("\nmouse left button down at (%d, %d)\n", LOWORD(lp), HIWORD(lp));// fall thrudefault:printf(".");return DefWindowProc( window, msg, wp, lp ) ;}}typedef struct MyRect{int x, y, width, height;} MyRect;int main(){printf("hello world!\n");const char* const myclass = "myclass" ;WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX);/* Win 3.x */wc.style = CS_DBLCLKS;wc.lpfnWndProc = WindowProcedure;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = GetModuleHandle(0);wc.hIcon = LoadIcon(0, IDI_APPLICATION);wc.hCursor = LoadCursor(0, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.lpszMenuName = 0;wc.lpszClassName = myclass;/* Win 4.0 */wc.hIconSm = LoadIcon(0, IDI_APPLICATION);if(RegisterClassEx(&wc)){MyRect rect;rect.x = 300;rect.y = 300;rect.width = 640;rect.height = 480;HWND window = CreateWindowEx( 0, myclass, "title",WS_OVERLAPPEDWINDOW, rect.x, rect.y,rect.width, rect.height, 0, 0, GetModuleHandle(0), 0 ) ;if(window){ShowWindow( window, SW_SHOWDEFAULT ) ;MSG msg ;while( GetMessage( &msg, 0, 0, 0 ) ) DispatchMessage(&msg);}}}第2种实现实际上,在Visual Studio中通过“菜单栏”->"⽂件"->“新建项⽬”->"Win32项⽬"(或"Win32控制台项⽬"进⼊后再选“Windows应⽤程序”),创建的“Hello World”⼯程提供的代码也仅仅是“显⽰⼀个窗⼝”,只不过⼊⼝函数是WinMain,其内容如下:// gdi_show_png.cpp : 定义应⽤程序的⼊⼝点。
创建第一个C++Win32控制台应用程序
创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。
2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。
在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。
选择完毕后,单击确定按钮。
3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。
找到相应的main函数。
6.在main函数中输入相应的代码。
7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。
所以,在stdafx.h中填写头部文件。
在有main函数的文件中在添加代码:#include “stdafx.h”
即可。
8.按“Ctrl+F5”可以查看运行结果。
如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。
win32 winmain 例子
win32 winmain 例子Win32 WinMain 例子什么是 Win32 WinMain?WinMain是一个用于创建 Windows 桌面应用程序的主函数。
它是一个程序的入口点,并负责初始化应用程序的状态,创建和显示主窗口,以及响应系统的消息。
示例 1:创建一个空白的窗口下面是一个简单的示例,演示了如何使用 Win32 API 创建一个空白的窗口:#include <>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){switch (msg){case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}示例 2:处理窗口消息以下是一个稍微复杂一些的示例,演示了如何处理窗口消息:#include <>// 窗口过程函数LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevI nstance, LPSTR lpCmdLine, int nCmdShow){const char CLASS_NAME[] = "Sample Window Class";const char WINDOW_TITLE[] = "Win32 Sample";// 注册窗口类WNDCLASS wc = { };= WndProc;= hInstance;= CLASS_NAME;RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindowEx(0, // 扩展窗口样式CLASS_NAME, // 窗口类名WINDOW_TITLE, // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_ USEDEFAULT, // 窗口位置和尺寸NULL, // 父窗口句柄NULL, // 菜单句柄hInstance, // 应用程序实例句柄NULL // 创建窗口时的额外数据);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return ;}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wPa ram, LPARAM lParam){// 自定义窗口消息处理switch (msg){case WM_CREATE:MessageBox(hwnd, "窗口创建", "消息", MB_OK); return 0;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);// 绘制文本RECT rect;GetClientRect(hwnd, &rect);DrawText(hdc, "Hello, Win32!", -1, &rect, DT _CENTER | DT_VCENTER | DT_SINGLELINE);EndPaint(hwnd, &ps);return 0;}case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, msg, wParam, lParam);}这个示例演示了如何在窗口创建时显示一个消息框,并在窗口绘制时绘制一段文本。
winmain中的lpcmdline参数-木水的日志-网易博客
WinMain中的lpCmdLine参数- 木水的日志- 网易博客win32可执行程序分为两种类型,基于控制台(Consol-based)的和基于窗口(Windows-based)的。
基于控制台程序它的入口函数是传统的main,基于窗口的则是WinMain。
这两个入口函数一大区别是对于命令行参数的处理。
WinMain函数原型:int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow),LPSTR lpCmdLine存储了命令行参数信息,MSDN对这参数解释:lpCmdLine[in] Pointer to a null-terminated string specifying the command line for the application, excluding the program name. To retrieve the entire command line, use the GetCommandLine function.(指向一个应用程序命令中,除了程序名的null字符结束的字符串。
GetCommandLine函数可以返回整个命令行)为了更清晰lpCmdLine是什么内容,以下做一些测试。
假设可执行程序名:test.exe。
1、命令:test.exe (回车)lpCmdLine:0x00141f03 "" char *注:0x00141f03:lpCmdLine运行时内存地址"":lpCmdLine内容,这里值是空串char *:lpCmdLine类型,它指出lpCmdLine是字符串。
命令行中没任何参数。
lpCmdLine是有效地址,但它是空字符串,即lpCmdLine[0]='\0'。
因而程序要判断命令行是不是带参数不能用if (lpCmdLine)而应该用if (lpCmdLine[0])。
win32 application和win32 console application
Windows操作系统经历了无数次变革。
在这些变革的过程中,已经创建了很多类型的应用程序(包括16位和32位),这些应用程序都在该系统下运行,16位的应用程序将被淘汰,我们现在经常提到的是Window9x或WindowsNT应用程序,即我们常说的Win32,那么什么是Win32应用程序呢?其实有很多类型的Win32应用程序,从传统程序到控制台应用程序以及动态链接库(DLL),甚至包含ActiveX控件,它们是用户可以给应用程序 Web页及ActiveX Desktop添加的编程组件。
1.传统的Win32应用程序这样的应用程序拥有人们期望在一个功能完备的应用程序中所得到的所有特征,包括框架、菜单栏、工具栏和状态栏。
我们每天经常用到的应用程序和我们用开发系统开发出来的大多数应用程序都属于这类型。
要编写Win32应用程序,必须和Windows操作系统打交道,这就意味着一定要创建响应Windows消息的应用程序和必须遵循创建图形用户界面的规则。
2. Win32控制台应用程序控制台应用程序(console applications)。
控制台应用程序像老式的DOS 程序,除了其框架窗口外,它只显示文本信息。
控制台应用程序往往被用作简短的实用程序。
在有些编程环境还使用控制台窗口显示错误消息和其他信息,它的好处是在执行的任务中,用户不必创建窗口类、管理消息映射以及绘制到设备描述表等。
3.动态链接库动态链接库(Dynamic Link Library)不是完整的程序或可执行文件。
相反,它是一个函数库,可以在系统的其他模块中对这些函数进行调用。
由于动态链接库不是应用程序,所以从本质上讲它很少有可见的部分,且不接受任何Windows 消息。
在某些其它模块(如应用程序)明确地加载DLL或调用DLL中的一个函数之前,DLL甚至不被加载到内存。
“动态”意味着函数库在编译时不链接到其他模块中,而在运行时被链接。
使用动态链库的最大好处是:很多模可以共享同一个库,而不必在编译时将模块库链接起来,这样做即节省空间,又节省内存。
win32gui用法
win32gui用法Win32 GUI编程是Windows平台下一种重要的开发方式,通过使用Win32 GUI库,我们可以创建具有图形用户界面(GUI)的应用程序。
其中,win32gui是Python中一个常用的GUI库,它提供了丰富的API,方便我们进行GUI开发。
一、win32gui库介绍win32gui库是Python中用于Windows平台下进行GUI开发的库,它提供了丰富的API,包括窗口、控件、消息、图标、位图等操作接口。
通过使用win32gui库,我们可以方便地进行窗口创建、消息处理、控件操作等GUI开发工作。
二、win32gui基本用法1. 导入win32gui库在使用win32gui库之前,需要先导入它。
在Python中,可以使用`import win32gui`语句来导入该库。
2. 创建窗口使用win32gui库创建窗口需要使用`win32gui.CreateWindow()`函数。
该函数需要传入窗口的类名、窗口的样式、窗口的父窗口等参数。
创建窗口后,可以通过调用其他函数来设置窗口的位置、大小、标题等信息。
示例代码:```pythonimport win32guiwindow_class = "MyWindowClass"window_style = win32con.WS_OVERLAPPEDWINDOW |win32con.WS_VISIBLEwindow_rect = (0, 0, 640, 480)window_proc = win32gui.WNDPROC()win32gui.RegisterClass(window_class)window = win32gui.CreateWindow(window_class, "My Window Title", window_style, window_rect, None, None, None, None, None)```3. 发送消息使用win32gui库可以发送各种消息到窗口中,例如WM_PAINT消息用于绘制窗口内容,WM_CLOSE消息用于关闭窗口等。
win32console用法
win32console用法Win32 控制台简介Win32 控制台是一个在 Windows 操作系统中低级 API,用于与控制台进行交互。
它提供了一系列函数,使开发者能够创建、管理和操作文本控制台窗口。
创建和配置控制台窗口```c++HWND hWnd = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, // 访问权限FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式NULL, // 安全描述符CONSOLE_TEXTMODE_BUFFER, // 缓冲区类型NULL // 填充保留);SetConsoleWindowInfo(hWnd, TRUE, &windowRect); // 设置控制台窗口信息```输入和输出操作```c++DWORD numWritten;WriteConsole(hStdout, // 输出句柄"Hello, world!\n", // 要写入的数据13, // 数据长度&numWritten, // 写入的字节数 NULL // 填充保留);DWORD numRead;ReadConsole(hStdin, // 输入句柄buffer, // 读取数据的缓冲区 1024, // 缓冲区大小&numRead, // 读取的字节数NULL // 填充保留);```设置文本属性```c++COORD coord = { 0, 0 };SetConsoleCursorPosition(hStdout, coord); // 设置光标位置SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY); // 设置文本颜色和强度```控制台缓冲区操作```c++COORD bufferSize = { 80, 25 };SetConsoleScreenBufferSize(hStdout, bufferSize); // 设置缓冲区大小SMALL_RECT writeRegion = { 0, 0, 79, 24 };WriteConsoleOutputCharacter(hStdout, ' ', 6400, coord, &numWritten); // 在指定区域填充字符```高级控制台功能Win32 控制台还提供了更高级的功能,例如:事件处理:可以使用 ReadConsoleInput 函数监视控制台输入事件。
python win32gui的用法
python win32gui的用法win32gui是Python中用于Windows GUI操作的一个模块,它是pywin32包的一部分。
使用win32gui,你可以与Windows操作系统的图形用户界面进行交互,例如查找窗口、发送消息、获取窗口内容等。
以下是win32gui的一些基本用法:1. 导入模块首先,你需要安装pywin32包,然后导入win32gui模块:bashpip install pywin32pythonimport win32gui2. 查找窗口你可以使用win32gui来查找窗口。
例如,查找窗口的句柄(handle):pythondef window_enum_callback(hwnd, extra):wintext = win32gui.GetWindowText(hwnd)print(f'窗口句柄: {hwnd}, 窗口标题: {wintext}')win32gui.EnumWindows(window_enum_callback, None)上面的代码会枚举所有顶级窗口,并打印它们的句柄和标题。
3. 发送消息你也可以使用win32gui向窗口发送消息。
例如,关闭一个窗口:pythonhwnd = win32gui.FindWindow(None, '窗口的标题') # 查找窗口句柄if hwnd:win32gui.SendMessage(hwnd, win32con.WM_CLOSE, 0, 0) # 发送关闭消息注意,这里还需要导入win32con模块来获取Windows消息常量。
4. 获取窗口内容获取窗口中的文本内容通常比较复杂,因为win32gui模块本身不提供直接获取窗口内容的功能。
你可能需要使用其他技术,如UI自动化(UI Automation)或发送消息(SendMessage)来获取特定类型的控件中的文本。
但是,对于标准的文本框控件,你可以尝试使用win32gui.SendMessage函数与win32con.WM_GETTEXT消息来获取文本。
WTL简介
1.WTL简介WTL 是Windows Template Library的缩写。
最初,WTL是由微软的ATL(Active Template Library)小组成员开发的一个SDK例子。
主要是基于ATL的对Win32 API的封装。
从 2.0后,功能逐步完善,成为了一个完整的支持窗口的框架(windows framework)。
与MFC相比较,功能并没有MFC完善。
比如MFC支持doc/view架构,而WTL 并不支持。
同时,WTL也没有Microsoft的官方支持。
但是,WTL是基于模版(template)的,其应用程序最小只有24KB,同时不象MFC,依赖DLL(MFC需要MFC42.DLL)。
1.1WTL与Win32界面应用程序的对比Win32应用程序可以分成两大类:控制台程序(console application)和窗口界面程序(windows GUI application)。
控制台程序的入口函数是main(),窗口界面程序的入口函数是WinMain()。
入口函数就是程序的主线程的运行起点。
这里讨论的开发框架(Framework)是针对窗口界面程序的。
窗口界面程序通常分成以下几类:SDI, MDI, multi-SDI, 和Dialog应用程序。
●SDI(Single Document Interface)应用程序通常只有一个主窗口(通常是一个框架窗口,Frame Window)。
框架窗口包含菜单、工具栏、状态栏和称为视(View)的客户工作区。
●multi-SDI(Multiple Threads SDI)应用程序有框架个主窗口。
比如IE浏览器,使用"文件/新建/窗口"命令后,会出现另一个IE窗口。
●MDI(Multiple Document Interface)应用程序有一个主框架窗口,但有多个子框架窗口。
每个子窗口都有自己的视(View)。
●Dialog应用程序是基于对话框的。
易语言编程系统全书(第一章)
第一章易语言概述1.1 易语言概要介绍1.1.1 易语言介绍易语言是一种汉语编程语言,有大连大有吴涛易语言软件开发有限公司出品,易语言采用全中文汉语编程,该开发环境是建立在Window平台,支持全中文、可视化编程操作,功能丰富且易学易用,可以满足国内各类计算机用户的需求。
并可直接在Window环境下开发Linux程序。
作为一款全中的编程语言,易语言融入了中华文化和民族习惯,用户不需要按照国外的语言习惯、表达方式、甚至是思维方式而是直接用中文,按照我们自己的习惯去编写程序。
易语言编程环境方便直观、快捷实用,不但支持程序代码可以用中文来编写,并且操作界面亦为全中文。
及时一个根本不懂英文或者对英文了解很少的初级用户也能够快速地进入计算机程序编写的大门。
甚至初中或小学文化的人也可以较快地学会编制一些简单程序。
易语言并不似把现有的编程工具简单地进行表面汉化或封装而成的,它拥有自己独立的高质量编译器,中文源代码被直接便以为目的机的CPU指令。
值得称道的是,其编译器所编译出来的可执行代码与操作系统平台无关,因此能够很方面地实现跨平台编程。
目前,易语言可同时支持Window 和Linux程序的开发,今后移植到其他操作系统平台也非常方便,使之不再依赖特定的操作系统环境,这也符合国家发展开发自主知识产权基础系统软件的战略部署,易语言编程环境本身就是一个重要的基础系统软件,而且还为其他自主知识产权操作系统提供了配套、合适的应用软件开发工具。
易语言的可视化设计操作相对其他编程语言来说又是十分明显,它不仅仅支持程序窗体界面设计的可视化操作,连代码流程图都完整的嵌入到程序代码设计操作之中,这事一般任何编程软件所不具备的功能。
同时,它内臵了一种专用、记忆式中文输入法,支持中文语句快速录入,即时令函数提示功能,彻底突破了中文语句输入速度的瓶颈。
易语言支持模块化开发,可男足大型应用软件系统协同开发的要求。
它也可以编译出符合便准Win32DLL的程序模块,供其他的易程序,甚至是VC、Delphi、VB程序在自身代码中直接调用。
《程序设计基础(C++)》实验教程及完整答案
《程序设计基础》实验教程对于从事计算机行业的人员来说,设计能力是最主要的基本功之一。
入门课程《程序设计基础》的学习效果将直接关系到编程能力的掌握和提高以及后续课程的学习。
然而,实践证明,许多初学者在学习这门课程时的效果并不理想。
对初学者来说,如何学好本课程?首先,要理解教材中所给出的语法描述,并学会按语法规定去编写指定问题的求解程序。
经过这样的多次反复,初学者就可以找到编程的感觉。
除了要学好理论知识外,更重要的一点是要到计算机上去验证,因为只有实践才是检验真理的标准。
只有通过到计算机上去实践,才能发现学习中存在的问题,巩固所学知识,加强解决实际问题的能力,增强信心。
因此,《程序设计基础》课程的上机实验是本课程必不可少的实践环节,必须加以重视。
本课程上机实验的目的是使学生熟悉用高级语言解决实际问题的全过程,加深对语言的理解,得到程序设计基本方法和能力的训练。
在独立编写程序、独立上机调试程序的同时,真正能用高级语言这个工具去解决实际问题,对计算机学科的相关知识有所了解,从而为后续课程的学习奠定良好的基础。
本实验指导所用环境是Visual C++ 6.0及以上版本。
考虑到本课程的内容和特点,设置了十四个实验,每次实验需要两至三小时,分别侧重于教材中的一个方面,其中标有“*”号的习题的综合性较强,可供学有余力的学生选择。
实验时也可根据具体情况做适当调整。
虽然可能由于课时和机时限制等原因而不能在实验课时内全部得到安排,但还是建议学生能将其中的每个实验都能认真做一遍,因为这些实验都是学习本课程所必需的。
学生在做实验之前应仔细阅读本实验指导书,初步掌握实验的基本要求和实验方法。
在实验过程中,学生应该有意识的培养自己调试程序的能力,积累发现问题、解决问题的经验,灵活主动的学习。
对于分析运行结果的实验习题,上机前先进行用人工分析,写出运行结果,与上机调试得到的结果进行对照,如有差异,分析其原因。
对于程序编制的实验习题,上机前应考虑出较成熟的编程思路,有意识提供出多种方案,以灵活运用所学知识和技巧。
学会Windows控制台常用命令,玩转Windows控制台命令窗口
学会Windows控制台常用命令,玩转Windows控制台命令窗口Win键+R键,打开命令运行框,输入‘cmd’按回车键进入Windows控制台命令窗口是时候开始行动了!(内容很多,就挑自己喜欢的吧。
)ver # 显示当前windows系统的版本号winver # 弹框显示当前windows系统信息whoami # 显示当前用户的名称hostname # 显示当前机器名vol # 显示当前分区的卷标label # 显示当前分区的卷标,同时提示输入新卷标label c:system # 设置c盘的卷标为systemprompt orz: # 将命令提示符修改为orz:print 1.txt # 使用设置好的打印机来打印1.txt文本文件timeout 5 # 延迟5sexit # 退出当前cmd窗口实例pause # 暂停批处理程序,并显示出:请按任意键继续.... systeminfo # 查看当前计算机的综合信息cls # 清除屏幕logoff # 注销当前用户关于文件/目录的操作:cd 切换目录例:cd # 显示当前目录cd .. # 进入父目录(即:返回上一级目录)cd /D D: # 进入上次d盘所在的目录(或在直接输入:d:)cd /D D:\ # 进入d盘根目录cd D: # 显示上次d盘所在的目录cd /D D:\test # 进入D:\test目录cd Test\App01\Png # 进入当前目录下的Test\App01\Png文件夹dir 显示目录中的内容例:dir # 显示当前目录中的子文件夹与文件dir /b # 只显示当前目录中的子文件夹与文件的文件名dir /p # 分页显示当前目录中的子文件夹与文件dir /ad # 显示当前目录中的子文件夹dir /a-d # 显示当前目录中的文件dir c:\Test # 显示c:\Test目录中的内容dir word.txt # 显示当前目录中word.txt的信息dir /S # 递归显示当前目录中的内容dir app* # 显示当前目录下以app开头的文件和文件夹的信息dir /AH /OS # 只显示当前目录中隐藏的文件和目录,并按照文件大小从小到大排序md 创建文件/目录例:md 01 02 03 # 在当前目录中创建名为01、02、03的文件夹(写几个创建几个)md D:\Test\01 # 创建 D:\Test\01目录rd 删除文件/目录例:rd 01 02 03 # 删除当前目录下的01、02、03空文件夹(写几个删除几个,并且删除的文件不经过回收站)rd /s /q d:\test # 删除D:\Test(除目录本身外,还将删除指定目录下的所有子目录和文件)ren 重命名文件/目录例:ren App_01.txt App_02.txt # 将当前目录下的App_01.txt 文件重命名为App_02.txtren D:\Test Test_01 # 将c盘下的Test文件夹重命名为Test_01move 移动文件例:move *.png Test# 将当前目录下的png图片移动到当前目录下Test文件夹中(若出现同名的png图片,会询问是否覆盖)move /Y *.png Test# 将当前目录下的png图片移动到当前目录下Test文件夹中(不询问,直接覆盖写)move 1.png D:\Test\2.png# 将当前目录下的1.png移动到D盘Test文件夹中,并重命名为2.png (出现同名,会询问是否覆盖)move Test D:\Test_01# 若D盘中存在Test_01文件夹,将当前目录下的Test文件夹移动到D盘Test_01文件夹中;若不存在,将当前目录下的Test文件夹移动到D盘,并重命名为Test_01del 删除文件 (目录及子目录都不会删除)例:del Test (与 del Test\* 等价)# 删除当前目录下的Test文件夹中的所有非只读文件(子目录下的文件不删除;删除前会进行确认)del /f Test (与 del /f test\* 等价)# 删除当前目录下的Test文件夹中的所有文件(含只读文件;子目录下的文件不删除;删除前会进行确认)del /f /s /q Test D:\Test2\*.doc# 删除当前目录下的Test文件夹中所有文件及D:\Test2中所有doc文件(含只读文件;递归子目录下的文件;删除前不确认)del /ar *.*# 删除当前目录下所有只读文件del /a-s *.*# 删除当前目录下除系统文件以外的所有文件##########################################/ar、/ah、/as、/aa 分别表示删除只读、隐藏、系统、存档文件/a-r、/a-h、/a-s、/a-a 分别表示删除除只读、隐藏、系统、存档以外的文件##########################################copy 拷贝文件例:copy App_01.txt D:\Test# 将当前目录下的App_01.txt拷贝到D:\Test下(若Test中也存在一个 App_01.txt文件,会询问是否覆盖)copy D:\Test# 将当前目录下文件夹中文件(不递归子目录)拷贝到D:\Test 下(同上,会询问是否覆盖)copy App_01.txt D:\Test\App_02.txt# 将当前目录下的App_01.txt拷贝到D:\Test下,并重命名为App_02.txt (若出现同名文件,会询问是否覆盖)copy /Y App_01.txt D:\Test# 将当前目录下的App_01.txt拷贝到D:\Test 下(不询问,直接覆盖写)copy App_01.txt +# 复制文件到自己,实际上是修改了文件日期copy /Y App_01.txt + App_02.txt App.txt# 将当前目录下的App_01.txt 与 App_02.txt的内容合并写入App.txt中(不询问,直接覆盖写)copy /B Test_01+Test_02 Test# 将当前目录下的Test_01、Test_02文件合并生成Testcopy /B api* api_01# 将当前目录下的api开头的所有文件(按照名称升序排序)依次合并生成api_01tree 显示目录结构tree D:\MyFiles // 显示D:\MyFiles目录结构replace 替换文件 (即使这个文件在使用,仍然可以替换成功)replace D:\1.txt D:\Temp // 使用D盘下的1.txt强制替换D盘Temp目录中的1.txt 文件type 显示文本文件内容例:type D:\1.txt // 显示D盘中1.txt的文本内容type 1.txt // 显示当前目录下1.txt 的文本内容type D:\1.txt | more // 分页显示D盘中1.txt的文本内容more 逐屏的显示文本文件内容more 1.txt // 逐屏的显示当前目录下1.txt 的文本内容【空格:下一屏 q:退出】time # 显示或设置当前时间例:time /t # 显示当前时间time # 设置新的当前时间(格式:hh:mm:ss),直接回车则表示放弃设置date # 显示或设置当前日期例:date /t # 显示当前日期date # 设置新的当前日期(格式:YYYY/MM/DD),直接回车则表示放弃设置start 运行某程序或命令例:start /max notepad.exe # 最大化的方式启动记事本start /min calc.exe # 最小化的方式启动计算器start /min "" d:\Proxifier.exe # 最小化的方式启动Proxifier代理工具start explorer f:\ # 调用资源管理器打开f盘strat iexplore "" # 启动ie并打开网址color 设置当前cmd窗口背景色和前景色(前景色即为字体的颜色)例:color 2 # 将字体设为绿色color 02 # 将背景色设为黑色,将字体设为绿色color # 恢复到缺省设置(恢复到默认)注:color 后面只接一个参数的时候,只改变字体颜色,接两个参数的时候,先改背景颜色再改字体颜色--------------------------------------0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色2 = 绿色 A = 淡绿色3 = 浅绿色 B = 淡浅绿色4 = 红色 C = 淡红色5 = 紫色 D = 淡紫色6 = 黄色 E = 淡黄色7 = 白色 F = 亮白色--------------------------------------mode con 设备状态例:mode con #显示设备状态 CONmode con cols = 100 #设置窗口行数为 100 行mode con lines = 60 #设置窗口列数为 60 列mode con cols =100 lines =60 #设置窗口大小:100行,60列wmic 查看硬件的信息(C:\Windows\System32\wbem\WMIC.exe)例:wmic logicaldisk# 查看计算机上各个盘的相关信息wmic LogicalDisk where "Caption='C:'" get FreeSpace,Size /value# 获取C盘的剩余空间大小与总大小(单位:Byte)wmic os get Caption,InstallDate,OSArchitecture /value# 获取当前os的Caption、安装日期以及系统架构信息shutdown 关闭、重启、注销、休眠计算机例:shutdown /s # 关闭计算机(不要去尝试,真会关机)shutdown /s /t 3600 # 一小时后,关闭本地计算机(时间可以任意改 1小时=3600秒,自个儿去换算)shutdown /a # 终止系统关闭shutdown /r # 关闭并重启本地计算机shutdown /g # 关闭并重启计算机,重启后重新启动所有注册的应用程序shutdown /l # 注销本地计算机shutdown /h /f # 休眠本地计算机(强制正在运行的应用程序关闭,不前台警告用户)powercfg 设置电源方案例:powercfg -list# 列出当前用户环境中的所有电源方案的GUID以及当前使用的是哪一个电源方案powercfg -query 381b4222-f694-41f0-9685-ff5bb260df2e# 查询GUID为381b4222-f694-41f0-9685-ff5bb260df2e的电源方案的详细内容powercfg -h off # 设置禁止休眠# 设置硬盘从不关闭powercfg -change -disk-timeout-dc 0powercfg -change -disk-timeout-ac 0# 设置显示器从不关闭powercfg -change -monitor-timeout-dc 0powercfg -change -monitor-timeout-ac 0# 设置从不进入待机powercfg -change -standby-timeout-dc 0powercfg -change -standby-timeout-ac 0# 设置从不进入休眠powercfg -change -hibernate-timeout-dc 0powercfg -change -hibernate-timeout-ac 0注:dc代表直流电源即使用电池供电;ac代表交流电源即直接连接电源;后面数字为时间,单位为分钟(设置为0表示从不);好啦,文章到这里就结束啦,喜欢就点赞关注加收藏吧,更多内容正在持续更新中……有问题就会有答案希望本期内容分享能够给你带来帮助。
如何在Windows下运行C语言程序
int main(){
int a, b; //声明两个整型变量
printf("Input two integers: "); //以空格为分隔
scanf("%d %d", &a, &b); //将输入的两个整数分别赋值给a, b
或Ctrl+F5,如果程序正确,可以看到运行结果,如下图所示:
恭喜你,你已经完成了第一个C语言程序,越过了第一道障碍。
注意:编译生成的.exe文件在工程目录下的Debug文件夹内。以上面的工程为例,路径为 E:\cDemo,打开看到有一个Debug文件夹,进入可以看到cDemo.exe。
//以整数形式输出最大值,a, b为实际参数(实参)
printf("The max integer is %d.\n", max(a, b));
return 0;
}
//函数定义
int max(int num1, int num2){ // num1, num2为形式参数(形参)
编译、组建、运行的功能可以在“组建”中找到,如下图所示:
更加简单的方法是使用快捷方式,如下图所示:
对于初学者,最常用的是运行按钮
,编写完代码,一次点击就可以看到输出结果。当然,你也可以使用快捷键:Ctrl+F7(编译)、F7(组建)、Ctrl+F5(运行)。
Win32程序基本结构
Win32程序基本结构Windows SDK笔记(一):Windows程序基本结构一、概述Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成。
程序中只要按一定的格式填写系统留给客户的那一小部分。
所需要完成的有:窗口类的定义、窗口的建立、消息函数的书写、消息循环。
二、消息处理函数Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。
没个窗口都有一个消息处理函数。
在消息处理函数中,对传入的消息进行处理。
系统内还有它自己的缺省消息处理函数。
客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。
这样,每当有消息产生时,就会去调用这个消息处理函数。
通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case ......case ......}return DefWindowProc (hwnd, message, wParam, lParam) ;}三、窗口的建立客户需要自己建立窗口,建立后会得到系统返回的窗口句柄(HWND),后继的针对窗口的操作都针对句柄进行。
1.注册窗口类建立窗口前,需要制定好这个窗口的相关属性,最主要的就是将自己定义的消息处理函数与窗口关联,其他的属性还包括:菜单、图标等等。
这个属性指定步骤是通过指定"窗口类"来完成的。
对于自己建立的窗口,这个"窗口类"需要自己制定,也即自己填充一个WNDCLASS结构,然后向系统注册。
对于一些特殊窗口,如按钮等控件,他们的行为是系统制定好了的,所以不需要自己注册,直接使用对应的“窗口类”名称就行了。
win32ui中的createfontdialog 参数
win32ui中的createfontdialog 参数`win32ui` 模块中的`CreateFontDialog` 函数用于创建一个字体选择对话框,让用户可以选择字体。
以下是`CreateFontDialog` 函数的参数:1. `hWnd`:父窗口句柄,通常是拥有字体选择对话框的窗口。
2. `lpFontData`:字体数据结构指针,包含对话框所需的所有字体信息。
可以使用`win32ui.FF_DONTCARE` 作为标志,表示不关心字体细节。
3. `nFontType`:字体类型,取值如下:- FC_DEFAULT:默认字体类型,表示使用系统默认字体。
- FC_SCREEN:屏幕字体类型,表示使用屏幕字体。
- FC_PRINTER:打印机字体类型,表示使用打印机字体。
4. `dwFlags`:附加标志,用于控制对话框的行为。
例如,可以使用`CDLG_FILESEL` 标志表示允许用户选择多个字体。
5. `lpTemplate`:可选参数,指向一个包含对话框模板的资源字符串。
如果未指定此参数,将使用默认的对话框模板。
6. `hInstance`:应用程序实例句柄,用于标识应用程序。
7. `lpszTitle`:可选参数,表示对话框的标题。
如果未指定此参数,将使用默认标题。
8. `lpszOkButtonText`:可选参数,表示“确定”按钮的文本。
如果未指定此参数,将使用默认文本。
9. `lpszCancelButtonText`:可选参数,表示“取消”按钮的文本。
如果未指定此参数,将使用默认文本。
以下是一个示例代码,展示了如何使用`win32ui` 模块创建一个字体选择对话框:```pythonimport win32ui# 创建字体选择对话框dlg = win32ui.CreateFontDialog(None, win32ui.FF_DONTCARE)# 显示对话框if dlg.DoModal() == win32ui.IDOK:# 获取选择的字体font_data = dlg.GetFontData()font_name = font_data['FaceName']font_size = font_data['Size']print("选择的字体:", font_name)print("字体大小:", font_size)else:print("用户取消了选择")```请注意,此示例代码仅展示了如何创建字体选择对话框,并获取用户选择的字体信息。
Win32 Tab Control的创建与使用
Tab Control控件的使用[基于Windows API]最后效果图如下:这个只是一个简单的创建Tab控件,后面会讲解怎么创建一个空间放置在这个Tab页面上. 操作步骤如下:1.导入头文件:#include <CommCtrl.h>,2.在消息处理函数中的WM_CREATE消息中将Tab控件创建处理:在WM_CREATE消息中:使用WC_TABCONTROL 参数传入CreateWindow函数中,创建Tab控件.如下:上图中的hwndTab 是一个局部的静态变量,你也可以声明为全局变量.这里的原因这里就不详细讲解了,后续有空的时候就讲解一下.hwndTab声明如下:3.当使用CreateWindow创建后必须验证,确保创建成功.4.给Tab控件传入Tab控件页的值,这里使用的是星期1~星期7作为Tab控件的标签名:4.1.传入TabCtrl_InsertItem一个TCITEM变量来创建.4.2.给TCITEM变量赋值注意,g_achTemp 是一个TCHAR类型的数组,用来存储标签名的变量,因为标签名使用for循环写入的.全局变量g_achTemp定义如下:4.3.使用for循环写入标签名:5.使用ShowWindow函数显示Tab控件此时我们可以编译运行.结果如上图所示.由于我们没有加入消息处理,若以此时的Tab控件没有任何内容,我们会在接下来的讲解部分讲解怎么处理消息.Tab控件的WM_NOTIFY消息传递与处理Tab控件发生标签页被切换的时候发生一个WM_NOTIFY,因此我们只要处理了WM_NOTIFY 消息就可以帮我们进行Tab控件的消息处理.结果图如下:步骤如下:1.给主程序添加一个WM_NOTIFY消息处理:2.添加一个静态局部变量hwndTab, hwndTab1, hwndTab2.分别表示Tab控件与Tab控件标签页面1,2中的按钮Tab1与Tab2按钮3.使用CreateWindow函数传入一个BUTTON类名来创建两个按钮Tab1,Tab2.注意此时我们应该使用ShowWindow函数将标签1页面中的控件显示而将标签2页面中的控件隐藏.4.讲解一下WM_NOTIFY消息中的wParam与lParam参数的含义,wParam:是一个标识发送WM_NOTIFY消息的控件IDlParam: 是一个指向NMHDR结构体的指针,其中NMHDR的定义如下:因此我们可以在WM_NOTIFY消息的处理程序中通过判断NMHDR结构体中的code 的值来确定Tab控件发送的消息的通知码来判断Tab控件的确切消息,TCN_SELCHANGE是当Tab控件的标签页发生改变的时候发送的消息.。
VS中空项目、win32项目、控制台程序的区别(转)
VS中空项⽬、win32项⽬、控制台程序的区别(转)空项⽬,⼤多数想单纯创建c++⼯程的新同学,打开vs后很可能不知道选择创建什么⼯程,这时候请相信我,空项⽬是你最好的选择。
因为空⼯程不包含任何的源代码⽂件,接下来你只需要在相应的源代码⽂件夹和头⽂件⽂件夹加⼊相应的.cpp和.h⽂件即可。
(注:对于⾸次使⽤vs的新同学来说,运⾏程序的时候很可能,闪⼀下就不见了,请不要着急,这是因为vs软件本书没有加上停⽌的代码,我们⾃⼰动⼿加上就好了。
每次写程序的时候,我们需要include头⽂件stdlib.h,然后在程序末尾加上system(“pause”),你会发现程序停下来了,是不是很开⼼。
)接下来说⼀下win32控制台应⽤程序、win32项⽬、mfc项⽬这⼏个货的区别:我的理解,我⾸先把这⼏个货分为两⼤类;第⼀类包括win32控制台应⽤程序,第⼆类就是剩下那俩货。
⽽剩下那俩货⼜有⼀个包含关系,即win32项⽬包含mfc。
(我个⼈是这个区分的。
)⼀、区别:(1)Win32控制台程序,没有界⾯,只有命令符。
⽣成的“.exe”⽂件直接运⾏操作即可。
(2)Win32项⽬,有界⾯。
但是界⾯⾥⾯的控件,基本上要⾃⼰去实现。
(3)MFC应⽤程序,也有界⾯,但界⾯⾥的控件不需要⾃⼰去实现了,常⽤的控件都已经在MFC库内写好,直接拖动即可。
(4)控制台与Win32、MFC的交互⽅式不同,前者采⽤的是CML(命令模式,也有⼈说是CUI(Console user Input)),后者是GUI(⽤户界⾯)(5)Win32项⽬的界⾯⽐较符合UI界⾯设计;⽽MFC应⽤程序的界⾯基本都是⼀样的,因为它们都是⽤同⼀套控件模板。
(6)Win32控制台程序:初始代码模版以main为程序⼊⼝,默认情况下,只链接C++运⾏时库和⼀些核⼼的win32库,链接器subsystem参数为console类型,所以编译出来的程序会有⿊⾊的控制台窗⼝作为呈现标准输⼊(stdin)和标准输出(stdout)。
Dev-CppMingw32 环境介绍
Dev-Cpp/Mingw32环境介绍北斗星君前言对于现在越来越多得关于编程方面得问题和商业公司对版权问题的担心。
所以向各位推荐一款类似于VC的IDE。
这款IDE所使用的编译程序是GCC的Win32版本Mingw32。
而IDE本身也是GPL协议的产物。
所以,不论是商业用户,还是个人用户都能够自由的使用她,而不必为使用盗版软件而提心吊胆的。
另外,由于Mingw32是GCC的Win32版本。
所以,也为Win32的程序员可以了解一下Unix和类Unix下的编程感觉。
而且,Mingw32对Win32函数的支持也是很不错的。
希望,我们的Mingw32之旅可以带给你快乐。
介绍有关Dev-Cpp的介绍,我在这里不想多做解释。
因为下面会具体的介绍和讲解的。
我在这里只是想要介绍一下有关GCC的内容。
因为,Dev-Cpp所使用的Mingw32是一款GCC编译器。
所以,对GCC的了解有助于使用Dev-Cpp。
gcc.exe这是一个C语言的编译器,负责编译C语言。
这个也许大家都知道。
不过,在这里我要先向大家说明一下。
gcc只是一个C语言的编译器。
不能识别C++代码。
所以,以前所说的gcc可以编写C++是一个误传。
因为,我们通常所说的GCC不是gcc.exe而是GCC的一套程序。
其中就包括可以编译C++语言的g++.exe如果,你不确定这个gcc的版本,可以用如下的命令查看。
gcc -v关于编译,gcc可以通过命令符编译。
gcc source.c -o binary以上的命令,是让gcc直接由.c代码编译成可执行代码。
也可以这样。
gcc -c source.c -o code.ogcc code.o -o binary这样就生成了一组二进制代码,然后在通过二进制代码生成可执行程序。
g++.exe刚才已经说过了,这个是一个用于编译C++代码的程序。
基本用法和gcc一样。
所以这里不再介绍了。
只是让各位了解一下,这个程序是编译C++代码的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Win32控制台程序界面类我相信不少同学也和我一样,在刚学习c++的时候都会尝试做简单的图书管理系统,学生成绩管理系统等,做这些实验项目可以加深你对文件操作,vector,list等容器的熟悉度,还可以让你学会设计系统结构。
随着学习的逐渐深入,同学们也许会发现,很多时候我们只要调用标准库函数里的类,代码量就会少很多,如果我们在平时的练习里有意识地去封装一些也许会比较常用的类,那么是不是我们平时编程的效率也会快好多呢。
答案是肯定的,特别对于XXXX系统之类的程序来说,可供应的地方就更多了,要重复使用这些我们自己封装好的类,只要将我们做好的类的.h和.cpp文件与我们做好想做的程序的代码放在同一个文件夹里就好。
下面我就将我在做好的界面类与大家分享,由于时间仓促,所做的类的调用方法也比较少,接下来的时间里,我会继续扩充该类的方法,以便适应未来工作学习的需要,同时也方便大家头文件:windesign.h//划线类(专供windowDesigner.h使用)wndowDesigner.h//画界面类其他要包含的cpp文件questionwin.cppwindesign.cppwindowDesigner.cppwindesign.h的方法:winDesign& leftSide(int,char);//首行缩进winDesign& leftSidec(int,char,char);//首行缩进做加左边框winDesign& Sidesc(int,char);//边框左winDesign& SidescR(int,int,char);//边框右winDesign& SidescL(int,int,char);//边框左2winDesign& centre(int,int,char,string);//中部内容winDesign& centre(int ,char );//中部标题,上下部边框(绘制一行的内容需要用到其中的几个方法)windowDesigner.h的方法:void mainwin(string sentence[],int n,int s);//画主界面//各行内容,选项数,缩进(选项数要大于sentence[]的元素数)void questionwin(string sentence[],int n,int s);//对话框//各行内容,选项数,缩进void needinput(string sentence[],string input[],int n,int s);//需要输入的界面//各文件源代码:windesign.h文件#ifndef WINDESIGN_H#define WINDESIGN_H#include<string>using std::string;#include<iomanip>using std::setfill;using std::setw;class winDesign{public:winDesign& leftSide(int,char);//首行缩进winDesign& leftSidec(int,char,char);//首行缩进做加左边框winDesign& Sidesc(int,char);//边框左winDesign& SidescR(int,int,char);//边框右winDesign& SidescL(int,int,char);//边框左2winDesign& centre(int,int,char,string);//中部内容winDesign& centre(int ,char );//中部标题,上下部边框};#endifwndowDesigner.h文件#ifndef WINDOWDESIGNER_H#define WINDOWDESIGNER_H#include"windesign.h"#include<string>using std::string;class windowDesigner{public:windowDesigner(winDesign){};//实验品(组成)void mainwin(string sentence[],int n,int s);//画主界面//各行内容,选项数,缩进void questionwin(string sentence[],int n,int s);//对话框//各行内容,选项数,缩进void needinput(string sentence[],string input[],int n,int s);//需要输入的界面// private:winDesign Line;};#endifquestionwin.cpp#include<iostream>using std::cout;using std::cin;using std::endl;#include<iomanip>using std::setfill;using std::setw;#include"windowDesigner.h"void windowDesigner::questionwin(string sentence[],int n,int s){int a=1;//边框粗细int h1=25;//整体缩进(数值越大越靠右)int k1=30;//窗口宽度(数值越大越靠下)int i;int n1=10;for(i=0;i<n1;i++){cout<<endl;}Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,'=').SidescL(a,a,'=');//上边cout<<endl;Line.leftSide(h1,' ').SidescR(a,a,'=').centre(7,k1,' ',sentence[0]).SidescL(a,a,'=');cout<<endl;//标题Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,' ').SidescL(a,a,'=');cout<<endl;for(i=1;i<n;i++)//选项{Line.leftSide(h1,' ').SidescR(a,a,'=').centre(s,k1,' ',sentence[i]).SidescL(a,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,' ').SidescL(a,a,'=');cout<<endl;}if(i<n-1){cout<<endl;}//(如果没有这句话,最后一个选项会有写不协调) Line.leftSide(h1,' ').SidescR(a,a,'=').centre(k1,'=').SidescL(a,a,'=');//底边cout<<endl;}windesign.cpp#include<iostream>using std::cout;using std::endl;#include"windesign.h"winDesign &winDesign::leftSide(int n1,char s3){cout<<setfill(s3)<<setw(n1)<<s3;return *this;}winDesign& winDesign::leftSidec(int n1,char s3,char s4){cout<<setfill(s3)<<setw(n1)<<s4;return*this;}//首行缩进做加左边框winDesign &winDesign::Sidesc(int n2,char a1){cout<<setfill(a1)<<setw(n2)<<a1;return *this;}winDesign &winDesign::centre(int n4,int n3,char s2,string str1) {int i;i=str1.length();cout<<setfill(s2)<<setw(n4)<<s2;cout<<str1;cout<<setfill(s2)<<setw(n3-n4-i)<<s2;return *this;}winDesign &winDesign::centre(int n3,char s2){cout<<setfill(s2)<<setw(n3)<<s2;return *this;}winDesign &winDesign::SidescR(int n2,int n21,char s1){cout<<setfill(' ')<<setw(n2-n21)<<' ';cout<<setfill(s1)<<setw(n21)<<s1;return *this;}winDesign &winDesign::SidescL(int n2,int n21,char s1) {cout<<setfill(s1)<<setw(n21)<<s1;cout<<setfill(' ')<<setw(n2-n21)<<' ';return *this;}windowDesigner.cpp文件#include<iostream>using std::cout;using std::cin;using std::endl;#include<iomanip>using std::setfill;using std::setw;#include"windowDesigner.h"void windowDesigner::mainwin(string sentence[],int n,int s){int h1=12;/*缩进*/const int n1=2;//头两行列数int h2=7,h3=45,h4=4;//头两行int y[4]={8,7,39,9};//第三行标题int k[3]={7,36,13};//const int n2=5,n3=8;int m2=8,m3=40,m4=8;//选项行间隔int mouth2=8,mouth3=10,mouth4=36,mouth5=12;//(窗口装饰)嘴int empty2=4,empty3=45,empty4=7;//空行int legL=4;//腿长=legL-1;int leg2=25,leg3=6,leg4=25;//腿行int a=1;//边框粗细int i;for(i=0;i<n1;i++)//绘制头顶部边框,行数n1=2{Line.leftSide(h1,' ').Sidesc(h2,'=').centre(h3,'=').Sidesc(h4,'=');cout<<endl;}Line.leftSide(h1,' ').Sidesc(y[0],'=').centre(y[1],y[2],'=',sentence[0]).Sidesc(y[3],'=');cout<<endl;//标题Line.leftSide(h1,' ').SidescL(8,n2-i+4,'=').centre(40,' ').SidescR(8,n2-i+4,'=');cout<<endl;//空白行for(i=1;i<n;i++)//选项{Line.leftSide(h1,' ').SidescL(k[0],a,'=').centre(s,k[1],' ',sentence[i]).SidescR(k[2],a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(5,a,'=').centre(45,' ').SidescR(6,a,'=');cout<<endl;}if(i<n-1){cout<<endl;}//(如果没有这句话,最后一个选项会有写不协调)for(i=0;i<n1;i++){Line.leftSide(h1,' ').SidescL(empty2,a,'=').centre(empty3,' ').SidescR(empty4,a,'=');cout<<endl;}Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,'',"*********************").SidescR(mouth5,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,' ',"**").SidescR(mouth5,a,'=');cout<<endl;Line.leftSide(h1,' ').SidescL(mouth2,a,'=').centre(mouth3,mouth4,' ',"**").SidescR(mouth5,a,'=');cout<<endl;for(i=0;i<n1;i++){Line.leftSide(h1,' ').Sidesc(h2,'=').centre(h3,'=').Sidesc(h4,'=');cout<<endl;}for(i=1;i<legL;i++){Line.leftSide(h1,' ').SidescL(leg2,leg2-2*i,'=').centre(leg3,' ').SidescR(leg4,leg4-2*i,'=');cout<<endl;}cout<<endl;}。